螺旋中心轴角
helix central axis angle
我在 [x,y,z]
中有 N 个点,这种形状呈螺旋状。有没有可能找到这样一个螺旋的中心轴。这不是中轴为 global X, Y and Z axis
的规则螺旋线
当我绘制曲线时,曲线看起来与 global Z axis
成特定角度。
我的目的是了解中轴与 global z axis
?
的夹角
如果你的N点足够密集(或等距),切向量(连续点的差向量)将形成一个圆锥体,其中心轴方向与螺旋轴方向重合,其基面正交于该轴方向。将螺旋投影到该法平面将得到一个圆心在螺旋轴上的圆。
我不使用 Matlab,因为我厌恶它,但根据你的情节,我会这样处理这个问题:
取前1-2个螺丝,计算其BBOX
本次BBOX调用的中心点A
取最后1-2颗螺丝,计算其BBOX
本次BBOX调用的中心点B
计算螺旋估计
所以线 AB
应该非常靠近你的螺旋轴。现在只需找到它的平均或最大垂直距离,即您的半径。使用这些作为拟合的初始值并在它们周围搜索以最小化错误。
任何点 P
到 AB
的垂直距离可以用矢量数学计算如下:
U = B-A
V = P-A
W = (U.V)/|U|
D = V-W
dist = |D|
其中 (U.V)
是点积,|U|
是向量长度。
更准确地适合cylinder/helix
所以只需搜索初始 guess/estimate 以最小化点和拟合 cylinder/helix 表面的平均和/或最大距离。有关更多信息和示例,请参阅:
[备注]
- 如果您不知道如何 select 螺丝,那么将您的套装分成两半,一个用于 A,第二个用于 B ...
- 如果点密度恒定,您可以计算曲线长度(对线求和)、螺钉数(任何轴上的凸起)、螺旋高度(第一个点和最后一个点之间的距离),并从该推断半径为
curve_length = ~sqrt((2*pi*r*screw)^2 + AB_distance^2)
我假设:
螺旋上的点在数组 pos
中,第一维表示时间(或步长),第二维表示位置向量的 3 个分量;
时间变量存储在数组time
.
您可以计算切向量:
Tangent=diff(pos(:,1:3))./(diff(time));
然后取平均值:
meanTangent=mean(Tangent);
你有你的轴。
我在 [x,y,z]
中有 N 个点,这种形状呈螺旋状。有没有可能找到这样一个螺旋的中心轴。这不是中轴为 global X, Y and Z axis
当我绘制曲线时,曲线看起来与 global Z axis
成特定角度。
我的目的是了解中轴与 global z axis
?
如果你的N点足够密集(或等距),切向量(连续点的差向量)将形成一个圆锥体,其中心轴方向与螺旋轴方向重合,其基面正交于该轴方向。将螺旋投影到该法平面将得到一个圆心在螺旋轴上的圆。
我不使用 Matlab,因为我厌恶它,但根据你的情节,我会这样处理这个问题:
取前1-2个螺丝,计算其BBOX
本次BBOX调用的中心点
A
取最后1-2颗螺丝,计算其BBOX
本次BBOX调用的中心点
B
计算螺旋估计
所以线
AB
应该非常靠近你的螺旋轴。现在只需找到它的平均或最大垂直距离,即您的半径。使用这些作为拟合的初始值并在它们周围搜索以最小化错误。任何点
P
到AB
的垂直距离可以用矢量数学计算如下:U = B-A V = P-A W = (U.V)/|U| D = V-W dist = |D|
其中
(U.V)
是点积,|U|
是向量长度。更准确地适合cylinder/helix
所以只需搜索初始 guess/estimate 以最小化点和拟合 cylinder/helix 表面的平均和/或最大距离。有关更多信息和示例,请参阅:
[备注]
- 如果您不知道如何 select 螺丝,那么将您的套装分成两半,一个用于 A,第二个用于 B ...
- 如果点密度恒定,您可以计算曲线长度(对线求和)、螺钉数(任何轴上的凸起)、螺旋高度(第一个点和最后一个点之间的距离),并从该推断半径为
curve_length = ~sqrt((2*pi*r*screw)^2 + AB_distance^2)
我假设:
螺旋上的点在数组
pos
中,第一维表示时间(或步长),第二维表示位置向量的 3 个分量;时间变量存储在数组
time
.
您可以计算切向量:
Tangent=diff(pos(:,1:3))./(diff(time));
然后取平均值:
meanTangent=mean(Tangent);
你有你的轴。