判断点xpt是否在多边形内

;判断点xpt是否在多边形内
;所选射线xpt(x0&nbspy0)–pxy(x0+max|x0-xi|&nbspy0+min|y0-yi|)&nbsp[i=1,2&nbsp3,…….,n]不与多边形任何一点相交
;入口参数多边形:xdb((x1&nbspy1)&nbsp(x2&nbspy2)&nbsp(x3&nbspy3)……(xn&nbspyn))及待判断点xpt(x0&nbspy0)
;返回值0(在多边形外)、1(在多边形上)、2(在多边形内)
(defun&nbspdzdbxn(xdb&nbspxpt&nbsp/&nbspfhz&nbspmxb&nbspmyb&nbspn&nbspi&nbspmx&nbspmy&nbspnn&nbspp1&nbspp2&nbspp12&nbsppxy)
&nbsp&nbsp&nbsp&nbsp(vl-load-com)
&nbsp&nbsp&nbsp&nbsp(setq&nbspfhz&nbsp0&nbspmxb&nbspnil&nbspmyb&nbspnil&nbspn&nbsp(length&nbspxdb)&nbspi&nbsp0
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspxdb&nbsp(append&nbspxdb&nbsp(list&nbsp(car&nbspxdb)))
)
;&nbsp判断点xpt是否在多边形上
&nbsp&nbsp&nbsp&nbsp(while(<&nbspi&nbspn)
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(setq&nbspp1&nbsp(nth&nbspi&nbspxdb)&nbspp2&nbsp(nth&nbsp(1+&nbspi)&nbspxdb))
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(command&nbsp"line"&nbspp1&nbspp2&nbsp""&nbsp"chprop"&nbsp(entlast)&nbsp""&nbsp"c"&nbsp9&nbsp"")
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(setq&nbspp12&nbsp(vlax-curve-getclosestpointto&nbsp(vlax-ename->vla-object&nbsp(entlast))&nbspxpt))
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(entdel&nbsp(entlast))
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 若xpt至某一边的距离为零,则xpt在多边形上,因计算误差,设10的-6次方为与零的比较误差
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(if&nbsp(equal&nbsp(distance&nbspxpt&nbspp12)&nbsp0.0&nbsp1e-6)&nbsp(setq&nbspfhz&nbsp1&nbspi&nbspn))
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(setq&nbspi&nbsp(1+&nbspi))
&nbsp&nbsp&nbsp&nbsp)
(if&nbsp(/=&nbspfhz&nbsp1)
&nbsp&nbsp&nbsp &nbsp判断点xpt是否在多边形内
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(progn
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(foreach&nbspp12&nbspxdb
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(setq&nbspmxb&nbsp(append&nbspmxb&nbsp(list&nbsp(abs&nbsp(-&nbsp(car&nbspxpt)&nbsp(car&nbspp12)))))
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspmyb&nbsp(append&nbspmyb&nbsp(list&nbsp(abs&nbsp(-&nbsp(cadr&nbspxpt)&nbsp(cadr&nbspp12)))))
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp)
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp)
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(setq&nbsppxy&nbsp(mapcar&nbsp'+&nbspxpt&nbsp(list&nbsp(*&nbsp2.0&nbsp(apply&nbsp'max&nbspmxb))&nbsp(apply&nbsp'min&nbspmyb)))
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbspi&nbsp0&nbsp&nbsp&nbspnn&nbsp0
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp)
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(repeat&nbspn
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(if&nbsp(inters&nbspxpt&nbsppxy&nbsp(nth&nbspi&nbspxdb)&nbsp(nth&nbsp(1+&nbspi)&nbspxdb))&nbsp(setq&nbspnn&nbsp(1+&nbspnn)))
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(setq&nbspi&nbsp(1+&nbspi))
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp)
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp(if&nbsp(and&nbsp(>&nbspnn&nbsp0)&nbsp(/=&nbspnn&nbsp(*&nbsp(fix&nbsp(/&nbspnn&nbsp2.0))&nbsp2.0)))&nbsp(setq&nbspfhz&nbsp2))
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp)
&nbsp&nbsp&nbsp&nbsp)
&nbsp&nbsp&nbsp&nbsp(setq&nbspfhz&nbspfhz)
)

发表评论

您的邮箱不会被公开。* 为必填项