<P></P> 呵呵,受教了,不过呢,还是可以用长度来比较,只要将偏移后的产生的一个或是多个新物体的总长之和比较一下还是可以的。 一个判断顺时针\逆时针的程序,,,没有进行理论论证,也没有经过大量的实践证明,只是根据自己的想法,进行过少量奇特图形的测试,,,欢迎找出问题,或提供判断错误的图形
如果是一个凸多边形,可以将step设小一些以增加速度,,,如果是一些复杂的图形,可以将step设置大些以保证正确,,,
(defun GEO_CCW (p0 p1 p2 / dx1 dx2 dy1 dy2)
(setq dx1 (- (car p1) (car p0))
dy1 (- (cadr p1) (cadr p0))
dx2 (- (car p2) (car p0))
dy2 (- (cadr p2) (cadr p0))
)
(cond
((> (* dx1 dy2) (* dy1 dx2)) 1)
((< (* dx1 dy2) (* dy1 dx2)) -1)
(t
(cond
((or (minusp (* dx1 dx2))
(minusp (* dy1 dy2))
) -1)
;; explicit distance
((>= (+ (* dx1 dx1) (* dy1 dy1)) (+ (* dx2 dx2) (* dy2 dy2))) 0)
(t 1)
);COND
);T
);COND
);DEFUN
(defun c:PlineCCW (/ pline step param nParam pt pt1 pt2 iCCWLST)
(setq pline (car (entsel "Select lwpline")))
(setq step 10)
(setq param (/ (vlax-curve-getEndParam pline) step))
(setq i 0)
(repeat (1- step)
(setq nParam (* i param))
(setq pt (vlax-curve-getPointAtParam pline nParam))
(setq pt1 (vlax-curve-getPointAtParam pline (+ (* (+ 1 (/ 0.5 step)) param) nParam)))
(setq pt2 (vlax-curve-getPointAtParam pline (+ (* (+ 1 (/ 1.0 step)) param) nParam)))
(setq CCWLST (append CCWLST (list (GEO_CCW pt pt1 pt2))))
(setq i (1+ i))
)
(setq CCWLST (vl-remove 0 CCWLST))
(if (> (length (vl-remove 1 CCWLST)) (length (vl-remove -1 CCWLST)))
(princ "\nPline is clockwise")
(princ "\nPline is counterclockwise")
)
(princ)
) ;end defun
<P></P>
<P>试试这个</P> <P>测试了没有问题,,,</P>
<P>虽然这个图形只有两个点,单从顶点上无法确定是顺时针还是逆时针,不过从对象信息中的凸度可以很明显判断是顺时针还是逆时针,,,我用程序判断过了,两种情况都正确...</P>
<P>如果你有不正确的,可以提供DWG文件</P> <P>上图,多义线设闭合后测试没有返回结果.</P>
<P>不设闭合有返回结果</P> <P>不能用面积判断吗?</P> 正确的方法应该是用面积判断, <P>还是建议用长度计算。原因同上。</P>
页:
1
[2]