找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3027|回复: 21

[求助] 求两线的交点

[复制链接]

已领礼包: 3198个

财富等级: 富可敌国

发表于 2014-9-9 20:40:47 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 lucas3 于 2014-9-9 21:06 编辑

可以是任意多边形,或是两条直线,选择两条相邻的线,求出交点坐标,这个交点是唯一的,只有一个,论坛有这样的函数吗?

找了一下“两线交点函数”,有这样的函数,但是当我选择一个矩形两条相邻的边,得到的是4个点座标,有没有我要求的那样,只返回唯一的交点座标呢?

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

已领礼包: 146个

财富等级: 日进斗金

发表于 2014-9-9 21:16:38 | 显示全部楼层
矩形或多边形其实就是一个图元而已,你虽然点选了两个相邻的边,其实你是选择了两次同一个图元而已,故有交点四个。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-9-9 21:46:20 来自手机 | 显示全部楼层
取每段起始点然后inters

点评

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

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2014-9-9 21:49:45 来自手机 | 显示全部楼层
st788796 发表于 2014-9-9 21:46
取每段起始点然后inters

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-9-9 22:54:19 来自手机 | 显示全部楼层
lucas3 发表于 2014-9-9 21:49
大师,能不能直接给出函数?感谢!

如果是pline点一个边的临近交点处就可以找到这个交点,无需另一个边,可以参考XD::polyline:-index+和xd::polyline:nearindex
如果是两个line可用inters也可以用一个线的两个端点判断哪个在另外线上的方法找交点
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

发表于 2014-9-9 23:29:34 | 显示全部楼层
本帖最后由 lgx9612 于 2014-9-10 19:21 编辑

