找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1847|回复: 17

[研讨] 过2点的构造线是否切割封闭多段线

[复制链接]

已领礼包: 604个

财富等级: 财运亨通

发表于 2021-2-7 08:51:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 /db_自贡黄明儒_ 于 2021-2-9 19:38 编辑

已知:两点p1、P2和封闭多段线(不带弧)。判断:过p1 p2的构造线(不存在 )是否切割封闭多段线。
1.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 19个

财富等级: 恭喜发财

发表于 2021-2-7 08:59:27 | 显示全部楼层
判断过p1,p2的直线是否和多段线大于等于两个交点不就行了吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2021-2-7 09:12:29 | 显示全部楼层
Lisphk 发表于 2021-2-7 08:59
判断过p1,p2的直线是否和多段线大于等于两个交点不就行了吗?

您的意思是:先产生一条直线,然后决断直线与多段线有无交点?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2021-2-7 09:17:58 | 显示全部楼层
本帖最后由 Lisphk 于 2021-2-7 09:19 编辑
/db_自贡黄明儒_ 发表于 2021-2-7 09:12
您的意思是:先产生一条直线,然后决断直线与多段线有无交点?

可以啊,用完删除嘛
也可以用数学方法,就不用建立直线

评分

参与人数 1D豆 +5 收起 理由
/db_自贡黄明儒_ + 5 及时回复奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2021-2-7 09:20:02 | 显示全部楼层
判断多段线的每一个端点相对于p1、p2是左转还是右转,如果所有的转向一致,则不相切割,如果转向不一致,则相割。

评分

参与人数 1D豆 +5 收起 理由
/db_自贡黄明儒_ + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2021-2-7 09:31:36 | 显示全部楼层
lijiao 发表于 2021-2-7 09:20
判断多段线的每一个端点相对于p1、p2是左转还是右转,如果所有的转向一致,则不相切割,如果转向不一致,则 ...

条件不够吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2021-2-7 10:00:50 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2021-2-7 19:55 编辑
lijiao 发表于 2021-2-7 09:20
判断多段线的每一个端点相对于p1、p2是左转还是右转,如果所有的转向一致,则不相切割,如果转向不一致,则 ...

