明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: llsheng_73

[讨论] 关于多个点是否共直线

[复制链接]
 楼主| 发表于 2013-12-10 13:29:05 | 显示全部楼层
Gu_xl 发表于 2013-12-10 10:42

G版也来关注这个问题了,谢谢了哈,我在想要是直接用那堆点画一根多线段出来(不管它有没有回头自交),然后直接看它的面积会不会很快?

点评

慢!  发表于 2013-12-10 13:36
发表于 2013-12-11 11:23:55 | 显示全部楼层
多看看好代码,学习
发表于 2014-11-5 23:30:10 | 显示全部楼层
多谢5楼,学习了!
 楼主| 发表于 2014-11-6 00:08:48 | 显示全部楼层
c961806787 发表于 2013-12-9 09:30
代码太长、太复杂

5楼的代码是长,但正好一步步解释清楚了这么做的过程及每一步的目的...
当然,有更精简更高效的办法也是求之不得

点评

其实只是变量名长,代码我感觉不长啊。变量名如果用a b c d之类的单个字母当然可以,但是这样就没啥可读性了。  发表于 2014-11-9 21:39
发表于 2014-11-7 18:49:54 | 显示全部楼层
本帖最后由 wowan1314 于 2014-11-7 19:15 编辑
llsheng_73 发表于 2013-12-9 05:00
泡杯茶坐点支烟在沙发上等你的见解哟

帮忙测试下我写的看是否通用!!

想起来了,这个函数只能判断二维点,三维点好像不行!!
  1. ;;;参数:三个点表  注意不能为相同的点                          ;;;
  2. ;;;返回值:共线T , 不共线nil                  ;;;
  3. ;;;=========================================================;;;
  4. (defun yy-3ptinline (p1 p2 p3 / v1 v2)
  5.     (setq v1 (mapcar '- p1 p2) v2 (mapcar '- p1 p3))
  6.     (if (equal (car v1) 0.0 1e-5)
  7.         (equal (car v1) (car v2) 1e-5)
  8.         (equal (abs(/ (cadr v1) (car v1))) (abs(/ (cadr v2) (car v2))) 1e-5)
  9.     )
  10. )
 楼主| 发表于 2014-11-8 02:01:15 | 显示全部楼层
本帖最后由 llsheng_73 于 2014-11-8 02:46 编辑
wowan1314 发表于 2014-11-7 18:49
帮忙测试下我写的看是否通用!!

想起来了,这个函数只能判断二维点,三维点好像不行!!

测试结果没问题
先没看懂,后来才发现是比较各自到第一点斜率的,第一个equal作为条件是为了避开除数为0,对不?
思路很巧,学习了
但是有个小问题是,如果(car v1)不等于0而(car v2)刚好等于0仍然会因为除数为0出错
下边根据你老的思路写的,请测试
;;斜率比较法多点共线判断,pts为不两点或者以上二维坐标点(z 坐标求参与计算),共线后边T不共线返回NIL,可以有相同坐标
  1. (defun ptsinline(pts / p)
  2.   (setq p(car pts)pts(mapcar'(lambda(x)(mapcar'- p x))(vl-remove p pts)))
  3.   (if(equal(caar pts)0 1e-6)
  4.     (not(vl-remove-if'(lambda(x)(equal(car x)0 1e-6))pts))
  5.     (if(equal(vl-remove-if'(lambda(x)(equal(car x)0 1e-6))pts)pts)
  6.       (setq p(abs(/(cadar pts)(caar pts)))
  7.       p(apply'and(mapcar'(lambda(x)(equal p(abs(/(cadr x)(car x)))1e-5))pts))))))

感觉还是5楼的方法比较简练...虽然对自定义坐标系的方法不懂......
 楼主| 发表于 2014-11-8 03:11:10 | 显示全部楼层
本帖最后由 llsheng_73 于 2014-11-8 03:46 编辑
vormittag 发表于 2013-12-9 09:24
代码如下:

;;原创 vormittag,修改llsheng_73

  1. (defun CK:ColineP(ptlst / a);;ptlst坐标点表(第二维以后被忽略,可以所有点坐标相同也可以前几个点相同对后续点的判断无影响
  2.   (setq a(car ptlst)
  3.         ptlst(vl-remove a ptlst)
  4.         a(mapcar'- a(car ptlst))
  5.         a(apply'and(mapcar'(lambda(x)(equal(cadr(trans x 0 a))0 1e-8))ptlst)))
  6.   )

6楼说代码太长,但我认为5楼方法很不错,所以精简了一下
正是因为它"太长,太复杂"才让我把它读懂了,感谢vormittag 的一步步教学

点评

vl-remove改为CDR好些  发表于 2014-11-8 13:01
发表于 2014-11-8 13:00:06 | 显示全部楼层
llsheng_73 发表于 2014-11-8 03:11
;;原创 vormittag,修改llsheng_73

三维的我也不了解!  感觉三维的点的话还是得用G版的,5楼的感觉三维也不行吧?

能判断三点共线,多点就好办了!  我写了个 不知道对否。
  1. (defun yy-ptsinline (pts / d)
  2.     (mapcar
  3.         '(lambda(a b c)
  4.             (if (yy-3ptinline a b c) nil (setq d 0))
  5.         )
  6.         pts (cdr pts) (cddr pts)
  7.     )
  8.     (if d nil t)
  9. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-23 21:13 , Processed in 0.236931 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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