给出楼主一段完整的代码吧:
 - ;;;-----------------------------------------------------------;;
- ;;; 判断点是否在多边形内 ;;
- ;;;-----------------------------------------------------------;;
- (defun c:tt( / poly dxf lst pt)
- (if (and (setq poly (car (entsel "\n请选择多段线:")))
- (setq dxf (entget poly))
- (= "LWPOLYLINE" (cdr (assoc 0 dxf)))
- )
- (progn
- (setq lst (mapcar 'cdr (vl-remove-if '(lambda (x) (/= 10 (car x))) Dxf)))
- (if (zerop (getvar "WORLDUCS"))
- (setq lst (mapcar (function (lambda (p) (trans p poly 1))) lst))
- )
- (while (setq pt (getpoint "\n判断点:"))
- (if (ALG:Inside-p pt lst)
- (princ "\n在内!")
- (princ "\n在外!")
- )
- )
- )
- (princ "\n请选择多段线!")
- )
- (princ)
- )
- ;;;-----------------------------------------------------------;;
- ;;; 夹角(以P1为顶点,从p2到p3的有向角度) ;;
- ;;; 正代表逆时针,负则反之 ;;
- ;;;-----------------------------------------------------------;;
- (defun GEO:Angle (p1 p2 p3 / a )
- (setq a (- (angle p1 p3) (angle p1 p2)))
- (if (< a 0)
- (if (< a (- pi))
- (+ a 6.283185307179586476925286766559)
- a
- )
- (if (> a pi)
- (- a 6.283185307179586476925286766559)
- a
- )
- )
- )
- ;;;-----------------------------------------------------------;;
- ;;; 判断点是否在多边形(用顶点表示)内 ;;
- ;;; 方法: Pt与各个顶点的有向夹角和的绝对值如果等于2*pi则为真. ;;
- ;;; 参数: Pt 要判断的点 ;;
- ;;; lst 顶点列表 ;;
- ;;; 返回: T 在多边形内,nil则在外 ;;
- ;;;-----------------------------------------------------------;;
- (defun ALG:Inside-p (Pt lst /)
- (if (> (length lst) 2) ;至少要3点
- (equal
- (abs ;绝对值
- (apply
- '+ ;总和
- (mapcar
- (function (lambda (p q) (GEO:Angle pt p q))) ;有向夹角
- (cons (last lst) lst)
- lst
- )
- )
- )
- 6.283185307179586476925286766559 ;2*pi
- 1e-4 ;设低一点,防止累计误差
- )
- )
- )
|