skg123 发表于 2015-8-17 22:08:35

本帖最后由 skg123 于 2015-8-17 23:30 编辑

未测试
;; No.51判断点是否在多边形内(狂刀程序)                                       
;;;xPt是要判断的点坐标(x y z ), Points是多边形顶点列表((x1 y1 z1) (x2 y2 z2)...)
;;;******************************************************************************
(defun isPtinPM(xPt Points)
(equal
    PI
    (abs
      (apply
'+
(mapcar'(lambda (x y) (rem (- (angle xPt x) (angle xPt y)) PI))
    (reverse (cdr (reverse (cons (last Points) Points))))
    Points
)
      )
    )
    1e-6
)          ;end_equal
)          ;end_defun




==========http://bbs.mjtd.com/forum.php?mod=viewthread&tid=39828================
(defun inorout (lst pt)
(equal
PI
(abs
(apply
'+
(mapcar '(lambda (x y) (rem (- (angle pt x) (angle pt y)) PI))
(cons (last lst) lst)
lst
)
)
)
1e-6
)
)



;;测试
(defun c:t3 ()
(setq lst (mapcar 'cdr
(vl-remove-if
'(lambda (x) (/= 10 (car x)))
(entget (car (entsel)))
)
)
pt (getpoint)
)
(inorout lst pt)
)


llsheng_73 发表于 2015-8-17 23:52:45

本帖最后由 llsheng_73 于 2015-8-21 22:02 编辑

skg123 发表于 2015-8-17 22:08 http://bbs.mjtd.com/static/image/common/back.gif
未测试
;; No.51判断点是否在多边形内(狂刀程序)                                       
;;;xPt是要 ...不是问题的问题:点与封闭曲线关系可简化至点与三角形关系?
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=169125&fromuid=202795
仍然是另类方法,看着写得复杂,实际上最好情况只需要在曲线上取5个点,当然事实上取了6个,其中4个用于计算整条曲线方向,另外两个点与检测点组成一个三角形计算该三角形方向,最后比较两个方向是否一致
(isPtin (getpoint)(car(entsel"拾取封闭曲线")));;0在线上,-1在线外,1在线内

skg123 发表于 2015-8-18 22:29:27

不知道楼主对下图中的情况,是如何通过5个点来判断?

llsheng_73 发表于 2015-8-18 23:46:01

本帖最后由 llsheng_73 于 2015-8-21 22:03 编辑

skg123 发表于 2015-8-18 22:29 http://bbs.mjtd.com/static/image/common/back.gif
不知道楼主对下图中的情况,是如何通过5个点来判断?

首先求点P到曲线e的最近点O,如果(equal P O 1e-10)认为点在e上。。。
否则取曲线起点A,1/3长度处取占B,2/3长度处取点C来计算三角形ABC的倍面积
计算P点,O点沿曲线方向回退一点,O点计算三角形的的倍面积
如果两个面积相除为正的话点就在曲线内,否则就在线外

实际上由于曲线的随意性,取3个点来代表整条曲线不有完全保证,但假如取4个点(起点,1/3长度,1/2长度,4/5长度)来计算倍面积代表曲线的长度就不会有问题

skg123 发表于 2015-8-19 20:09:52

本帖最后由 skg123 于 2015-8-19 20:20 编辑

llsheng_73 发表于 2015-8-18 23:46 static/image/common/back.gif
首先求点P到曲线e的最近点O,如果(equal P O 1e-10)认为点在e上。。。
否则取曲线起点A,1/3长度处取占B ...
你说的方法,我不是很理解,可否用图解释。
我有一种方法判断点和线的关系,见下图,图中辅助线是多段线的偏移线,偏移距离随意。

llsheng_73 发表于 2015-8-19 20:57:13

本帖最后由 llsheng_73 于 2015-8-19 21:00 编辑

skg123 发表于 2015-8-19 20:09 http://bbs.mjtd.com/static/image/common/back.gif
你说的方法,我不是很理解,可否用图解释。
我有一种方法判断点和线的关系,见下图,图中辅助线是多段线 ...

对整条曲线进行偏移实际上是把工作交给CAD在做,按说也是所有点都参与了,只不过那个计算过程我们不但看不到,还可能比我们自己写的lisp快些
同时在程序中给它一个偏移距离,但它是往内还是往外取决于曲线方向,比如两条方向相反的曲线,如果都需要往外边偏移一个距离,那么给定的值只能一个为正一个为负,因此,为了保证偏移方向正确,得先计算出曲线的方向
页: 1 [2]
查看完整版本: 判断点是否在多边形内的一个另类实现