- 积分
- 600
- 明经币
- 个
- 注册时间
- 2007-6-19
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2012-10-10 11:32:50
|
显示全部楼层
本帖最后由 miraclelll 于 2012-10-10 11:34 编辑
楼主, 我采用如下方法,可以解决这个问题, 且测试下来, 效率也是可以的~
解决方法: 对于多边形自交的定义是: 不相邻的线段有交点, 即为自交. 故此, 我采用对多边形的组成线段之间求交点的方式来判断.
编程思路:
1 将多边形en 的节点组成一个表 ptlist, 首尾点重合(按先后顺序), 如: (pt1,pt2,pt3,...... ptn)
2 每两相邻点设定为 此多边形的 组成线段.
3 对ptlist中的点进行循环,从 第一个点pt1开始, 至pt(n-1) 为止
取出其中的一点pt(i) 做为 线段L 的起点 pt1, pt(i+1)为终点pt2
再取 pt(i+2) 为 对比判断线段M 的起点 pt3, pt(i+3) 为终点pt4
然后 求L与M的交点, 如果有交点,则可判定 此多边形为自交
4 其中, 线段M 需要循环取, 但是注意不要和线段L 相邻
程序代码如下: - (defun selfint (en /
- ptlist x n i j pt1 pt2 pt3 pt4 rtn pt_inter
- )
- (setq rtn nil pt_inter nil)
- ;;; 点坐标串ptlist;
- (setq ptlist (mapcar 'cdr
- (vl-remove-if-not
- '(lambda (x) (= 10 (car x)))
- (entget en))
- )
- )
- ;; 首尾坐标不重合的,需要增加;;;
- (if (not (equal
- (nth 0 ptlist)
- (nth (1- (length ptlist)) ptlist)
- ))
- (setq ptlist (append ptlist (list (nth 0 ptlist))))
- )
- (setq n (length ptlist))
- (setq i 0
- j (+ i 2)
- )
- ;;; 开始判断;
- (while (and (<= i (- n 4)) (= rtn nil))
- ;;; 线段L 的起始点;;
- (setq pt1 (nth i ptlist)
- pt2 (nth (1+ i) ptlist)
- )
- ;;; 下面是循环取 线段M的起始点;
- (while (and (<= j (- n 2)) (= rtn nil))
- (setq pt3 (nth j ptlist)
- pt4 (nth (1+ j) ptlist)
- )
- (if (not (and (= i 0) (= j (- n 2)))) ;; 对于第一个线段L,与最后一个线段属于相邻,故需要排除;
- (if (setq pt_inter (inters pt1 pt2 pt3 pt4));;; 判断L与M 是否相交;
- (setq rtn T)
- )
- )
- (setq j (1+ j))
- )
- (setq i (1+ i)
- j (+ i 2)
- )
- )
- (list rtn pt_inter)
- )
|
|