;判断点xpt是否在多边形内 ;所选射线xpt(x0 y0)--pxy(x0+max|x0-xi| y0+min|y0-yi|) [i=1,2 3,.......,n]不与多边形任何一点相交 ;入口参数多边形:xdb((x1 y1) (x2 y2) (x3 y3)……(xn yn))及待判断点xpt(x0 y0) ;返回值0(在多边形外)、1(在多边形上)、2(在多边形内) (defun dzdbxn(xdb xpt / fhz mxb myb n i mx my nn p1 p2 p12 pxy)     (vl-load-com)     (setq fhz 0 mxb nil myb nil n (length xdb) i 0           xdb (append xdb (list (car xdb))) ) ; 判断点xpt是否在多边形上     (while(< i n)         (setq p1 (nth i xdb) p2 (nth (1+ i) xdb))         (command "line" p1 p2 "" "chprop" (entlast) "" "c" 9 "")         (setq p12 (vlax-curve-getclosestpointto (vlax-ename->vla-object (entlast)) xpt))         (entdel (entlast))         若xpt至某一边的距离为零,则xpt在多边形上,因计算误差,设10的-6次方为与零的比较误差         (if (equal (distance xpt p12) 0.0 1e-6) (setq fhz 1 i n))         (setq i (1+ i))     ) (if (/= fhz 1)      判断点xpt是否在多边形内         (progn         (foreach p12 xdb            (setq mxb (append mxb (list (abs (- (car xpt) (car p12)))))                myb (append myb (list (abs (- (cadr xpt) (cadr p12)))))            )         )            (setq pxy (mapcar '+ xpt (list (* 2.0 (apply 'max mxb)) (apply 'min myb)))           i 0   nn 0            )            (repeat n            (if (inters xpt pxy (nth i xdb) (nth (1+ i) xdb)) (setq nn (1+ nn)))            (setq i (1+ i))            )            (if (and (> nn 0) (/= nn (* (fix (/ nn 2.0)) 2.0))) (setq fhz 2))         )     )     (setq fhz fhz) )
|