找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 768|回复: 10

[求助] [求助]:请高手帮我查看一下这个lisp

[复制链接]
发表于 2003-12-5 20:27:13 | 显示全部楼层 |阅读模式

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

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

×
我写了一个小lisp,想检验3点是否在一条直线上,如下:
;;;本程序的目的是检验三点是否在一条直线上
(defun c:3p()
   (prompt"\n请输入第一个点:")
  (setq p1 (getpoint))
  (prompt"\n请输入第二个点:")
  (setq p2 (getpoint))
  (prompt"\n请输入第三个点:")
  (setq p3 (getpoint))
  (setq ang1 (angle p1 p2))
  (setq ang2 (angle p2 p3))
  ;(print ang1)
  ;(print ang2)
  (cond ((= ang1 ang2) (print"三点在一条直线上") (prin1))
        ((/= ang1 ang2) (print"三点不在一条直线上") (prin1))
        )
  
  )
(prin1)
不知怎么不行,盼
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-12-5 20:54:45 | 显示全部楼层
将判断语句:(= ang1 ang2)
改为:(<= (abs (- ang1 ang2)) 0.0000001) 试一试
主要原因是:同一直线上捕捉的三点所产生的角度值ang1和ang2应该相等,但你看看它们的值就会知道,它们之间存在差值。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-5 21:26:21 | 显示全部楼层
对,你说得很有道理,我试试看
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-5 21:36:40 | 显示全部楼层
最初由 丹佛 发布
[B]对,你说得很有道理,我试试看 [/B]


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

使用道具 举报

 楼主| 发表于 2003-12-6 12:56:30 | 显示全部楼层
我将程序改进后,好象还是不行,无论是否3点在一条直线上,结果都是“三点不在一条直线上”,不知何故?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-6 16:01:28 | 显示全部楼层
除了角度还可以用距离啊,不止是这个,方法很多的
dist12 ,dist23, dist13
(if (= (+ dist12 dist23 dist13)
       (* 2 (max dist12 dist23 dist13))
)
(princ "\n三点共线")
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2003-12-6 16:44:51 | 显示全部楼层
cond一句这样改:

  1. (cond
  2.   ((= 0.0 (rem (- ang1 ang2) pi))
  3.    (print"三点在一条直线上")
  4.    (prin1)
  5.   )
  6.   (t
  7.    (print"三点不在一条直线上")
  8.    (prin1)
  9.   )
  10. )
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-6 17:30:25 | 显示全部楼层
(= ang1 ang2) 换成 (equal ang1 ang2 0.0001) 试试.
或利用: (inters pt1 pt2 pt1 pt3)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-6 19:36:16 | 显示全部楼层
首先谢谢各位的热心帮助,我依次按照各位楼主的办法试验,结果如下:
6楼通过距离的办法是可行的,调试通过;
7楼通过求余数的方法测试不行;
8楼的方法可行;
通过以上的测试,我在想2楼的方法为什么不行?于是我将2楼的精度调为0.001,程序变通过了,看来这两个角度算出来相差还是挺大的。
无论怎样我又学会了新的知识。

对了,我还想补充一下,就是用取精度的办法会出现bug,就是在细小的差别时,程序会认为3个不在一条直线上的点是在一条直线上,所以从合理性来讲应该是用长度的办法最可靠。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-6 20:14:44 | 显示全部楼层
对呀这是一个投机的办法不过却特别的好用,不错呀又学到了一招。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-23 13:57:57 | 显示全部楼层
八楼的方法其实是可以的,只是需先定义系统变量AUPREC后在确定比较精度即可。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 22:38 , Processed in 0.296358 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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