G版也来关注这个问题了,谢谢了哈,我在想要是直接用那堆点画一根多线段出来(不管它有没有回头自交),然后直接看它的面积会不会很快? 多看看好代码,学习 多谢5楼,学习了! c961806787 发表于 2013-12-9 09:30 static/image/common/back.gif
代码太长、太复杂
5楼的代码是长,但正好一步步解释清楚了这么做的过程及每一步的目的...
当然,有更精简更高效的办法也是求之不得 本帖最后由 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: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: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 的一步步教学 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]