明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: llsheng_73

判断点是否在多边形内的一个另类实现

[复制链接]
发表于 2015-8-17 22:08 | 显示全部楼层
本帖最后由 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)
)


 楼主| 发表于 2015-8-17 23:52 | 显示全部楼层
本帖最后由 llsheng_73 于 2015-8-21 22:02 编辑
skg123 发表于 2015-8-17 22:08
未测试
;; 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在线内
发表于 2015-8-18 22:29 | 显示全部楼层
不知道楼主对下图中的情况,是如何通过5个点来判断?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2015-8-18 23:46 | 显示全部楼层
本帖最后由 llsheng_73 于 2015-8-21 22:03 编辑
skg123 发表于 2015-8-18 22:29
不知道楼主对下图中的情况,是如何通过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长度)来计算倍面积代表曲线的长度就不会有问题
发表于 2015-8-19 20:09 | 显示全部楼层
本帖最后由 skg123 于 2015-8-19 20:20 编辑
llsheng_73 发表于 2015-8-18 23:46
首先求点P到曲线e的最近点O,如果(equal P O 1e-10)认为点在e上。。。
否则取曲线起点A,1/3长度处取占B ...

你说的方法,我不是很理解,可否用图解释。
我有一种方法判断点和线的关系,见下图,图中辅助线是多段线的偏移线,偏移距离随意。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2015-8-19 20:57 | 显示全部楼层
本帖最后由 llsheng_73 于 2015-8-19 21:00 编辑
skg123 发表于 2015-8-19 20:09
你说的方法,我不是很理解,可否用图解释。
我有一种方法判断点和线的关系,见下图,图中辅助线是多段线 ...


对整条曲线进行偏移实际上是把工作交给CAD在做,按说也是所有点都参与了,只不过那个计算过程我们不但看不到,还可能比我们自己写的lisp快些
同时在程序中给它一个偏移距离,但它是往内还是往外取决于曲线方向,比如两条方向相反的曲线,如果都需要往外边偏移一个距离,那么给定的值只能一个为正一个为负,因此,为了保证偏移方向正确,得先计算出曲线的方向
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-21 08:17 , Processed in 0.289627 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表