在一系列圆柱体/圆锥体上找到两点之间的最短连接并找到连接上的特定点的算法

Algorithm to find the shortest connection between two points on a series of cylinder/cone segements & find a specific point on the connection

提问人:user3384674 提问时间:6/18/2023 更新时间:6/19/2023 访问量:130

问:

我有一系列圆柱形段和圆形锥形段(锥形视锥体)。圆柱体和圆锥段的中心轴与 Z 轴相同。给出了所有线段尺寸(半径、高度、z 轴上的位置)。

enter image description here

此外,给出了两个点 P1(x1,y1,z1)P2(x2,y2,z2)。这些点位于不同圆柱体/圆锥段的表面上。

让我们用字母 C 命名一系列圆柱体/圆锥段表面上的曲线,它是两点 P1P2 之间的最短连接。

还给出了长度 LL 总是小于曲线 C 的总长度。

我正在寻找一种算法来计算位于 C、距离 P1 L 的新点 V 的 (x,y,z) 坐标,即 P1 V 之间的曲线长度应该是 L

我的计划是首先计算 C 从一个圆柱体/圆锥段到下一个圆柱体/圆锥体段的交叉点。然后,我将获得每个圆柱体/圆锥体段中的单独曲线及其长度。然后,我可以找出 V 位于哪个圆柱体/圆锥段中,并计算 V(x,y,z) 坐标。

问题是我如何找到过境点?

(还是我的计划不理想,太复杂了?有没有更简单、更优雅的整体方法?

我将不胜感激对这个问题的任何指导。

算法 数学 3D 计算几何

评论

0赞 Simon Goater 6/18/2023
您可以将圆柱体视为圆锥体的特例,因此您需要一个公式来描述任意圆锥体表面上两点之间的最短路径。然后你可以做一些梯度下降算法来找到“交叉点”的最佳位置。math.stackexchange.com/questions/140636/......
0赞 user3384674 6/18/2023
谢谢。我已经知道关于 math.stackexchange.com 的文章。很有帮助。然而,问题是如何找到“交叉点”。您能否更详细地解释一下“一些梯度下降算法以找到'交叉点'的最佳位置”是什么意思。谢谢。
0赞 Simon Goater 6/18/2023
如果将每个交叉点定义为 X_i = (r_i, theta_i, z_i),则已知r_i和z_i,则只需theta_i。 定义 n 个交叉点的距离函数 D(theta_1, ..., ,theta_n),然后计算梯度下降的 GradD(theta_1, ..., ,theta_n)。en.wikipedia.org/wiki/Gradient_descent
0赞 Stef 6/18/2023
1) 给定三个交叉点的位置(可能由给出它们在圆上位置的角度来参数化),得到从 P1 到 P2 通过这三个交叉点的最短路径的公式。2)一旦你有了这个公式,你“只需要”找到三个参数的值来最小化它。梯度下降可能有点矫枉过正,通过分析函数,你大概可以得到三个明确的公式。如果你不能得到明确的公式,那么梯度下降是可能的。或者使用 scipy.optimize 或其他东西。
0赞 Stef 6/18/2023
3)现在你已经弄清楚了三个交叉点的位置。计算从P1到第一个交叉点的距离d1,d2从第一个交叉点到第二个交叉点的距离,以此类推。 4)求L是在[0,d1]还是[d1,d1+d2]或[d1+d2,d1+d2+d3]还是[d1+d2+d3,d1+d2+d3+d4]。5)得到第五点的公式。

答:

-1赞 Ali Ali 6/19/2023 #1

我有这样的想法。

此问题与 3D 几何图形有关。 更详细,平面和圆锥体、圆柱体的交点。 Z 轴上的最后一个点是 Q(0,0,h)。 Z轴上的中点为M(0,0,h/2)

计算具有 P1、P2 和 M 等 3 个点的平面的函数。 计算圆锥体和圆柱体的每个边的交点。

该交点是 C 系列,交点是从 P1 到 P2 的最短路径。

在给定条件下,可以计算平面、圆锥和圆柱体的函数。

评论

0赞 user3384674 6/19/2023
谢谢。我不太明白 Q 和 M 所在的“h”分别是什么。你能解释一下吗?
0赞 user3384674 6/19/2023
我不明白为什么圆柱体/圆锥边缘圆与平面通过 P1、P2、M 的交点给出了我正在寻找的交叉点。你能解释一下吗?谢谢。
0赞 Spektre 6/19/2023 #2

我的直觉告诉我曲线将位于平面上(与线位于平面上相同),因此:CP1,P2

  1. 找到飞机

    where lies where 是(无限)线上的点 穿过中心轴 (z) 的 S 点 所以:P1,P2,P3P3'P1,P2y=0x=0

    P3 = vec3(0,0,P3'.z)
    

    平面可以由点(任意自)和法线定义:P1,P2,P3N

    N = cross(P2-P1,P3-P2)
    
  2. 对于每个圆锥边(圆),计算与平面 Vc[] 的交点

    仅使用靠近线的点,这应该为您提供交叉点。P1,P2Vc[]

  3. 计算每个交叉点的 C 长度 lc[]

    它只是将线段长度相加。

  4. 线性或二进制搜索 lc[] 选择所需 V 所在的 segmen

    对于少量段,使用线性,对于许多段,使用二叉搜索。只需找到以下位置:i

    (lc[i]<=l) AND (lc[i+1]>=l)
    
  5. 线性插值你的 V

    V0 = Vc[i]
    V1 = Vc[i+1]
    l0 = lc[i]
    l1 = lc[i+1]
    l  = wanted length
    V = V0+(V1-V0)*(l-l0)/(l1-l0)
    

评论

0赞 user3384674 6/19/2023
谢谢。我不确定我是否正确理解了你的答案。您是否将 C 视为一系列线段?事实并非如此。C 是位于圆柱体表面或圆锥体表面的一系列曲线。这些不是直线段。
0赞 Ali Ali 6/19/2023
h 是这个物体的高度。
0赞 Spektre 6/19/2023
@AliAli,如果你从“平面内部”看,它们(投影为)线,但你是正确的弧长计算,你需要对长度进行积分,而不是使用简单的线长