;所选射线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)
)