给定3D空间中圆形和圆弧类型的曲线,计算精确边界框(世界轴对齐)的好方法是什么?
编辑:找到圆圈的解决方案,仍需要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);
}
Run Code Online (Sandbox Code Playgroud)
未指定的一件事是如何将角度范围转换为空间中的点。因此,我们从此处开始,并假设角度0映射到O + r *** X **,角度π/ 2映射到O + r *** Y **,其中O是圆的中心, X=(x 1,x 2,x 3)和 Y=(y 1,y 2,y 3)是单位矢量。
所以圆被功能扫了
P(θ)= Õ + R COS(θ)X + R SIN(θ)ÿ 其中θ是在闭区间[θ 开始,θ 端。
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}中的i为θ= arctan(y i / x i)。
您必须注意arctan()范围的详细信息,并避免被零除,并且如果θ是一个解,那么θ±k *π也是,我将把这些细节留给您。
您要做的就是找到与您的角度范围内的极值相对应的一组θ,然后计算圆上其对应点的边界框,然后完成。这有可能是有在角度范围内没有极值,在这种情况下,你运算与θ点的边框开始和θ 结束。实际上,您也可以使用这两个值初始化θ的解集,因此不必特殊使用它。
| 归档时间: |
|
| 查看次数: |
1736 次 |
| 最近记录: |