在3D空间中给出Circle和Circular-Arc类型的曲线,计算精确边界框(世界轴对齐)的好方法是什么?
编辑:找到了圈子的解决方案,仍然需要Arcs的帮助。
用于解决Circles BoundingBoxes的C#代码段:
public static BoundingBox CircleBBox(Circle circle)
{
Point3d O = circle.Center;
Vector3d N = circle.Normal;
double ax = Angle(N, new Vector3d(1,0,0));
double ay = Angle(N, new Vector3d(0,1,0));
double az = Angle(N, new Vector3d(0,0,1));
Vector3d R = new Vector3d(Math.Sin(ax), Math.Sin(ay), Math.Sin(az));
R *= circle.Radius;
return new BoundingBox(O - R, O + R);
}
private static double Angle(Vector3d A, Vector3d B)
{
double dP = A * B;
if (dP <= -1.0) { return Math.PI; }
if (dP >= +1.0) { return 0.0; }
return Math.Acos(dP);
}
答案 0 :(得分:4)
未指定的一件事是如何将该角度范围转换为空间中的点。所以我们从那里开始并假设角度0映射到 O + r *** X **,角度π/ 2映射到 O + r *** Y **,其中 O 是圆圈的中心 X =(x 1 ,x 2 ,x 3 ) 和 Y =(y 1 ,y 2 ,y 3 ) 是单位向量。
所以圆圈被函数扫除了
P (θ)= O + r cos(θ) X + r sin(θ)的ý强> 其中θ在闭区间[θ start ,θ end ]。
P 的衍生物是
P '(θ)= -r sin(θ) X + r cos(θ) Y
出于计算边界框的目的,我们对其中一个坐标达到极值的点感兴趣,因此其中一个坐标 P '的点为零。
设置-r sin(θ)x i + r cos(θ)y i = 0我们得到 tan(θ)= sin(θ)/ cos(θ)= y i / x i 。
所以我们在{1,2,3}寻找θ,其中θ= arctan(y i / x i )。
你必须注意arctan()范围的细节,并避免被零除,如果θ是一个解,那么θ±k *π也是如此,我将留下这些细节给你。
你所要做的就是在你的角度范围内找到与极值相对应的θ组,并计算圆上相应点的边界框,你就完成了。角度范围内可能没有极值,在这种情况下,您可以计算与θ start 和θ end 对应的点的边界框。事实上,您也可以使用这两个值来初始化θ的解决方案集,因此您不需要特殊情况。