Javascript 检查点位于样条曲线/贝塞尔曲线上的点之间

Javascript 检查点位于样条曲线/贝塞尔曲线上的点之间,javascript,algorithm,geometry,computational-geometry,bezier,Javascript,Algorithm,Geometry,Computational Geometry,Bezier,以下是我试图解决的问题。我有贝塞尔曲线,它包含3个点(x1,y1),(x2,y2),(x3,y3)(在二维平面上)。我想弄清楚的是,用户是否在贝塞尔曲线上单击了第四个点,单击点是否位于点1和2之间,或者是否位于点2和3之间。单击点仅在直线被直接单击时记录,因此它必须位于点1和2或点2和3之间 这些行是在编译时随机创建的,可以从任何(x,y)位置开始和结束。 构成直线的3组点是起点、曲线点和终点。这三个点是线路的控制点。然后从控制点创建直线对象。控制点在程序每次运行期间随机创建,使样条曲线每次都

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

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

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

对于这个问题,有什么具体的算法需要遵循吗。我用JavaScript编码,但是任何C++或类似java的伪代码都很好。感谢您的帮助。

为您的曲线构建一个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)坐标,因此可以“免费”构建反向映射。如果不控制绘制代码,则在创建曲线时必须运行自己的代码

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


(告诉你如何做的完整代码几乎超出了这个答案的范围,但我在一篇关于贝塞尔曲线的长篇文章中对此进行了解释,最终形成了基于三个点的真实曲线)

你是指二次贝塞尔曲线吗?
(x1,y1)、(x2,y2)、(x3,y3)
是控制点吗?或者已知位于曲线上的任意点?你说的“点1和点2之间”和“点2和点3之间”是什么意思?如果你的三个点形成一条真正的曲线,那么三角形{1,2,3}内的任何点都在1和2之间,以及2和3之间。你能更新你的帖子,更准确地解释你想要达到的目标吗?(理想情况下,添加一张图片以显示一个或多个点配置示例以及您希望在其中检测到的内容)您更新的帖子更加清晰,谢谢。您是否需要确定用户单击是否在曲线上,或者是否已知?这不是一条贝塞尔曲线,而是一条样条曲线。所有的点都在曲线上。我仍然不清楚查找表在这种情况下会有什么帮助,因为在每次运行时出现时,组成直线的点总是不同的,直线的形状也会不同。您需要提供有关曲线描述的更具体信息。它是由控制点定义的?一个LUT总是能解决你的问题,因为它与你的曲线有关。如果随机生成曲线,则会随曲线一起生成LUT。如果你对你的曲线有更准确的描述(如果是样条曲线,用什么样的插值函数构建)?请更新你的帖子,我(和其他人)可能会在我的回答中更具体。