找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2541|回复: 23

[求助] [求助]:这样判断两个线段是否共线为什么会经常漏掉一些?

[复制链接]

已领礼包: 8613个

财富等级: 富甲天下

发表于 2004-6-30 14:00:50 | 显示全部楼层 |阅读模式

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

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

×
设p1,p2为线段一的两端点;p3,p4为线段二的两端点,agl是两线的角度,gcl是精度。
用如下的代码判断两线段是否共线有时会失败,为什么?

  1. (setq    p00 (polar p1 (+ (* pi 0.5) agl) 2000)
  2.             p_1 (xdrx_interst p1 p2 p1 p00 nil)
  3.             p_2 (xdrx_interst p3 p4 p1 p00 nil)
  4. )
  5. (equal p_1 p_2 gcl)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-6-30 20:58:30 | 显示全部楼层

Re: [求助]:这样判断两个线段是否共线为什么会经常漏掉一些?

最初由 liuyj 发布
[B]设p1,p2为线段一的两端点;p3,p4为线段二的两端点,agl是两线的角度,gcl是精度。
用如下的代码判断两线段是否共线有时会失败,为什么?
(setq    p00 (polar p1 (+ (* pi 0.5) agl) 2000)
            p_1 (xd... [/B]


和大家先说说,你遇到的,什么情况下的测试会失败?最好附个图上来。

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

使用道具 举报

发表于 2004-6-30 22:57:14 | 显示全部楼层
还可以这样

  1. (defun lnonln (ln1 ln2 / sp1 ep1 sp2 ep2 v1 v2)
  2.   (setq        sp1 (vlax-curve-getstartpoint ln1)
  3.         ep1 (vlax-curve-getendpoint ln1)
  4.         v1  (mapcar '- ep1 sp1)
  5.         sp2 (vlax-curve-getstartpoint ln2)
  6.         ep2 (vlax-curve-getendpoint ln2)
  7.         v2  (mapcar '- ep2 sp2)
  8.   )
  9.   (equal (- (* (car v1) (cadr v2))
  10.             (* (car v2) (cadr v1))
  11.          )
  12.          0.
  13.          0.00001
  14.   )
  15. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-1 08:10:26 | 显示全部楼层
最初由 Free-Lancer 发布
[B]还可以这样
(defun lnonln (ln1 ln2 / sp1 ep1 sp2 ep2 v1 v2)
  (setq        sp1 (vlax-curve-getstartpoint ln1)
        ep1 (vlax-curve-getendpoint ln1)
        v1  (mapcar '- ep1 sp1)
        sp2 (vlax-curve-getstartp... [/B]

好像有点问题,你的方法只能判断出两线是否平行。

******************************************************************

我是用三角形法则,及两边之和大于第三边。


  1. (defun lnonln (ln1 ln2 / sp1 ep1 sp2 ep2 v1 v2)
  2.   (setq        sp1   (vlax-curve-getstartpoint ln1)
  3.         ep1   (vlax-curve-getendpoint ln1)
  4.         dis1  (distance sp1 ep1)
  5.         sp2   (vlax-curve-getstartpoint ln2)
  6.         ep2   (vlax-curve-getendpoint ln2)
  7.         dis11 (distance sp1 sp2)
  8.         dis12 (distance sp1 ep2)
  9.         dis21 (distance ep1 sp2)
  10.         dis22 (distance ep1 ep2)
  11.   )
  12.   (and (equal (* 2.0 (max dis1 dis11 dis21))
  13.               (+ dis1 dis11 dis21)
  14.               0.00001
  15.        )
  16.        (equal (* 2.0 (max dis1 dis12 dis22))
  17.               (+ dis1 dis12 dis22)
  18.               0.00001
  19.        )
  20.   )
  21. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-1 10:26:32 | 显示全部楼层
3楼的程序不完全对.
请参考:
[php]
(defun c:test ()
  (setq ln1 (car (entsel)))
  (setq ln2 (car (entsel)))
  (setq        d1 (dispt2line (vlax-curve-getstartpoint ln1) ln2))
  (setq d2 (dispt2line (vlax-curve-getendpoint ln1) ln2))
  (if (and (equal d1 0 0.001)(equal d2 0 0.001))
    T
    nil
  )
)
(defun dispt2line (p0 lline)
  (distance p0 (vlax-curve-getclosestpointto lline (trans p0 1 0) acExtendBoth))
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-1 10:44:05 | 显示全部楼层
偶的办法是做一条辅助线,与两条线交与同一点,且两条线的角度相等
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-1 11:04:26 | 显示全部楼层
最初由 lzh741206 发布
[B]偶的办法是做一条辅助线,与两条线交与同一点,且两条线的角度相等 [/B]

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

使用道具 举报

发表于 2004-7-1 11:29:48 | 显示全部楼层
无需辅助线, 角度法:
[php]
(defun c:test ()
  (setq l1 (car (entsel)))
  (setq l2 (car (entsel)))
  (setq p1 (cdr (assoc 10 (entget l1))))
  (setq p2 (cdr (assoc 11 (entget l1))))
  (setq p3 (cdr (assoc 10 (entget l2))))
  (setq p4 (cdr (assoc 11 (entget l2))))
  (and (or (equal (angle p1 p2)(angle p3 p4) 0.001)
               (equal (angle p1 p2)(angle p4 p3) 0.001))
          (equal (angle p1 p2)(angle p1 p3) 0.001))
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-1 11:36:42 | 显示全部楼层
And的第二个条件(equal (angle p1 p2)(angle p1 p3) 0.001))有点问题,不过思路很好
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-1 12:16:59 | 显示全部楼层
看来大家很热心,俺就在说几句,直线的 方程为  y=kx+b ,对两个线段,只要判断  k 斜率、b 截距相同就是共线的,已知两点求 k b 是很容易的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8613个

财富等级: 富甲天下

 楼主| 发表于 2004-7-1 12:45:53 | 显示全部楼层
谢谢大家!其实我是用了天正的一个子函数,用xdapi替换后就是:
;;检验两线段是否在一直线上;name1,name2--实体名;

  1. (defun l_line1 (name1 name2 gcl / agl p1 p2 p3 p4 p00 p_1 p_2)
  2.   (xdrx_setenttodb name1)
  3.   (setq        p1  (xdrx_getentdxf 10)
  4.         p2  (xdrx_getentdxf 11)
  5.         agl (angle p1 p2)
  6.   )
  7.   (xdrx_setenttodb name2)
  8.   (setq        p3  (xdrx_getentdxf 10)
  9.         p4  (xdrx_getentdxf 11)
  10.         p00 (polar p1 (+ (* pi 0.5) agl) 2000)
  11.         p_1 (xdrx_interst p1 p2 p1 p00 nil)
  12.         p_2 (xdrx_interst p3 p4 p1 p00 nil)
  13.   )
  14.   (equal p_1 p_2 gcl)
  15. )

有时明明两条线段是共线的,可是他就判断不出,从思路上讲程序是可行的,我找不到原因。
从明经上看到过lucas的一段程序:

  1. (setq VLINE1_10 (cdr (assoc 10 (entget VLINE1))))
  2.   (setq VLINE1_11 (cdr (assoc 11 (entget VLINE1))))
  3.   (setq VLINE2_10 (cdr (assoc 10 (entget VLINE2))))
  4.   (setq VLINE2_11 (cdr (assoc 11 (entget VLINE2))))
  5.   (setq ANG1 (angle VLINE1_10 VLINE1_11))
  6.   (setq ANG2 (angle VLINE1_10 VLINE2_10))
  7.   (setq ANG3 (+ pi ANG1))
  8.   (if (or (equal ANG1 ANG2 0.000000001)
  9.           (equal ANG1 (+ ANG2 pi) 0.000000001)
  10.           (equal ANG3 ANG2 0.000000001)
  11.           (equal ANG3 (+ ANG2 pi) 0.000000001)
  12.       )......)

和lsjjm长老的思路大体相同,不过我觉得效率低了点,如果框选很多条平行的中间断开的线段,
明显会慢,前些日子ea斑竹做的东东速度很快,不知是用什么算法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-1 13:11:34 | 显示全部楼层
最初由 liuyj 发布
[B]谢谢大家!其实我是用了天正的一个子函数,用xdapi替换后就是:
;;检验两线段是否在一直线上;name1,name2--实体名;
(defun l_line1 (name1 name2 gcl / agl p1 p2 p3 p4 p00 p_1 p_2)
  (xdrx_setenttodb name1)
... [/B]

唉,你怎么不试试10楼的方法?

一般说来,速度的快慢和函数中的求值的步骤多少有关,比如 你写的  l_line1 没必要 setenttodb ,直接用 curve-getstartpoint 即可,你的写法反倒浪费了一点点时间。 程序的运行效率都是这样一点点积累起来的。

其实3楼的方法只要最后的abd判断中再加一句也可以


  1. (or
  2.       (vlax-curve-ison ln1 sp2)
  3.       (vlax-curve-ison ln1 ep2)
  4.       (vlax-curve-ison ln2 sp1)
  5.       (vlax-curve-ison ln2 ep1)
  6. )
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-1 13:33:11 | 显示全部楼层
最初由 陌生人 发布
[B]用xd说的方法,在简化一下,不求距离,直接判断点是否相等:
[code]
(defun atline (e1 e2 / p2s p2e)
  (setq p2s (vlax-curve-getstartpoint e2)
        p2e (vlax-curve-getendpoint e2))
  (and (equal p2s (vlax-... [/B]

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

使用道具 举报

发表于 2004-7-1 13:36:48 | 显示全部楼层
哈哈,你说话的语气让我想起某个人。
不过,在你说不对之后。请你好好看看vlax-curve-getclosestpointto 最后一个参数是 T 的时候,帮助文件里面是怎么说的,然后再试试上面的这段程序
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-1 14:49:01 | 显示全部楼层
最初由 陌生人 发布
[B]哈哈,你说话的语气让我想起某个人。
不过,在你说不对之后。请你好好看看vlax-curve-getclosestpointto 最后一个参数是 T 的时候,帮助文件里面是怎么说的,然后再试试上面的这段程序 [/B]

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 17:16 , Processed in 0.223539 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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