wuxjld 发表于 2003-1-11 14:13:00

已知一闭合多边形,有判断该闭合多边形为三角形、长方形、梯形的现成算法吗?谢谢!

alin 发表于 2003-1-14 13:44:00

try this...

(defun c:PGtype(/ en ed vtnum vtlist cnt)
(setq en (car (entsel "\nSelect a closed polyline: ")))
(setq ed (entget en))
(if (= (cdr (assoc 0 ed)) "LWPOLYLINE")
    (progn
       (if (= (cdr (assoc 70 ed)) 1)
         (progn
         (setq vtnum (cdr (assoc 90 ed)))
         (setq vtlist '() cnt 1)
         (while (<= cnt vtnum)
             (setq vt (cdr (assoc 10 ed)))
             (if (not (member vt vtlist))
                (setq vtlist (append vtlist (list vt))))
             (setq ed (cdr (member (assoc 10 ed) ed)))
             (setq cnt (1+ cnt))
         )
         (setq vtnum (length vtlist))
         (cond ((= vtnum 3)
                (alert "Triangle!"))
                 ((= vtnum 4)
                (if (or (= (rtos (angle (nth 0 vtlist) (nth 1 vtlist)) 2 10)
                           (rtos (angle (nth 3 vtlist) (nth 2 vtlist)) 2 10))
                        (= (rtos (angle (nth 1 vtlist) (nth 2 vtlist)) 2 10)
                           (rtos (angle (nth 0 vtlist) (nth 3 vtlist)) 2 10)))
                      (if (and (= (rtos (angle (nth 0 vtlist) (nth 1 vtlist)) 2 10)
                                  (rtos (angle (nth 3 vtlist) (nth 2 vtlist)) 2 10))
                               (= (rtos (angle (nth 1 vtlist) (nth 2 vtlist)) 2 10)
                                  (rtos (angle (nth 0 vtlist) (nth 3 vtlist)) 2 10)))
                          (alert "Rectangle!")
                          (alert "Trapezia!")
                      );endif
                (Alert "Closed quilaterals except rectangle & trapezia!")
                );endif
                )
                (T
                (Alert "Closed Polygon except triangle, rectangle & trapezia!")
                )
            );cond
         );progn
         (alert "Not closed!")
      );endif
    );progn
(Alert "Not a LWPOLYLINE!")
);endif
(princ)
)

wuxjld 发表于 2003-1-16 10:53:00

谢谢!但是存在这样的一些问题...

无论是三角形、长方形、梯形都存在一个边上有多个点的问题,这样就可能存在包含四个顶点的闭合多边形是三角形!对于长方形、梯形也一样!

mccad 发表于 2003-1-16 19:08:00

那就先遍历所有线段,如果相邻两线段斜率一样则删除顶点

alin 发表于 2003-1-16 21:49:00

程序中已把重复的滤掉,你使用过程中有问题吗?

(if (not (member vt vtlist))
                (setq vtlist (append vtlist (list vt))))
没有看见?

springsky 发表于 2003-1-17 00:12:00

你可以将相交的线打断,重复的线删除,然后取点。

wuxjld 发表于 2003-1-17 09:15:00

谢谢!有点问题.即对于斜率相同的多个连续线没有处理.

wuxjld 发表于 2003-1-17 09:22:00

谢谢!问题正是按照这种方法得到解决!

页: [1]
查看完整版本: 已知一闭合多边形,有判断该闭合多边形为三角形、长方形、梯形的现成算法吗?谢谢!