我在3d空间中有两个2d圆圈(由中心,法线和半径定义)并且我试图想出一对点,这是一组最接近的点之一。我知道有从1到无限数量的点对,我只需要一对匹配。
有一种简单的方法吗?精度不是必不可少的。两个圆的半径相同,非零值。
如果背景有用,我的整体算法在空间中采用NURBS曲线并沿曲线挤出2d多边形,从而产生变形的圆柱体。我只是在曲线上采样几个点。每个圆的法线是NURBS曲线切线,我试图弄清楚如何对齐相邻的样本,所以我不会得到奇怪的扭曲。似乎相邻样品上的最近点应该对齐。
感谢此处的所有回复..项目的这一部分有点延迟,这就是我尚未测试所有答案的原因。我肯定会在这里折腾一些图像并在我再次开始研究时给出答案。
答案 0 :(得分:4)
你真正想要计算的是一对点,这些点可以最小化位于3个维度中2个不同圆上的点之间的距离。您应该使用的方法来找到确切的解决方案(如在几乎所有优化问题中),将距离表示为所有可能点的函数,并根据自变量获取其推导,并将结果表达式设置为0 。由于你有2个圆,你将有2个独立变量(即一个圆上的一个圆角和另一个圆上的一个圆角)。一旦解决了最小化方程式,您还可以在圆上找到满足约束条件的点。 (基本上你会在圆圈上找到你要寻找的那对点的角度。)
我发现paper在线(this site)严格按计算进行,但最终结果是求解8阶多项式方程。您可以尝试简化方程式,并提出满足您需求的不太精确的解决方案。
还有一个paper声称拥有更快的算法来查找3d中两个圆之间的距离;但是,我无法查看内容,因此无法判断它是否也为您提供满足该条件的点对。
更新:重新阅读你的问题,我看到即使你想要找到一个方法来找到三维中两个圆圈上最近的一对点,我想,你应该支付更多关注您尝试挤出2D多边形的NURBS曲线的属性。您提到曲线上给定点处的圆的方向由该点处的切向量指定。然而,3D曲线不仅仅是切向量; 正常(或曲率)向量指向给定点处曲线的曲率中心,然后有扭转矢量,它基本上指定了由切线和法向矢量给出的平面的曲线“提升”量。所有这些都定义了一个(所谓的)Frenet框架。您可以在Wikipedia article上了解更多相关信息。
我怀疑你可以通过连接每个位于底层3D曲线法线向量方向的连续圆点来达到你想要的效果。这样,只有当曲线实际扭曲时,即扭转矢量为非零且法线矢量也在改变方向时,您才会扭曲。在其他情况下,这应该满足您的实际需要。
你可能不需要在连续的圆上找到最近点的过度杀伤。
答案 1 :(得分:1)
哎呀,除非圆圈恰好位于同一平面或平行平面上,我认为唯一的方法就是找到圆上两点之间距离方程的最小值。
http://www.physicsforums.com/showthread.php?t=123168
该链接显示如何获取3D空间中每个圆的方程,然后最小化这些方程之间的距离公式。虽然不是很漂亮,但希望有人会想出更聪明的东西。
答案 2 :(得分:1)
对于你所描述的内容,只需选择第一个圆周边的一个点,就可以找到每个圆周边的点,该点最接近前一个圆所选择的点;这将完全约束多边形,没有扭曲,并且应该比一般情况更容易解决 - 只需找到包含第二个圆的平面上的点,该第二个圆最接近在第一个中选择的那个,并且与通过的线相交那个点和第二个圆圈的中心与第二个圆圈的周长。
然而,这可能不会像挤压圆柱体那样令人满意,因为尽可能保持多边形区域不变,并且这样做需要在相邻圆圈之间进行一些扭曲。
答案 3 :(得分:1)
我认为在两个最接近的点你可能仍会得到奇怪的扭曲...一个极端的例子:让我们假设两个圆都有R = 1。如果第一个圆的中心是O,它位于XY平面上,第二个圆的中心位于X = 1,Y = 0,Z = 0.01,它在X的生长方向上略微倾斜,最接近两个圆圈上的点肯定会得到你想要避免的“奇怪的扭曲”。因为如果第二个圆在X = 0,Y = 0,Z = 0.01并且同样倾斜,最近的点不会得到奇怪的扭曲,那么在某些时候语句“与两个圆上的两个最接近的点对齐”并且“看不到奇怪的扭曲”不再相互对应。
假设这可以在NURBS的约束内发生,这是另一个想法。在一开始,取NURBS曲线上的三个点 - 两个属于圆圈的中心,第三个精确地位于其中间。在三者之间画一架飞机。这架飞机将在4个点穿过两个圆圈。其中两个点将位于连接圆心的线的同一“侧” - 它们是您的对齐点。
对于下一个对齐点,您将获取“前一个圆”的对齐点,并在“前一个圆”的中心,此对齐点和“新圆”的中心之间绘制平面。从这里你可以得到基于与另一个圆的交点的“下一个对齐点”。
下一步 - “上一个圆圈”=“新圆圈”和“新圆圈” - 根据NURBS曲线显示您的下一个圆圈。
如果从圆心到所选对齐点的半径交叉,你知道你的图片看起来有点难看 - 这就是用“最近点”算法你会得到奇怪的扭曲的情况。
我认为与通过其中心的平面相交的圆上的点的坐标应该很容易计算(它是由两个平面的交点,一个圆和目标之间的线上的一个点飞机;在离中心的距离R处。)
我没有完全断言或否认上述内容的严格证据 - 但希望它有所帮助,而且我认为它应该足够快速地验证,与计算两个圆圈上的壁橱点相比...... (如果我的逻辑中存在任何缺陷,则非常欢迎评论中的更正。)
答案 4 :(得分:1)
另一个答案中提到的线程here给出了3D圆的参数化公式:P = R cos(t)u + R sin(t)nxu + c,其中u是来自圆心到圆周上的任何一点; R是半径; n是垂直于平面的单位向量,c是圆的中心,t是0到2pi,而nxu是指“n cross u”。以这种方式参数化一个圆,另一个用不同的参数进行参数化,比如s。然后,第一个圆上的每个点Pt将具有变量t中的坐标,并且第二个圆上的每个点Ps将具有变量s中的坐标。
以通常的方式在Ps和Pt之间写入距离函数d(s,t)(或者更好的是欧几里德距离的平方,这样当你得到导数时你就不必弄乱平方根)。两个变量的函数d的图形是s,t平面上2pi乘2pi方形的表面,并且它的最小值是你所追求的。您可以使用标准的微积分方法来确定它,例如:正如here所述。
答案 5 :(得分:0)
将圆圈延伸到平面(使用中心点和法线)。如果飞机是平行的,那么任何点都可以。如果平面不平行,则它们相交成一条线。通过垂直于线的圆的两个中心构造平面。两个圆在四个点上与这个新平面相交。这四个点是两个最近的点和圆圈上的两个最远点。
答案 6 :(得分:-1)
这不仅仅是构建圆/球体的两个中心之间的线并找到线和圆的交点吗?最接近的解是它(除非圆相交,否则答案取决于你想要如何解释这种情况)。