找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 932|回复: 14

[求助] [求助]:判断直线共线的程序,错在哪?

[复制链接]
发表于 2004-3-11 10:45:59 | 显示全部楼层 |阅读模式

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

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

×
(defun m (/ en1 en2 en3 en4 e e1 llgx)
  (setq en3 (entsel "xuanzeshiti"))
  (SETQ EN1 (CAR EN3))
  (setq en4 (entsel "xuanzeshiti"))
  (SETQ EN2 (CAR EN4))
  (if (and (= (enty en1) "LINE")
           (= (enty en2) "LINE")
           (= (liang en1) (liang en2))
      )
    (progn
      (setq e (polar (stli en1) (+ (liang en1) (/ pi 3.0)) 1000))
      (setq e1 (inters (stli en2) (lied en2) e (stli en1) nil))
      (if (equal (stli en1) e1)
        (setq llgx t)
        (setq llgx nil)
      )
    )
  )

)
enty,liang,stli lied为自定义函数
调试时发现:e1,(stli en1),其坐标值相同,可是(equal (stli en1) e1)返回nil,不知为什么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-3-11 12:14:50 | 显示全部楼层
试试(equal (distance e1 (stle ent1)) 0.0 0.00001)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-11 12:30:31 | 显示全部楼层
enty,liang,stli lied函数贴出来吗?一试遍知!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-11 14:38:58 | 显示全部楼层
(defun enty (en / tyen)
  (setq tyen (cdr (assoc 0 (entget en))))
)
(defun stli (en / spli)
  (if (= (enty en) "LINE")
    (setq spli (cdr (assoc 10 (entget en))))
  )
)
(defun lied (en / edli)
  (if (= (enty en) "LINE")
    (setq edli (cdr (assoc 11 (entget en))))
  )
)
(defun liang (en / angli)
  (if (= (enty en) "LINE")
    (setq angli (angle (stli en) (lied en))) ;与X轴正向夹角  弧度值
  )
)
应该不是二楼说的误差问题,因为监视中e1与(stli en1)坐标值完全相同。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-11 18:34:18 | 显示全部楼层
最初由 redapple 发布
[B](defun enty (en / tyen)
  (setq tyen (cdr (assoc 0 (entget en))))
)
(defun stli (en / spli)
  (if (= (enty en) "LINE")
    (setq spli (cdr (assoc 10 (entget en))))
  )
)
(defun lied (en / edli... [/B]


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

使用道具 举报

发表于 2004-3-11 20:05:30 | 显示全部楼层
用三点的angle是否一样或相差pi,用equal容许误差
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-11 21:32:26 | 显示全部楼层
3点不保险,因为3点中两点有可能共点。用angle是可以的,但应该用4个点
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-3-11 21:57:32 | 显示全部楼层
最初由 redapple 发布
[B](defun enty (en / tyen)
  (setq tyen (cdr (assoc 0 (entget en))))
)
(defun stli (en / spli)
  (if (= (enty en) "LINE")
    (setq spli (cdr (assoc 10 (entget en))))
  )
)
(defun lied (en / edli... [/B]

看似相同的点计算机未必认为相同,这是浮点运算的特点。
When I get the Z coordinate of a lwpolyline vertex and then fix it to the
nearest integer, it occasionally returns the wrong results. To illustrate this,
if the returned value is reported as 50.0, in some cases
(fix num) returns a value of 49.
Answer
This example demonstrates an inescapable internal problem with precision.
Sometimes AutoCAD's 16 significant digits fail to account for some of the
floating point part of the number that is being fixed.

To illustrate: AutoCAD reports a 50.0 zvalue is returned by the entget of a
specific polyline vertex.  However, the following manipulation indicates that
the actual numeric value is different:

(setq num (- 50 zvalue))
(rtos num 2 16)

This shows a difference of "0.0000000000000071".  Thus, there is a small
difference in the floating point part of the numbers. This difference results in
the return of 49 from (fix). This is because the actual value is
49.9999999999999928, but the full 16-digit float is evaluated only when the
(fix) command examines the value to the right of the decimal.  Otherwise AutoCAD
sees just 14 decimal places (i.e., 49.99999999999999) and rounds the number to
50.0.

A workaround is to compare the returned value with an interpreted value and,
based on the result, fix the desired number:

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-3-11 22:58:47 | 显示全部楼层
最初由 陌生人 发布
[B]3点不保险,因为3点中两点有可能共点。用angle是可以的,但应该用4个点 [/B]


你没理解他的意思:

p1 p2 和p3 p4

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

使用道具 举报

发表于 2004-3-11 23:35:56 | 显示全部楼层
你倒是挺会诠释,你是他肚子里面的蛔虫么?(开个玩笑不介意吧?哈)
我看你也没理解 “三点的angle是否一样或相差pi”
pI 呢?
而且,你的算法也是错误的:
(setq p1 '(-1 -1 0) p2 '(2 2 0) p3 '(0 0 0) p4 '(3 3 0))
(and
(equal (sin(angle p1 p3) )(sin(angle p2 p3) )1e-4)
(equal (sin(angle p1 p4) )(sin(angle p2 p4) )1e-4)
)
结果返回:nil
或者更致命的
(setq p1 '(-1 -1 0) p2 '(0 0 0) p3 '(0 0 0) p4 '(3 3 0))
p2=p3 的时候(angle p2 p3)=?
我看,就算加了pi也不行
你也不妨诠释一下我7楼的回贴。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-3-11 23:48:26 | 显示全部楼层
最初由 陌生人 发布
[B]你倒是挺会诠释,你是他肚子里面的蛔虫么?(开个玩笑不介意吧?哈)
我看你也没理解 “三点的angle是否一样或相差pi”
pI 呢?
而且,你的算法也是错误的:
(setq p1 '(-1 -1 0) p2 '(2 2 0) p3 '(0 0 0) p4 '(... [/B]


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

使用道具 举报

发表于 2004-3-11 23:58:33 | 显示全部楼层
p2=p3的时候,(angle p2 p3)=?
我7楼的核心思想是:在一个判断里面包括4个点。如果有3个不是不行,要做其它排除处理工作,那样就不够简洁了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-12 08:41:15 | 显示全部楼层
我认为用距离来判断较为简单:
若距离为dis1   dis2   dis3,则


  1.   [FONT=courier new]
  2. (if (equal (* (max dis1 dis2 dis3) 2.0) (+ dis1 dis2 dis3) 0.0000001)
  3.     (三点共线)
  4.     (不共线)
  5. )
  6.   [/FONT]
复制代码


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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-3-12 12:18:19 | 显示全部楼层
矢量的概念:

    如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。

    矢量加减法:

    设二维矢量P = ( x1,y1 ) ,Q = ( x2 , y2 ) ,则矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )。显然有性质 P + Q = Q + P , P - Q = - ( Q - P )。

    矢量叉积:

    计算矢量叉积是与直线和线段相关算法的核心部分。设矢量P = (x1,y1) ,Q = (x2,y2),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。一般在不加说明的情况下,本文下述算法中所有的点都看作矢量,两点的加减法就是矢量相加减,而点的乘法则看作矢量叉积。

    叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-3-13 19:24:14 | 显示全部楼层
听说现在高中就学向量了.


http://www.ied.edu.hk/has/phys/mathmech/vector.htm

  1. <table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="700" id="AutoNumber1" height="800">
  2.   <tr>
  3.     <td width="100%" height="800">
  4.       <iframe name="I1" width="100%" height="100%" src="http://www.ied.edu.hk/has/phys/mathmech/vector.htm">
  5. 浏览器不支持嵌入式框架或配置为不显示嵌入式框架
  6.       </iframe>
  7.     </td>
  8.   </tr>
  9. </table>
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 00:18 , Processed in 0.359972 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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