Geometry 如何判断两个环(3d中的圆)是否链接

Geometry 如何判断两个环(3d中的圆)是否链接,geometry,Geometry,在3个空间中有两个环,每个环由法向量、中心坐标和半径表示。 如何确定环是否链接。即,一个圆上的一点位于另一个圆盘中 这将在一个紧密的循环中实现,因此我关心性能。我觉得应该有一个封闭形式的解决方案。到目前为止,我只想到了迭代解 有什么帮助吗?算法概述: 处理圆的平面平行或平行的情况 找出圆的平面的交线 找出圆与这条线的交点 所有与直线相交的圆都在两个平面上。我们现在可以进行距离检查,以查看圆是否链接 详情: 我假设圆C1和C2由中心点(p1,p2)、单位法向轴矢量(n1,n2)和半径(r1,r2)

在3个空间中有两个环,每个环由法向量、中心坐标和半径表示。 如何确定环是否链接。即,一个圆上的一点位于另一个圆盘中

这将在一个紧密的循环中实现,因此我关心性能。我觉得应该有一个封闭形式的解决方案。到目前为止,我只想到了迭代解


有什么帮助吗?

算法概述:

  • 处理圆的平面平行或平行的情况
  • 找出圆的平面的交线
  • 找出圆与这条线的交点
  • 所有与直线相交的圆都在两个平面上。我们现在可以进行距离检查,以查看圆是否链接
  • 详情:

    我假设圆C1和C2由中心点(p1,p2)、单位法向轴矢量(n1,n2)和半径(r1,r2)给出

    对于某些标量k,如果n1==kn2,则平面是平行的或并发的。如果它们是并发的,这就变成了一个普通的2d问题:检查dist(p1,p2) 否则,平面相交于线L。如果圆是链接的,则它们必须都相交于L,因为链接意味着它们相互穿过彼此的定义平面。这将为您提供第一个简单的拒绝测试

    L由点q和向量v给出。找到v很容易:它只是n1和n2的叉积。q有点棘手,但我们可以选择线的最近接近点

    l1(s) = p1 + s (v X n1)
    l2(t) = p2 + t (v X n2)
    
    这些线垂直于v、n1和n2,位于C1和C2的平面上。它们最近的接近点必须在L上

    您可以参考以了解如何找到最近的接近点

    P>最后,圆圈可以相交的唯一方式是如果它们在L上都有点,如果它们是,那么考虑C1和L的交点,因为它们与C2有关。如果C1和L有两个交点q11和q12,且正好其中一个在C2内,则这些圆是链接的。由于L位于C2平面上,因此这将成为圆内平面点测试:

    IF dist(p1, q11) < r1 THEN
        linked = (dist(p1, q12) > r1)
    ELSE
        linked = (dist(p1, q11) < r1)
    ENDIF
    
    如果dist(p1,q11)r1)
    其他的
    链接=(距离(p1,q11)

    当然,这段伪代码在处理圆实际相交的情况时有点草率,但如何处理这一点取决于您的应用程序。

    计算几何教科书可能有一个很好的解决方案

    但是我现在手头没有一本计算几何教科书。如果我现在打算根据自己(非常有限)的直觉来滚动我自己的,我想我应该从3d轴对齐的边界框开始

    e、 例如,创建“刚好在圆内”边界框,以及“刚好在圆外”边界框。我认为,找出两个轴对齐的框是否重叠是很简单的(我曾经做过的一个家庭作业的第2.1节谈到了二维场景中的一个相关问题——找到离点最近的矩形:)

    我怀疑以下断言会成立(但我可能错了):

    • 如果内盒重叠,则环肯定是连接的。(我现在认为这是错误的…)

    • 如果外部框没有重叠,那么它们肯定没有连接——我非常相信这个断言是正确的!:-):-)

    • 如果外框重叠,但内框不重叠,则它们可能已连接

    那是我开始的地方,如果我自己滚的话


    结论:嗯,我希望你在其他答案上有更好的运气。:-)

    一个相对容易编码的简单解决方案:计算两个平面的交线,并将所有东西(在我的例子中,定义两个圆的六个点)旋转和平移在一起,使该线成为Z轴(x=y=0)。然后,可以围绕Z单独旋转这些平面,使第一个圆C1位于XZ平面上,C2位于YZ平面上。现在中心和半径很容易找到(在我的情况下,我最初没有)。这些旋转不会更改“链接/无链接”特性,可以根据圆与Z轴的四个交点的顺序轻松确定链接或缺少链接。(如果任意一个圆不相交x=y=0,则没有链接。)(我可能混淆了轴,但我认为这会起作用。)
    谢谢。

    这是3D圆形磁盘相交的问题吗?或者,这是圆交点问题吗

    如果是前者,则有一种快速、封闭形式的算法。首先,去掉距离太远的圆圈:
    dist(CIR1.c,CIR2.c)>CIR1.r+CIR2.r

    处理边情况:共面圆


    将圆盘挤出到其平面中,然后使圆与该平面相交。如果有1个或2个交点,测试它们是否符合
    pointInDisk(p,CIR)
    逻辑。报告所有幸存的交叉点。

    Hmmm,可能很难从环表示中获得边界框,但是。。。现在我强烈怀疑,即使内部边界框重叠,环也有可能彼此遗漏。不,但是找到圆如何穿过各自平面的交点使这变得非常容易。如果它们是链接的,它们必须穿过这个交点。“一个圆上的一点位于另一个圆盘上”不足以得出环是链接的结论。例如,考虑两个(非链接的)指环等于大小。你可以把其中一个环的一面稍微穿过另一个环跨越的圆盘。但这些环仍然没有连接。作为另一个例子,两个大小不等的同心共面圆不相连;但是,较大的磁盘包含所有较小的磁盘。