只需一步,快速开始
使用道具 举报
这个程序简单吧,而且运行时间要减少,只要找到一个点不在线上,即退出循环
;;;功能:判断点集共线;;;日期:byghbcaixin 于 2007-04-12
(defun on_line (ptlst / n k) (setq n 2 k nil) (while (and (not k) (< n (length ptlst))) (if (inters (car ptlst) (cadr ptlst) (car ptlst) (nth n ptlst) nil) (setq k t)) (setq n (1+ n)) ) k)
多谢两位!
我用 exit 仍然可以退出循环
byghbcx 的 inters 思路比较好!!
把最后的返回改成 (not k) 看起来比较直观
顺便问以下,怎样能测试程序的运行时间(具体数据),谢谢!
这个时间很短,基本不用测试,如需测试可加入
(defun on_line (ptlst / n k t0) (setq n 2 k nil) (setq t0 (getvar "TDUSRTIMER")) (while (and (not k) (< n (length ptlst))) (if (inters (car ptlst) (cadr ptlst) (car ptlst) (nth n ptlst) nil) (setq k t)) (setq n (1+ n)) ) (princ "\n共用时") (princ (* (- (getvar "TDUSRTIMER") t0) 86400000)) (princ "毫秒") k)
您需要 登录 才可以下载或查看,没有账号?注册
回 byghbcx
避免每次循环都对 le a b求值
(defun on_line (ptlst / le n k a b) (setq n 2 k T le (length ptlst) a (car ptlst) b (cadr ptlst)) (while (and k (< n le)) (if (inters a b a (nth n ptlst) nil) (setq k nil) ) (setq n (1+ n)) ) k)
修改后返回 125 毫秒
这个测试不正确,从理论上讲也是不对的.如果所有点共线,那么这所有点的代数和所构成的点(X1+X2+X3+...Xn,Y1+Y2+Y3+...Yn)一定在这条线上.反之则不然,如果两个点或更多的点不共线,而它们的代数和的点在线上,所以不能以此来判断.
你可以测试一下,你把不在线上的点加到点集的末尾,返回的也是T,这可能与INTERS的精度有关.如果不是精度问题,按道理,加入一个'(0 100)点,应该返回NIL,但同时加入两个点'(0 100)、点'(100 0)应该返回T。
本版积分规则 发表回复 回帖后跳转到最后一页
小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 ) ©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途
GMT+8, 2025-10-23 04:26 , Processed in 0.187655 second(s), 29 queries , Gzip On.
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.