2

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

这些行是在编译时随机创建的,可以从任何 (x, y) 位置开始和结束。 曲线示例

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

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

4

1 回答 1

1

为您的曲线构建一个 LUT(查找表),以便当用户单击它时,您可以将他们单击的 (x,y) 坐标解析为曲线的t值(当然,或者您称为控制变量的任何值)。与其根据几乎不可能的 (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) 坐标,因此您可以构建反向映射“for自由的”。如果您不控制绘制代码,那么您必须在创建曲线时运行自己的代码。

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

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

于 2013-06-09T14:32:50.527 回答