求算法思路:如何判断指定的点最接近于贝塞尔曲线的第几段?

cuixiping 2010-07-01 02:01:11

如上图,ABC是一条贝塞尔曲线,A',B',B'',C'是控制点。这些点的坐标已知。
现在已知点D的坐标,且确定点D接近曲线(到曲线的最近距离小于某个临界值s)。
曲线有可能旋转,交叉。

求D点最接近于曲线的第几段?
(如果在AB段,返回1;如果在BC段,返回2;类推)

求给个思路,或者给个资料
...全文
135 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
donkey301 2010-07-06
根据四个点求出三次Bezier曲线的参数表示(X(t), Y(t))
D的坐标设为(Xd,Yd)
(X(t)-Xd)^2 + (Y(t)-Yd)^2 = s^2
求出t的值,看看有没有在[0,1]区间的,有则表示在这条曲线上,没有就不在。
回复
超级大笨狼 2010-07-04
贝塞尔曲线是由点和斜率来描述曲线的,那其实就可以根据点和斜率确定的直线分割的平面集合来判断属于那一段。
比如:AA,BB,CC这三条直线把平面分成了几块,你从D点引一个向X轴的抽象射线,就知道D点在线的哪一侧了。
回复
budweiser 2010-07-02
按3楼的方法不错 不过可以改进一下。

只有处于两个边缘的两端 取 2个端点和2个控制点构成四边形, 其余的段可以由与其相邻的 4个 控制点来构成四边形。 然后判断 点是否在某个四边形内 就可以的得知 是在贝塞尔曲线的第几段。


[Quote=引用 3 楼 cuixiping 的回复:]

每一段的2个端点和2个控制点构成一个四边形(如[AA'B'B],[BB''C'C]),感觉应该可以计算点和这些四边形的关系来判断,但是具体如何我还不清楚。
[/Quote]
回复
cuixiping 2010-07-02
是个复杂的问题。
回复
FancyMouse 2010-07-01
如果单单是判断一个点的话遍历所有段是避免不了的。如果有很多点需要判断的话先把每段曲线围在一个矩形框里然后丢进4叉树组织起来,对于一般情况的大量查询会改善一点。
当然还是有特殊数据能够搞挂这个的,比如D点不在某个矩形内(乃如果说D很接近某个矩形的话那这个一般不会发生),或者曲线十分特殊,原地来回摆动然后D正好在正中间之类。
回复
cuixiping 2010-07-01
每一段的2个端点和2个控制点构成一个四边形(如[AA'B'B],[BB''C'C]),感觉应该可以计算点和这些四边形的关系来判断,但是具体如何我还不清楚。
回复
cuixiping 2010-07-01
这个算法不好,计算量太大,特别是曲线很长的时候。
回复
FancyMouse 2010-07-01
不管是几阶的贝塞尔,每一段都可以写成参数方程的形式。把参数方程写出来然后把距离写成关于参数t的函数最后最优化这个函数就完了。
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告