using OpenTK.Mathematics;
|
|
namespace Yw.WinFrmUI.Hydro
|
{
|
/// <summary>
|
/// 包围盒辅助类
|
/// </summary>
|
internal class BoundingBox3Helper
|
{
|
|
/// <summary>
|
/// 计算圆点包围盒
|
/// </summary>
|
/// <param name="pt">圆点</param>
|
/// <param name="radius">半径</param>
|
/// <returns></returns>
|
public static BoundingBox3 CalcuPointBoundingBox(Vector3 pt, float radius)
|
{
|
var min = pt - new Vector3(radius);
|
var max = pt + new Vector3(radius);
|
return new BoundingBox3(min, max);
|
}
|
|
/// <summary>
|
/// 计算圆柱体的轴对齐包围盒(AABB)
|
/// </summary>
|
public static BoundingBox3 CalcuLineBoundingBox(Vector3 start, Vector3 end, float width)
|
{
|
var radius = width / 2f;
|
Vector3 dir = (end - start).Normalized();
|
float dirX = dir.X, dirY = dir.Y, dirZ = dir.Z;
|
|
// 计算各轴的端点和扩展量
|
float minX = Math.Min(start.X, end.X);
|
float maxX = Math.Max(start.X, end.X);
|
float extensionX = radius * (float)MathF.Sqrt(1f - dirX * dirX);
|
minX -= extensionX;
|
maxX += extensionX;
|
|
float minY = Math.Min(start.Y, end.Y);
|
float maxY = Math.Max(start.Y, end.Y);
|
float extensionY = radius * (float)MathF.Sqrt(1f - dirY * dirY);
|
minY -= extensionY;
|
maxY += extensionY;
|
|
float minZ = Math.Min(start.Z, end.Z);
|
float maxZ = Math.Max(start.Z, end.Z);
|
float extensionZ = radius * (float)MathF.Sqrt(1f - dirZ * dirZ);
|
minZ -= extensionZ;
|
maxZ += extensionZ;
|
|
return new BoundingBox3(new Vector3(minX, minY, minZ), new Vector3(maxX, maxY, maxZ));
|
}
|
|
}
|
}
|