using OpenTK.Mathematics;
namespace Yw.WinFrmUI.Hydro
{
///
/// 包围盒辅助类
///
internal class BoundingBox3Helper
{
///
/// 计算圆点包围盒
///
/// 圆点
/// 半径
///
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);
}
///
/// 计算圆柱体的轴对齐包围盒(AABB)
///
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));
}
}
}