相对于贝塞尔曲线的一个点的位置

10

我有一个由4个点指定的贝塞尔曲线。我需要知道一个点在贝塞尔曲线的左侧还是右侧。你能给我建议一个算法吗?

编辑:我确定我生成贝塞尔曲线的方式不会形成循环。

后续编辑:我意识到我的初始问题可以在不使用相对位置的情况下解决。当我发表这个问题时,我认为有一个数学公式可以用于相对位置,就像检查点是否在圆的内部一样。看来这是不可能的。所以我会接受一个建议时间高效的解决方案的答案。


1
你可能需要更具体地说明你想要实现什么...例如,如果贝塞尔曲线形成一个循环,你期望得到什么样的答案? - jerryjvl
我想要让一个物体沿着贝塞尔曲线轨迹移动。如果它的当前位置在曲线的左侧,我会改变它的方向向右,反之亦然。 - Ionel Bratianu
请注意,贝塞尔曲线绝对可以形成循环...如果您相对于端点越过控制顶点,例如,将四个顶点按顺序排列为:(0, 0),(100, 100),(100, 0),(0, 100) 就可以实现。 - jerryjvl
我知道贝塞尔曲线可以形成循环,但在我的程序中,控制点的选择方式是这样的,不会出现循环。 - Ionel Bratianu
5个回答

5
您可以使用一个非常直接的算法(与k-细分和DeCastleju算法相关)来确定贝塞尔曲线上最近的点。如果需要具体信息,请查看图形宝石。在那一点,即使有循环,您也可以通过确定从最近点到测试点的向量是否在沿着贝塞尔曲线(速度?-不确定术语是否正确...)的向量的左侧或右侧来确定侧面性。 您可以通过两个向量的叉积来获得这一点。负数或正数将确定手性和您所在的线的哪一侧。当然,在循环中,侧面性将被定义为如果您开车沿着该线行驶,您在经过该点时是向右还是向左看出窗户...而不是您是否在整个贝塞尔曲线的右侧或左侧。因此,这取决于您如何定义“侧面性”。如果我的术语不正确,请原谅。我已经很久没有处理贝塞尔了。画张图片会更容易理解一些;)

我在《图形宝典》中找到了解决“曲线上最近点问题”的方法,该书作者是Philip J. Schneider。谢谢你告诉我这本书的存在。;;) - Ionel Bratianu

1

这里提供了关于三次和二次贝塞尔曲线内含化的数学资料。


1

如果你只是想让你的对象沿着曲线移动(正如你在评论中所说),为什么不使用参数方程来移动你的对象呢?参考这篇文章


0

我现在记不起来数学知识了,但你可能想使用细分算法来逐步细化曲线,直到线段足够“直”,以便您可以将它们视为线段,以满足您的需求。

通过使用曲线细化的边界多面体来确定您的“点”在所有多面体之外的位置,并立即转换为线段,您可能能够更快地得到答案。


0

假设点被限制在曲线上,您必须将其中一个锚点定义为起点,另一个锚点定义为终点,然后计算属于曲线且位于中间(长度的一半)的点...这样您就可以确定该点是在起点和中点之间还是在中点和终点之间。

这是您想要的吗?还是我完全迷失了方向?


从这个图片开始 http://www.moshplant.com/direct-or/bezier/curve01.gif,我想知道一个点是在曲线的左侧还是右侧。当然,有几种情况,其中一些情况没有右侧或左侧。但为了举例子,我只考虑图像中的曲线情况。 <b>jerryjvl</b> 的答案似乎已经足够好了,但我想知道那个算法的性能如何。或者是否有更好的算法。 抱歉表达不清 :( 英语不是我的母语 - Ionel Bratianu
我也不是!我是委内瑞拉人! - coma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接