已知一闭合多边形,有判断该闭合多边形为三角形、长方形、梯形的现成算法吗?谢谢!
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)
)
谢谢!但是存在这样的一些问题...
无论是三角形、长方形、梯形都存在一个边上有多个点的问题,这样就可能存在包含四个顶点的闭合多边形是三角形!对于长方形、梯形也一样!那就先遍历所有线段,如果相邻两线段斜率一样则删除顶点
程序中已把重复的滤掉,你使用过程中有问题吗?
(if (not (member vt vtlist))(setq vtlist (append vtlist (list vt))))
没有看见?
你可以将相交的线打断,重复的线删除,然后取点。
谢谢!有点问题.即对于斜率相同的多个连续线没有处理.
谢谢!问题正是按照这种方法得到解决!
页:
[1]