找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1796|回复: 16

[求助] [求助]:大家来编一个程序“判断点是否在一条直线上”?

[复制链接]
发表于 2003-9-17 21:02:10 | 显示全部楼层 |阅读模式

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

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

×
大家来编一个程序“判断点是否在一条直线上”?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-9-17 21:25:18 | 显示全部楼层
是多个点是否在一条直线上,还是点是否在某一条直线上?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2003-9-17 23:28:44 | 显示全部楼层
假设需要判断的点为(X0,Y0),直线的起点为(X1,Y1),终点为(X2,Y2)
(Y0-Y1)/(X0-X1)=(Y2-Y0)/(X2-X0)则该点在直线上。
必要是加一个误差允许值。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-9-17 23:50:18 | 显示全部楼层

Re: [求助]:大家来编一个程序“判断点是否在一条直线上”?

最初由 xxming 发布
[B]大家来编一个程序“判断点是否在一条直线上”? [/B]


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

使用道具 举报

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

使用道具 举报

发表于 2003-9-18 09:30:45 | 显示全部楼层
同意4楼的意见,本问题的关键是要根据工作实际,确定适当的误差值
注意, 给定的误差值必须>0
;------------------------------------------------------------
;pt    点
;eLine 直线图元名
;ep    给定的误差>0, 如0.0000001
(defun IsOnLine(pt eLine ep / ed x0 y0 x1 y1 x2 y2 dk)
        (setq x0(car pt) y0(cadr pt))
        (setq ed(entget eLine))
        (setq x1(cadr(assoc 10 ed)) y1(caddr(assoc 10 ed)))
        (setq x2(cadr(assoc 11 ed)) y2(caddr(assoc 11 ed)))
        (setq dk(abs(-(/ (- y0 y1)(- x0 x1))(/ (- y2 y0)(- x2 x0)))))
        (if(<= dk ep)
                t
                nil
        )
)
;--------------------------------------------------------------
供参考。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2003-9-18 13:29:17 | 显示全部楼层
7楼的兄弟给一个小建议,直接用angle可以简化一些
若(angle p0 p1)=(angle p2 p0),则点在直线上
若不等,但两角度之差的绝对值等与PI,则在直线的延长线上
不过这个程序只考虑到了二维的关系,若加入z坐标的因素,则xd兄的说法更全面些,但xd兄的方法可能较难判断点是在直线上,还是在延长线上
由于受三维的影响,角度即斜率的算法不准确,所以我想换一个方法,但不知是否有问题。
就是用distance函数,distance可以返回两个三维点之间的距离
若(distance p1 p0)+(distance p0 p2)=(distance p1 p2),则点在直线上
若不等,但 (abs ((distance p1 p0)-(distance p0 p2)))=(distance p1 p2),则在直线的延长线上
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-9-18 16:06:47 | 显示全部楼层
如果用
  (ssget ss (ssget "f" (list pt1 pt2))))
  (ssget ss (ssget "p" '((0 . "POINT"))))
是否更明確得到穿越 pt1 pt2 (線兩端點)有選到物件 "point"
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-9-18 19:30:40 | 显示全部楼层
5贴 8贴可以
还可以:求p在p1 p2上   三角型原理:两边长和大于第三边
(equal (-(+ (distance p p1 )(distance p p2))(distance p1 p2))  1e-5)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2003-9-18 21:32:05 | 显示全部楼层
7楼的朋友,你的程序还要注意当x0=x1=x2时,程序会出错,建议改用angle和distance试试。
这个程序好象不难,但不知有什么用?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-9-18 22:26:35 | 显示全部楼层
(vlax-curve-getClosestPointTo curve-obj givenPnt [extend])
功能
     返回曲线上离指定点最近的点(在 WCS 上)。
说明
1)参数 curve-obj 为要测量的 VLA 对象。
2)参数 givenPnt 为点(在 WCS 上),寻找曲线上距该点最近的点。
3)参数 extend 若指定该参数且其值不为 nil,那么 vlax-curve-getClosestPointTo  在搜索最近点时扩展曲线。
返回值:
若成功则返回表示曲线上一点的三维点表,否则返回 nil。


程序:

  1. ;|pti-----判断一点是否在另一曲线上------陌生人.2003.09
  2. 支持所有类型曲线的判定
  3. 一。 使用:
  4.   eg:
  5.   (setq pt (getpoint) obj (vlax-ename->vla-object (car (entsel))) )
  6. 1。判断点在上
  7.   (pti pt obj nil)
  8. 2。判断点在曲线延长线上
  9.   (pti pt obj T)
  10. 二。程序中0.00001是必须的,因为不同的计算方法导致点的微小误差,这个误差通常在表中不表现出来(精度决定)
  11. |;
  12. (defun pti (pt obj key /)
  13.   (if (equal pt (vlax-curve-getClosestPointTo obj pt key) 0.00001)
  14.              'T
  15.              'nil
  16.   )
  17. )

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

使用道具 举报

已领礼包: 23个

财富等级: 恭喜发财

发表于 2003-9-19 10:48:27 | 显示全部楼层
没那么复杂,使用vlax-curve-getDistAtPoint函数,返回nil就不在曲线上
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-9-19 23:11:15 | 显示全部楼层
2。判断点在曲线延长线上
  (pti pt obj T)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-9-23 13:38:09 | 显示全部楼层
如果要判断20个点和20个线的话,不知道会是哪个快~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 21:02 , Processed in 0.437590 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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