z123456Z 发表于 2021-2-13 22:46:39

如何判断点是否在多边形内部

如何判断点是否在多边形内部,有没有直接调用的方法。我用计算角度判断有些时候会出错。
用射线法的话任意多变形都可以判断吗?

z123456Z 发表于 2021-2-13 22:51:13

比如这种图形,想判断注记是否在多边形内部,

chenjun_nj 发表于 2021-2-18 08:37:26

首先,多边形的顶点按逆时针方向排序;
过点作垂直线,按顶点序列判别哪些边与此垂线相交,并求出交点的Y坐标;
将交点Y值从小到大排序,如果某个交点正好是多变形的顶点,那么就在序列中重复一次,按1、2、3、。。。的次序排列;
看点的Y值在上个序列中在什么位置来判别:
1、如在序列1-2、3-4、5-6、........中,那么点在多边形内部;
2、如在序列2-3、4-5、6-7、.......中,那么点在多边形外部;
3、如与序列中的某个值相同,那么点在多边形边界上;
4、如大于序列最大值、或小于序列最小值,那么点在多边形外部。
-----以上方法供参考

z123456Z 发表于 2021-2-18 15:40:03

chenjun_nj 发表于 2021-2-18 08:37
首先,多边形的顶点按逆时针方向排序;
过点作垂直线,按顶点序列判别哪些边与此垂线相交,并求出交点的Y ...

谢谢,用射线法解决了。

caoyin 发表于 2021-3-3 19:33:34

http://bbs.mjtd.com/thread-183089-1-1.html

437271963 发表于 2021-9-8 02:47:13

;判断点在封闭线内
(defun &ssp (pt ssp / pt ssp x y)
(equal
pi
(abs (apply '+ (mapcar '(lambda (x y) (rem (- (angle pt x) (angle pt y)) pi) ) (reverse (cdr (reverse (cons (last ssp) ssp)))) ssp) ) )
1e-6
)
)
例子:
(defun c:tes ()
(if (and (setq ent (entsel "\n请选择封闭多段线"))
          (setq ent (car ent))
          (= (cdr (assoc 0 (setq #g (entget ent)))) "LWPOLYLINE")
          (vlax-curve-isClosed ent)
          (setq lst (mapcar 'cdr (vl-remove-if-not '(lambda(x) (= (car x) 10)) #g)))
          (setq p1 (getpoint "\n请选择点"))
   )
   (&ssp p1 lst)
)
);如果在封闭线内返回T,不在封闭线内返回nil
页: [1]
查看完整版本: 如何判断点是否在多边形内部