(defun midp3 ( pt1 pt2 / )
(list
(/ (+ (car pt1) (car pt2)) 2.0)
(/ (+ (cadrpt1) (cadrpt2)) 2.0)
(/ (+ (caddr pt1) (caddr pt2)) 2.0)
)
)
Benchmarking ..................Elapsed milliseconds / relative speed for 32768 iteration(s):
(MIDP3 P1 P2)......1045 / 10.21 <fastest>
(MIDP1 P1 P2)......1185 / 9
(MIDP2 P1 P2)......1248 / 8.55
(MIDPT P1 P2).....10670 / 1 <slowest>
Benchmarking ..................Elapsed milliseconds / relative speed for 32768 iteration(s):
(MIDP3 P1 P2).....1029 / 1.2 <fastest>
(MIDP1 P1 P2).....1201 / 1.03
(MIDP2 P1 P2).....1232 / 1 <slowest> 这可能比目前建议的速度还要慢,但autoCAD(至少2010年)已经有一个名为“中点之间”(Mid Between 2 Points)(_m2p)的捕捉选项,可以在shift+右键单击菜单中选择(无论称为什么,呵呵)。我不知道它是否可以通过AutoLISP访问,或者它是否有助于清理代码/减少资源消耗,但呃,我想我还是把它扔出去以防万一吧,哈哈。 @比尔·蒂尔曼:当然,你已经收到了一系列很好的解决方案。我将试着对你的第一种方法发表一些评论。
如果要使用OSNAP模式定位点,则应匹配提示器上的操作(即它提供选择点,而不是实体名称),或使用OSNAP AutoLISP函数。
(command "_LINE" "_MID" pt1 "_MID" pt3 "")
或
(command "_LINE" (osnap pt1 "_MID") (osnap pt3 "_MID") "")
但是,这不是推荐的解决方案,因为它可能会受到缩放级别、该区域中图形的拥挤程度和拾取框的大小以及实体是否在屏幕上可见的影响-存在选择其他项目或根本没有选择的风险。 @昏迷:AutoCAD将M2P或MTP列为命令修改器;它也可以用于AutoLISP代码中。
(command "_LINE" "_M2P" pt1 pt2 "_M2P" pt3 pt4 "") 太棒了但是2D点呢?
诚然,所需的条件可能会抵消使用此方法比mapcar在性能上的任何增益。。 还不错:
(defun midp4 (pt1 pt2 / z1 z2)
(append (list (/ (+ (car pt1) (car pt2)) 2.0)
(/ (+ (cadrpt1) (cadrpt2)) 2.0))
(if (and (setq z1 (caddr pt1)) (setq z2 (caddr pt2)))
(list (/ (+ z1 z2) 2.0)))))
15 实际上,godofcad的想法更快:
16
17
页:
1
[2]