请指正
  1. (defun inters_lgx (/ bbb ss_lgx point1_lgx point2_lgx ss1_lgx interpoint loop p1_lgx interpoint_list nofit)
  2. ;;;by:刘国新
  3. (setq ss_lgx (entsel "\n选择第一条线:"))
  4. (if ss_lgx
  5. (progn
  6. (setq bbb (entget (car ss_lgx)))
  7. (setq point1_lgx (vlax-curve-getClosestPointTo (vlax-ename->vla-object (car ss_lgx)) (cadr ss_lgx) nil))
  8. (setq ss1_lgx (entsel "\n选择第二条线:"))
  9. )
  10. )
  11. (if ss1_lgx
  12. (if (/= (ssmemb (car ss1_lgx) (ssadd (car ss_lgx))) nil)
  13. (progn
  14. (setq point2_lgx (vlax-curve-getClosestPointTo (vlax-ename->vla-object (car ss1_lgx)) (cadr ss1_lgx) nil))
  15. (setq interpoint (inters point1_lgx (polar point1_lgx (+ (angle (cadr ss_lgx) point1_lgx) (* 0.5 pi)) 5.0)
  16.      point2_lgx (polar point2_lgx (+ (angle (cadr ss1_lgx) point2_lgx) (* 0.5 pi)) 5.0) nil))
  17. (setq interpoint (reverse(cdr (reverse interpoint))))
  18. (setq loop t)
  19. (if (/= interpoint nil)
  20. (if (= (cdr (assoc 0 bbb)) "LWPOLYLINE")
  21. (while loop
  22. (if (= (assoc 10  bbb) nil)
  23. (progn
  24. (setq loop nil)
  25. (setq interpoint nil)
  26. )
  27. )
  28. (setq p1_lgx (assoc 10  bbb))
  29. (if (equal interpoint (cdr p1_lgx) 0.0005)
  30. (setq loop nil)
  31. (setq bbb (vl-remove p1_lgx bbb))
  32. )
  33. )
  34. )
  35. )
  36. )
  37. (progn
  38. (setq bbb (vlax-invoke (vlax-ename->vla-object (car ss_lgx)) 'intersectwith (vlax-ename->vla-object (car ss1_lgx)) 0))
  39. (if bbb
  40. (progn
  41. (repeat (/ (length bbb) 3)
  42. (setq interpoint_list (cons (list (car bbb)(cadr bbb)) interpoint_list))
  43. (setq bbb (cdr bbb))
  44. (setq bbb (cdr bbb))
  45. (setq bbb (cdr bbb))
  46. )
  47. (setq point2_lgx (vlax-curve-getClosestPointTo (vlax-ename->vla-object (car ss1_lgx)) (cadr ss1_lgx) nil))
  48. (setq interpoint (inters point1_lgx (polar point1_lgx (+ (angle (cadr ss_lgx) point1_lgx) (* 0.5 pi)) 5.0)
  49.      point2_lgx (polar point2_lgx (+ (angle (cadr ss1_lgx) point2_lgx) (* 0.5 pi)) 5.0) nil))
  50. (setq interpoint (reverse(cdr (reverse interpoint))))
  51. (if (/= interpoint nil)
  52. (progn
  53. (while interpoint_list
  54. (setq p1_lgx (car interpoint_list))
  55. (setq interpoint_list (cdr interpoint_list))
  56. (if (equal interpoint p1_lgx 0.0005)
  57. (progn
  58. (setq interpoint_list nil)
  59. (setq nofit nil)
  60. )
  61. (setq nofit 1)
  62. )
  63. )
  64. (if (= nofit 1)
  65. (setq interpoint nil)
  66. )
  67. )
  68. )
  69. )
  70. )
  71. )
  72. )
  73. (princ "选择有误\n")
  74. )
  75. (princ)
  76. interpoint
  77. )


a.gif

点评

刘工,还有一个小问题,当选择的是两条直线时,返回的是三维点的座标(含Z轴)。  详情 回复 发表于 2014-9-10 10:06
刘工,不错!试了多边形,能返回唯一交点座标! 谢谢了!  详情 回复 发表于 2014-9-10 09:43

评分

参与人数 1D豆 +5 收起 理由
lucas3 + 5 技术引导讨论和指点奖!

查看全部评分

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

使用道具 举报

发表于 2014-9-10 07:36:57 | 显示全部楼层

  1. (defun c:tt (/ polyline:lineseg line:point e1 e2 el1 el2 i k p)
  2.   (defun polyline:lineseg (e i / p1 p2)
  3.     (setq p1 (vlax-curve-getpointatparam e i)
  4.           p2 (vlax-curve-getpointatparam e (1+ i))
  5.     )
  6.     (if        (equal (distance p1 p2)
  7.                (- (vlax-curve-getdistatpoint e p2)
  8.                   (vlax-curve-getdistatpoint e p1)
  9.                )
  10.                1e-3
  11.         )
  12.       (list p1 p2)
  13.     )
  14.   )
  15.   (defun line:point (e)
  16.     (list (vlax-curve-getstartpoint e)
  17.           (vlax-curve-getendpoint e)
  18.     )
  19.   )
  20.   (if
  21.     (and (setq e1 (entsel "\nFirst Line: "))
  22.          (setq e2 (entsel "\nSecond Line: "))
  23.          (setq el1 (entget (car e1))
  24.                el2 (entget (car e2))
  25.          )
  26.          (or
  27.            (and        (equal (car e1) (car e2))
  28.                 (= (cdr (assoc 0 el1)) (cdr (assoc 0 el2)) "LWPOLYLINE")
  29.                 (setq i        (fix (vlax-curve-getparamatpoint
  30.                                (car e1)
  31.                                (apply 'vlax-curve-getclosestpointto e1)
  32.                              )
  33.                         )
  34.                       k        (fix (vlax-curve-getparamatpoint
  35.                                (car e2)
  36.                                (apply 'vlax-curve-getclosestpointto e2)
  37.                              )
  38.                         )
  39.                 )
  40.                 (setq p        (apply 'inters
  41.                                (append (polyline:lineseg (car e1) i)
  42.                                        (polyline:lineseg (car e2) k)
  43.                                )
  44.                         )
  45.                 )
  46.            )
  47.            (and        (and (/= (car e1) (car e2))
  48.                      (= (cdr (assoc 0 el1)) (cdr (assoc 0 el2)) "LINE")
  49.                 )
  50.                 (setq p
  51.                        (apply 'inters
  52.                               (append (line:point (car e1)) (line:point (car e2)))
  53.                        )
  54.                 )
  55.            )
  56.          )
  57.     )
  58.     (entmake (list '(0 . "circle") (cons 10 p) '(40 . 100)))
  59.   )
  60.   (princ)
  61. )

点评

Free-Lancer大师,多边形,矩形 测试都不行,提示:“错误: 参数太少”  详情 回复 发表于 2014-9-10 09:46
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2014-9-10 09:43:57 | 显示全部楼层

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

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2014-9-10 09:46:36 | 显示全部楼层

Free-Lancer大师,多边形,矩形 测试都不行,提示:“错误: 参数太少”

点评

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

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2014-9-10 10:06:15 | 显示全部楼层
本帖最后由 lucas3 于 2014-9-10 14:26 编辑

刘工,还有一个小问题,当选择的是两条直线时,或者直线与多段线,返回的是三维点的座标(含Z轴)。

点评

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

使用道具 举报

发表于 2014-9-10 11:29:56 | 显示全部楼层
lucas3 发表于 2014-9-10 09:46
Free-Lancer大师,多边形,矩形 测试都不行,提示:“错误: 参数太少”

这个函数修改一下
  1. (defun polyline:lineseg (e i / p1 p2)
  2.     (setq p1 (vlax-curve-getpointatparam e i)
  3.           p2 (vlax-curve-getpointatparam e (1+ i))
  4.     )
  5.     (if        (equal (distance p1 p2)
  6.                (abs (- (vlax-curve-getdistatparam e i)
  7.                        (vlax-curve-getdistatparam e (1+ i))
  8.                     )
  9.                )
  10.                1e-3
  11.         )
  12.       (list p1 p2)
  13.     )
  14.   )

点评

Free-Lancer大师,直线与多段线(或矩形,多边形)的交点呢? 能否再补充一下?  详情 回复 发表于 2014-9-10 14:11
Free-Lancer大师,非常好!谢谢!  详情 回复 发表于 2014-9-10 11:41

评分

参与人数 1D豆 +5 收起 理由
lucas3 + 5 热心帮忙奖!

查看全部评分

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

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2014-9-10 11:41:15 | 显示全部楼层
Free-Lancer 发表于 2014-9-10 11:29
这个函数修改一下

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

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2014-9-10 14:11:17 | 显示全部楼层
Free-Lancer 发表于 2014-9-10 11:29
这个函数修改一下

Free-Lancer大师,直线与多段线(或矩形,多边形)的交点呢? 能否再补充一下?

点评

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

使用道具 举报

发表于 2014-9-10 16:18:07 | 显示全部楼层
lucas3 发表于 2014-9-10 14:11
Free-Lancer大师,直线与多段线(或矩形,多边形)的交点呢? 能否再补充一下?


优化一下
  1. (defun c:tt (/ polyline:lineseg line:point mGetpoints e1 e2 pl1 pl2 p)
  2.   (defun polyline:lineseg (e i / p1 p2)
  3.     (setq p1 (vlax-curve-getpointatparam e i)
  4.           p2 (vlax-curve-getpointatparam e (1+ i))
  5.     )
  6.     (if        (equal (distance p1 p2)
  7.                (abs (- (vlax-curve-getdistatparam e i)
  8.                        (vlax-curve-getdistatparam e (1+ i))
  9.                     )
  10.                )
  11.                1e-3
  12.         )
  13.       (list p1 p2)
  14.     )
  15.   )
  16.   (defun line:point (e)
  17.     (list (vlax-curve-getstartpoint e)
  18.           (vlax-curve-getendpoint e)
  19.     )
  20.   )
  21.   (defun mGetpoints (lst / el i)
  22.     (setq el (entget (car lst)))
  23.     (cond
  24.       ((= (cdr (assoc 0 el)) "LWPOLYLINE")
  25.        (setq i (fix (vlax-curve-getparamatpoint
  26.                       (car lst)
  27.                       (apply 'vlax-curve-getclosestpointto lst)
  28.                     )
  29.                )
  30.        )
  31.        (polyline:lineseg (car lst) i)
  32.       )
  33.       ((= (cdr (assoc 0 el)) "LINE")
  34.        (line:point (car lst))
  35.       )
  36.       (t nil)
  37.     )
  38.   )
  39.   (if
  40.     (and (setq e1 (entsel "\nFirst Line: "))
  41.          (setq e2 (entsel "\nSecond Line: "))
  42.          (setq pl1 (mGetpoints e1))
  43.          (setq pl2 (mGetpoints e2))
  44.          (setq p (apply 'inters (append pl1 pl2)))
  45.     )
  46.      (entmake (list '(0 . "circle") (cons 10 p) '(40 . 100)))
  47.   )
  48.   (princ)
  49. )

点评

这次非常好! 谢谢Free-Lancer大师!  详情 回复 发表于 2014-9-10 16:36

评分

参与人数 1D豆 +5 收起 理由
lucas3 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2014-9-10 16:36:46 | 显示全部楼层

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 21:44 , Processed in 0.222052 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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