检查点在样条/贝塞尔曲线上的点之间

时间:2013-06-08 03:30:36

标签: javascript algorithm geometry computational-geometry bezier

这是我想要解决的问题。我有bezier曲线,包含3个点(x1,y1),(x2,y2),(x3,y3)(在二维平面中)。我想弄清楚的是,如果用户在贝塞尔曲线上点击了第四个点是点击点位于点1和点2之间还是点位于点2和点3之间。点击点仅在线是直接点击,因此它必须位于第1点和第2点或第2点和第3点之间。

这些行在编译时随机创建,可以从任何(x,y)位置开始和结束。 example of a curve

构成该线的3组点是起点,曲线点和终点。这三点是该线的控制点。然后从控制点创建线对象。控制点在程序的每次运行期间随机创建,每次都使样条曲线不同。

此问题是否应遵循任何特定算法。我在javascript中编码,但任何c ++或java之类的伪代码都可以。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

为曲线构建LUT(查找表),以便当用户点击它时,您可以解析他们点击曲线的 t 值的(x,y)坐标(或者其他)你当然叫你的控制变量)。而不是基于(x,y)坐标进行评估,这实际上是不可能的,将所有四个坐标解析为 t 值,它变得非常简单:

当(x1,y1)为t = 0,(x2,y2)为t = T且(x3,y3)为t = 1时,如果用户点击曲线上的任意位置,我们得到一个新的 t 值。如果该值小于T,则该点位于点1和点2之间,如果它大于T,则它位于点2和点3之间。

构建查找表应该是每条曲线的一次性操作,在第一次绘制曲线时运行,因为那时你已经将 t 值映射到(x,y)坐标,所以你可以“免费”构建反向映射。如果你不控制绘图代码,那么你必须在创建曲线时运行自己的代码。

这有一个问题:你在这里给出的曲线,由三个曲线上的点定义,不是定义贝塞尔曲线的常用方法。对于Bezier曲线,控制点定义曲线“hull”;对于二次曲线(有三个点),这意味着点1和3在曲线上,但点2非常不是。要根据这三个点(即通过这三个点的曲线)找到真正的贝塞尔曲线,您需要运行将三个点转换为真曲线的算法。

(完整的代码告诉你如何做到这一点远远超出了这个答案的范围,但我在一篇关于贝塞尔曲线的长篇文章中解释它,最终在http://pomax.github.io/bezierinfo/#pointcurves基于三点形成真实曲线)