Lisphk 发表于 2016-8-14 17:37:57

判断顺逆时针的代码


;计算PT1-PT2的测量方位角
(defun zfwj(pt1 pt2 / ang1)
(setq ang1 (angle pt1 pt2))
(cond
    ((<= ang1 (* 0.5 pi))
   (- (* 0.5 pi) ang1 )
   )
    (t
   (- (* 2.5 pi) ang1)
   )
    )
)

;判断点序列是顺时针还是逆时针
;1为顺时针,0为逆时针
;搜索最西面的点,比较其与相邻两点的方位,判断是顺时针还是逆时针
;暂未考虑重复点、回头线2010.09.28
(defun pdc (l1 / i j x pt1 pt2 pt3 pt4 ang1 ang2)
(setq j 0
        i 0
        x (car (nth 0 l1)))
(repeat (1- (length l1))
    (if (< (car (nth (1+ j) l1)) x)
      (setq i (1+ j)
          x (car (nth (1+ j) l1)))
      )
    (setq j (1+ j))
    )

;第i点为最西侧的点
(cond
        ((= i 0)
       (setq pt1 (last l1)
             pt2 (nth 0 l1)
             pt3 (nth 1 l1))
       )
        ((= i (1- (length l1)))
       (setq pt1 (nth (1- i) l1)
             pt2 (nth i l1)
             pt3 (car l1))
       )
        (t
       (setq pt1 (nth (1- i) l1)
             pt2 (nth i l1)
             pt3 (nth (1+ i) l1))
       )
        )

(setq ang1 (zfwj pt2 pt1)
        ang2 (zfwj pt2 pt3))

(if (< ang1 ang2)
    (progn
      (alert "逆时针!")
      0)
    (progn
      (alert "顺时针!")
      1)
    )
;(princ "\n")
;(princ (itoa i))
)


;主程序
(defun c:pdsn ( / s1fbt1 t2 lptn lplt lpli)
                                        ;选择一个范围线
(setq        s1(entget (car (entsel)))
        lpl nil
)

                                        ;检测是否是多段线
(if (/= (cdr (assoc 0 s1)) "LWPOLYLINE")
    (progn
      (alert "请选择一条多段线!")
      (exit)
    )
)

                                        ;检测多段线是否封闭
(setq fb (cdr (assoc 70 s1)))
(while (> fb 1)
    (setq fb (- fb 2))
)
(if (= fb 0)
    (progn
      (alert "多段线不封闭!")
      (exit)
    )
)

                                        ;取多段线各顶点
                                        ;检测多段线是否含圆弧
(setq lptn (cdr (assoc 90 s1)))
(while (assoc 10 s1)
    (setq t1(assoc 10 s1)
          t2(assoc 42 s1)
          lpl (append lpl (list (cdr t1)))
          s1(vl-remove t1 s1)
          s1(vl-remove t2 s1)
    )
    (if        t2
      (progn
        (if (/= (cdr t2) 0.0)
          (progn
          (alert "多段线不能含圆弧!")
          (exit)
          )
        )
      )
    )

)

(pdc lpl)

)


xvjiex 发表于 2021-9-13 00:11:07

感谢楼主分享判断顺逆时针的代码

hcq0594 发表于 2022-8-18 09:55:15

谢谢楼主分享,正需要。

happyending 发表于 2026-1-7 08:00:56

学到了。感谢您的分享。
页: [1]
查看完整版本: 判断顺逆时针的代码