无痕 发表于 2006-4-17 22:25:00

<P>错!我没有说是向内偏移后。。。。。而是说“偏移后”</P>
<P></P>

ljpnb 发表于 2006-4-18 07:42:00

呵呵,受教了,不过呢,还是可以用长度来比较,只要将偏移后的产生的一个或是多个新物体的总长之和比较一下还是可以的。

meflying 发表于 2006-4-18 14:07:00

一个判断顺时针\逆时针的程序,,,没有进行理论论证,也没有经过大量的实践证明,只是根据自己的想法,进行过少量奇特图形的测试,,,欢迎找出问题,或提供判断错误的图形
如果是一个凸多边形,可以将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

狂刀无痕 发表于 2006-4-18 23:39:00

<P></P>
<P>试试这个</P>

meflying 发表于 2006-4-19 17:37:00

<P>测试了没有问题,,,</P>
<P>虽然这个图形只有两个点,单从顶点上无法确定是顺时针还是逆时针,不过从对象信息中的凸度可以很明显判断是顺时针还是逆时针,,,我用程序判断过了,两种情况都正确...</P>
<P>如果你有不正确的,可以提供DWG文件</P>

狂刀无痕 发表于 2006-4-19 23:15:00

<P>上图,多义线设闭合后测试没有返回结果.</P>
<P>不设闭合有返回结果</P>

lemonbox 发表于 2006-4-20 10:10:00

<P>不能用面积判断吗?</P>

mccad 发表于 2006-4-20 11:39:00

正确的方法应该是用面积判断,

无痕 发表于 2006-4-21 12:14:00

<P>还是建议用长度计算。原因同上。</P>
页: 1 [2]
查看完整版本: 如何对一组闭合pline进行集体向外偏移??