关于任意曲线求是否存在自相交的问题处理方法

bluesuncom 2005-03-02 03:01:35
现在有一由线段和圆弧组成的某曲线,需要判断该曲线是否存在自相交现象。
如果取第一条线段或者圆弧,然后依次跟后面的线段或者圆弧进行相交判断,接着再取第二条线段或者圆弧与后面的线段或圆弧进行相交判断,这样依次进行下去,最后是可以得出结果的。但是如果线段数量很大的话,运算时间会比较长。
这里向各位大人求助,是否有较好的办法来处理这个问题,感激!
...全文
1152 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluesuncom 2005-03-10
  • 打赏
  • 举报
回复
多谢楼上的几位了,但是我要解决的问题里面包括有圆弧,并非单纯的只有线段。所以上面的一些思路在处理圆弧方面好像作用就不大了吧?
寻开心 2005-03-10
  • 打赏
  • 举报
回复
包围盒完全可以根据
圆弧的两个端点,
垂直或者水平方向最大直径上的点
来计算出来

自己画一个圆,分割出一些片断,对照看一下就知道了
主要是判断圆弧是否跨越了象限,如果是在4个象限的内部,包围盒就可以由两个端点来决定
跨越了象限,就需要那四个特殊的极值点配合来确定了
bluesuncom 2005-03-10
  • 打赏
  • 举报
回复
知道圆弧的半径,圆心坐标,起点,终点坐标,方向。
寻开心 2005-03-10
  • 打赏
  • 举报
回复
圆弧的包围盒要特殊计算一下,也不难的
主要看你的圆弧是如何绘制出来的了
如果用arc这样的函数,是知道半径和开始和结束角度的,是可以精确度计算的
bluesuncom 2005-03-10
  • 打赏
  • 举报
回复
包围盒的计算量也不小吧?
寻开心 2005-03-10
  • 打赏
  • 举报
回复
同样有效,对圆弧计算出包围盒,同样可以进行排序的
寻开心 2005-03-09
  • 打赏
  • 举报
回复
对端点进行排序是周陪德,卢开澄《计算几何》上面推荐的办法
它是需要额外的空间和工作量,但是一旦建立起来,它的工作效率确实也是非常高的
通过这个排序的端点可以快速的定位可能相交的线段的数量,在这个小范围内再进行实际的测试效率自然会提高。
是否采用这个方法,要看实际的需要,没有绝对有效的算法,都是有适用条件的


gamedragon 2005-03-09
  • 打赏
  • 举报
回复
虽然排好序后检测比较简单,但是排序就是一项比较耗时的工程了,除非这段曲线是不断变化的,否则有排序的时间,相交也就能检测出来了。
zzwu 2005-03-08
  • 打赏
  • 举报
回复
我以前遇到过类似的事情.我采用的方法是对所有直线按2个端点坐标的大小排序,且包括x,y.
然后可以利用这样一些事实来减少求交判别:

----b---- -----------
-----b----- =====a=====
---b---- ----b--- --------

如果一个线段a的左端大于另一些线段b的右端点,则a就一定不会和这些b相交了;
类似地可对y坐标进行检测,
从而可以排除大量线段的求交检测.
bluesuncom 2005-03-07
  • 打赏
  • 举报
回复
呵呵,多谢楼上的各位。还有没有别的方法呢?
gamedragon 2005-03-04
  • 打赏
  • 举报
回复
感觉上应该用递归,把曲线分成两部分,检查是否有可能相交(判断bounding box),如有可能再继续细分判断。
没仔细想,但是觉得思路应该是这样吧。
寻开心 2005-03-03
  • 打赏
  • 举报
回复
原来的检测次数是 0。5×N×N次相交计算
临时想一个: 分区判断
比如你有10000个线段在00 到100 100这个区间内的
分成10×10的方格区域,平均每个区域内有100个线段
分配的计算量比较小,就是一个区域相交的判断O(n)量级的

把这些线段和分配到区域内,你只检查同区域内的线段是否两两相交即可
那么你的比较次数是100个区域,每个区域内的100个线段的相互检测计算量是100*50
整个线段相交比较次数就是 100×100×50 = 10000 * 50

原来的计算量是 10000*5000

都是直线好办,含有曲线就难一些了
bluesuncom 2005-03-03
  • 打赏
  • 举报
回复
大家说说思路,一起讨论一下阿。
寻开心 2005-03-03
  • 打赏
  • 举报
回复
线段跨越多个区不是问题, 一个线段属于多个区也是可以的,计算量增加一些呗,不影响大局的

破坏原来的结构是不必
只是产生了附加结构而已,建立一个桶结构,每个链表记录一个分区内所有线段的引用(指针)
bluesuncom 2005-03-03
  • 打赏
  • 举报
回复
呵呵,楼上的想法不错,但是存在一些问题。首先即使全都是线段,假设这些线段使用链表的形式存储,分成十个区后,重新组织这些线段的工作量也不小啊,假如某个线段跨越多个区,就更复杂了,不是么?还有采用这种分区的方法,就破坏了原来的存储结构,还需要进行额外的还原工作,总体计算量,个人觉得不一定小哦。一家之言,呵呵。

4,497

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