llsheng_73 发表于 2013-12-10 13:29:05

Gu_xl 发表于 2013-12-10 10:42 static/image/common/back.gif


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

海盗曹 发表于 2013-12-11 11:23:55

多看看好代码,学习

laorenhao999 发表于 2014-11-5 23:30:10

多谢5楼,学习了!

llsheng_73 发表于 2014-11-6 00:08:48

c961806787 发表于 2013-12-9 09:30 static/image/common/back.gif
代码太长、太复杂

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

wowan1314 发表于 2014-11-7 18:49:54

本帖最后由 wowan1314 于 2014-11-7 19:15 编辑

llsheng_73 发表于 2013-12-9 05:00 static/image/common/back.gif
泡杯茶坐点支烟在沙发上等你的见解哟
帮忙测试下我写的看是否通用!!

想起来了,这个函数只能判断二维点,三维点好像不行!!;;;参数:三个点表注意不能为相同的点                        ;;;
;;;返回值:共线T , 不共线nil                  ;;;
;;;=========================================================;;;
(defun yy-3ptinline (p1 p2 p3 / v1 v2)
    (setq v1 (mapcar '- p1 p2) v2 (mapcar '- p1 p3))
    (if (equal (car v1) 0.0 1e-5)
      (equal (car v1) (car v2) 1e-5)
      (equal (abs(/ (cadr v1) (car v1))) (abs(/ (cadr v2) (car v2))) 1e-5)
    )
)

llsheng_73 发表于 2014-11-8 02:01:15

本帖最后由 llsheng_73 于 2014-11-8 02:46 编辑

wowan1314 发表于 2014-11-7 18:49 static/image/common/back.gif
帮忙测试下我写的看是否通用!!

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

llsheng_73 发表于 2014-11-8 03:11:10

本帖最后由 llsheng_73 于 2014-11-8 03:46 编辑

vormittag 发表于 2013-12-9 09:24 static/image/common/back.gif
代码如下:
;;原创 vormittag,修改llsheng_73

(defun CK:ColineP(ptlst / a);;ptlst坐标点表(第二维以后被忽略,可以所有点坐标相同也可以前几个点相同对后续点的判断无影响
(setq a(car ptlst)
      ptlst(vl-remove a ptlst)
      a(mapcar'- a(car ptlst))
      a(apply'and(mapcar'(lambda(x)(equal(cadr(trans x 0 a))0 1e-8))ptlst)))
)
6楼说代码太长,但我认为5楼方法很不错,所以精简了一下
正是因为它"太长,太复杂"才让我把它读懂了,感谢vormittag 的一步步教学

wowan1314 发表于 2014-11-8 13:00:06

llsheng_73 发表于 2014-11-8 03:11 static/image/common/back.gif
;;原创 vormittag,修改llsheng_73




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

能判断三点共线,多点就好办了!我写了个 不知道对否。(defun yy-ptsinline (pts / d)
    (mapcar
      '(lambda(a b c)
            (if (yy-3ptinline a b c) nil (setq d 0))
      )
      pts (cdr pts) (cddr pts)
    )
    (if d nil t)
)
页: 1 [2]
查看完整版本: 关于多个点是否共直线