版主就是版主,佩服!!我来一个罗索版的,似乎没有版主的严谨
  1. ;;-----------------------------------------------------------;;
  2. ;; 旋转一个向量或者点90度     By highflybird                 ;;
  3. ;; 输入: 一个向量                                            ;;
  4. ;; 输出: 被旋转90度后的向量                                  ;;
  5. ;;-----------------------------------------------------------;;
  6. (defun MAT:Rot90 (vec)
  7.   (vl-list* (- (cadr vec)) (car vec) (cddr vec))
  8. )
  9. ;;164.3 [功能] 多段线端点列表
  10. ;;示例(HH:PtLists (car (entsel)))
  11. (defun HH:PtLists (en)
  12.   (mapcar 'cdr
  13.     (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget en))
  14.   )
  15. )

  16. ;;判断过2的构造线是否切割封闭多段线
  17. (defun 2P-LWPOLYLINE-P1  (pts p1 p2)
  18.   (apply 'or
  19.    (mapcar '(lambda (x y) (apply 'inters (list p1 p2 x y))) pts (cdr pts))
  20.   )
  21. )
  22. (defun 2P-LWPOLYLINE-P (pts p1 p2 / FLAG P3 P4 P5 P6)
  23.   (setq pts (cons (last pts) pts))
  24.   (setq Flag (2P-LWPOLYLINE-P1 pts p1 p2))
  25.   (if (not Flag)
  26.     (progn
  27.       (setq p3 (mapcar '+ p1 (MAT:Rot90 (mapcar '- p1 p2))))
  28.       (setq p4 (mapcar '+ p2 (MAT:Rot90 (mapcar '- p1 p2))))
  29.       (setq Flag (2P-LWPOLYLINE-P1 pts p3 p4))
  30.       (if (not Flag)
  31.   (progn
  32.     (setq p5 (mapcar '+ p1 (MAT:Rot90 (mapcar '- p2 p1))))
  33.     (setq p6 (mapcar '+ p2 (MAT:Rot90 (mapcar '- p2 p1))))
  34.     (setq Flag (2P-LWPOLYLINE-P1 pts p5 p6))
  35.   )
  36.       )
  37.     )
  38.   )
  39.   Flag
  40. )

  41. (defun C:w11 ()
  42.   (setq e (car (entsel)))
  43.   (setq pts (HH:PtLists e))
  44.   (setq p1 (getpoint))
  45.   (setq p2 (getpoint))
  46.   (princ (2P-LWPOLYLINE-P pts p1 p2))
  47.   (princ)
  48. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2021-2-7 15:42:04 | 显示全部楼层
本帖最后由 st788796 于 2021-2-7 15:43 编辑

  1. (defun iscross (pline p1 p2 / n i pts tf)
  2.   (setq        n (fix (vlax-curve-getendparam pline))
  3.         i 0
  4.   )
  5.   (repeat n
  6.     (setq pts (cons (vlax-curve-getpointatparam pline i) pts)
  7.           i   (1+ i)
  8.     )
  9.   )
  10.   (if (or (vlax-curve-isclosed pline)
  11.           (equal (vlax-curve-getendpoint pline)
  12.                  (vlax-curve-getstartpoint pline)
  13.                  0.00001
  14.           )
  15.       )
  16.     (setq pts (cons (vlax-curve-getstartpoint pline) pts))
  17.   )
  18.   (setq tf t)
  19.   (mapcar '(lambda (x y)
  20.              (if (and tf
  21.                       (inters x y p1 p2)
  22.                  )
  23.                (setq tf nil)
  24.              )
  25.            )
  26.           pts
  27.           (cdr pts)
  28.   )
  29.   (not tf)
  30. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2021-2-7 22:28:35 | 显示全部楼层

怎么感觉您这代码同我上面的一样不严谨呢?是不是我的这题太简单了。

点评

这个或许能帮助 用WINDING数判断点是否在多边形内部的算法及C++/LISP实现代码1 个回复 - 279 次查看Determining the inclusion of a point P in a 2D planar polygon is a geometric problem that results in i  详情 回复 发表于 2021-2-7 23:33
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2021-2-7 23:33:55 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2021-2-7 22:28
怎么感觉您这代码同我上面的一样不严谨呢?是不是我的这题太简单了。

这个或许能帮助


WINDING数判断点是否在多边形内部的算法及C++/LISP实现代码
1 个回复 - 279 次查看
Determining the inclusion of a point P in a 2D planar polygon is a geometric problem that results in interesting algorithms. Two commonly used methods are:
  • The Crossing Number (cn) method - which ...
  • 2017-7-14 17:57 - newer - 算法与数据结构


    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    已领礼包: 604个

    财富等级: 财运亨通

     楼主| 发表于 2021-2-8 12:37:20 | 显示全部楼层
    newer 发表于 2021-2-7 23:33
    这个或许能帮助

    2个点有一个在内部,肯定是切割多段线了。主要问题两个都在外时的判断。
    1. ;;;;;164.3 [功能] 多段线端点列表
    2. ;;;;;示例(HH:PtLists (car (entsel)))
    3. ;;;(defun HH:PtLists (en)
    4. ;;;  (mapcar 'cdr
    5. ;;;          (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget en))
    6. ;;;  )
    7. ;;;)
    8. ;;;(defun det (p1 p2 p3 / x2 y2)
    9. ;;;  (setq        x2 (car p2)
    10. ;;;        y2 (cadr p2)
    11. ;;;  )
    12. ;;;  (- (* (- x2 (car p3)) (- y2 (cadr p1)))
    13. ;;;     (* (- x2 (car p1)) (- y2 (cadr p3)))
    14. ;;;  )
    15. ;;;)
    16. ;;过2点的构造线与封闭多段线相交,返回T
    17. (defun 2P-LWPOLYLINE-P (pts p1 p2 / L)
    18.   (setq L (mapcar '(lambda (x) (MINUSP (det p1 p2 x))) pts))
    19.   (setq L (cons (last L) L))
    20.   (not (VL-EVERY '= L (cdr L)))
    21. )
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    已领礼包: 1268个

    财富等级: 财源广进

    发表于 2021-2-8 14:54:32 | 显示全部楼层
    /db_自贡黄明儒_ 发表于 2021-2-8 12:37
    2个点有一个在内部,肯定是切割多段线了。主要问题两个都在外时的判断。

    和任意一个段有交点就是分割,如用xline,inters + nil 参数
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    发表于 2021-2-9 10:02:13 | 显示全部楼层
    以P1为基准点,将多边形旋转一个角度,角度为(* (angle p1 p2) -1.0),然后求多边形的最小包围框,包围框的纵坐标y1<y2,如果P1点的纵坐标在y1与y2之间,则为相割
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    已领礼包: 604个

    财富等级: 财运亨通

     楼主| 发表于 2021-2-9 11:52:13 | 显示全部楼层
    lijiao 发表于 2021-2-9 10:02
    以P1为基准点,将多边形旋转一个角度,角度为(* (angle p1 p2) -1.0),然后求多边形的最小包围框,包围框的纵坐 ...

    这个方法就不如你上次说的方法了。

    还是直接计算,可能效率更高

    点评

    这要看你定义的两点 是直线, 还是线段了 如果是线段,那么就要判断的多一些  详情 回复 发表于 2021-2-9 12:41
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    已领礼包: 40个

    财富等级: 招财进宝

    发表于 2021-2-9 12:41:34 | 显示全部楼层
    /db_自贡黄明儒_ 发表于 2021-2-9 11:52
    这个方法就不如你上次说的方法了。

    还是直接计算,可能效率更高

    这要看你定义的两点 是直线, 还是线段了

    如果是线段,那么就要判断的多一些
    论坛插件加载方法
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
    如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

    GMT+8, 2024-6-28 23:46 , Processed in 0.233359 second(s), 67 queries , Gzip On.

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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