明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

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

[已解答] 如和判定某一个点是否在由多段线组成的闭合框内?

[复制链接]
发表于 2014-10-23 06:25 | 显示全部楼层
凹包判断相对困难,凸包判断的算法已经很成熟了,射线法是比较常用的算法,论坛以前也有讨论过,楼主可以搜索一下,有现成的代码。不过按照楼主的条件我感觉还不需要做这种底层的运算,因为不是判断一个点是否在封闭点集内。bpoly如何
 楼主| 发表于 2014-10-23 08:28 | 显示全部楼层
firstinti 发表于 2014-10-23 06:25
凹包判断相对困难,凸包判断的算法已经很成熟了,射线法是比较常用的算法,论坛以前也有讨论过,楼主可以搜 ...

bpoly这个命令我知道,也用过,问这个问题是抱着向大侠学习的心态来专门问这种方法的。。
发表于 2014-10-23 20:16 | 显示全部楼层
katamoto 发表于 2014-10-23 08:28
bpoly这个命令我知道,也用过,问这个问题是抱着向大侠学习的心态来专门问这种方法的。。

http://bbs.mjtd.com/thread-111851-1-1.html
你读一下这个帖子里面的源码,有关于点在多边形或者曲线的判断的源码。
 楼主| 发表于 2014-10-28 08:19 | 显示全部楼层
ZZXXQQ 发表于 2014-10-22 21:28

版主,这个程序我试验了一下,把点放在封闭框内点后,还是返回 nil 的,您能看看是否有问题啊?
 楼主| 发表于 2014-10-28 08:25 | 显示全部楼层
ZZXXQQ 发表于 2014-10-22 21:28

版主您好,你这个程序我试验了一下,没成功,我选取的点在框内,但是返回值还是nil,您能看看是我哪里出的问题,
发表于 2014-10-28 11:21 | 显示全部楼层
katamoto 发表于 2014-10-22 21:13
这个倒是一个有意思的思路啊,我还真没想到,搜索了一下也没看到有人用过这个方法。。。

ssget框选用2个 ...

没搜索到么?
判断点是否在多边形内的一个另类实现
http://bbs.mjtd.com/forum.php?mo ... &fromuid=202795
虽然不是用的点,但道理是一样的
发表于 2014-10-28 11:23 | 显示全部楼层
lyqiezi 发表于 2014-10-23 00:03
(ssget "wp" ptlist)可以选择
还有一个思路,找出距离目标点最近的一个端点,将目标点插在最近端点的前后各 ...

这是一种新思路.
发表于 2014-10-28 16:45 | 显示全部楼层
给出楼主一段完整的代码吧:
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 判断点是否在多边形内                                      ;;
  3. ;;;-----------------------------------------------------------;;
  4. (defun c:tt( / poly dxf lst pt)
  5.   (if (and (setq poly (car (entsel "\n请选择多段线:")))
  6.            (setq dxf (entget poly))
  7.            (= "LWPOLYLINE" (cdr (assoc 0 dxf)))
  8.       )
  9.     (progn
  10.       (setq lst (mapcar 'cdr (vl-remove-if '(lambda (x) (/= 10 (car x))) Dxf)))
  11.       (if (zerop (getvar "WORLDUCS"))
  12.         (setq lst (mapcar (function (lambda (p) (trans p poly 1))) lst))
  13.       )
  14.       (while (setq pt (getpoint "\n判断点:"))
  15.         (if (ALG:Inside-p pt lst)
  16.           (princ "\n在内!")
  17.           (princ "\n在外!")
  18.         )
  19.       )
  20.     )
  21.     (princ "\n请选择多段线!")
  22.   )
  23.   (princ)
  24. )

  25. ;;;-----------------------------------------------------------;;
  26. ;;; 夹角(以P1为顶点,从p2到p3的有向角度)                    ;;
  27. ;;; 正代表逆时针,负则反之                                    ;;
  28. ;;;-----------------------------------------------------------;;
  29. (defun GEO:Angle (p1 p2 p3 / a )
  30.   (setq a (- (angle p1 p3) (angle p1 p2)))
  31.   (if (< a 0)
  32.     (if (< a (- pi))
  33.       (+ a 6.283185307179586476925286766559)
  34.       a
  35.     )
  36.     (if (> a pi)
  37.       (- a 6.283185307179586476925286766559)
  38.       a
  39.     )
  40.   )
  41. )

  42. ;;;-----------------------------------------------------------;;
  43. ;;; 判断点是否在多边形(用顶点表示)内                        ;;
  44. ;;; 方法: Pt与各个顶点的有向夹角和的绝对值如果等于2*pi则为真. ;;
  45. ;;; 参数: Pt  要判断的点                                      ;;
  46. ;;;       lst 顶点列表                                        ;;
  47. ;;; 返回: T 在多边形内,nil则在外                             ;;
  48. ;;;-----------------------------------------------------------;;
  49. (defun ALG:Inside-p (Pt lst /)
  50.   (if (> (length lst) 2)                                        ;至少要3点
  51.     (equal
  52.       (abs                                                        ;绝对值
  53.         (apply
  54.           '+                                                        ;总和
  55.           (mapcar
  56.             (function (lambda (p q) (GEO:Angle pt p q)))        ;有向夹角
  57.             (cons (last lst) lst)
  58.             lst
  59.           )
  60.         )
  61.       )
  62.       6.283185307179586476925286766559                                ;2*pi
  63.       1e-4                                                        ;设低一点,防止累计误差
  64.     )
  65.   )
  66. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-16 23:07 , Processed in 0.249471 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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