检查点是否为直线
你能帮我检查多点是否在一条直线上(全方向)的最快方法吗?。我只是认为idea用x,y计算k,并检查循环三点配对,但它可能太慢了(很抱歉我的英语不好) 你好
选择一条线,例程将选择位于所选线上的所有点。
(defun c:test (/ e ent lst i ss ents)
;; Tharwat 13. 07. 2011
(if
(and
(setq e (car (entsel "\n Select a Line :")))
(eq (cdr (assoc 0 (setq ent (entget e)))) "LINE")
)
(progn
(setq
lst (ssget "_f"
(list (cdr (assoc 10 ent)) (cdr (assoc 11 ent)))
)
)
(repeat (setq i (sslength lst))
(setq ss (ssname lst (setq i (1- i))))
(setq ents (entget ss))
(if (not (eq (cdr (assoc 0 ents)) "POINT"))
(ssdel ss lst)
)
)
)
(princ)
)
(if lst
(sssetfirst
nil
lst
)
)
(princ)
)
塔瓦特
;;;++++++++++ 3D Is Point On Line ++++++++++++++++++++++++++++++++++++++
;;;ARG -> TestPt LinePt1 LinePt2 Fuzz
;;;RET T nil
(defun is_pt_online (pt l1 l2 fz)
(equal (distance l1 l2)
(+ (distance l1 pt)
(distance l2 pt)) fz))
-大卫 几何函数 谢谢大家,很高兴得到帮助^
@塔瓦:很抱歉我的英语不好,所以我越来越难描述,这可能会造成误解^我没有重点,只是要检查一下
@大卫:这就像是登记一段时间。如果pt仍然在线,但超出了l1-l2(l1-l2的延伸)又如何?因此,我将添加更多条件^^
@李:哦,说声谢谢,然后抄下来。我喜欢LM:ListCollinar-p,但它更难理解(对我来说^^)
;;;Are Points CoLinear
;;;ARG -> 3 Points and Fuzz
;;;RET -> T nil
(defun is_pt_colinear (p1 p2 p3 fz)
(or (equal (distance p1 p3)
(+ (distance p1 p2)
(distance p2 p3)) fz)
(equal (distance p1 p2)
(+ (distance p1 p3)
(distance p3 p2)) fz)
(equal (distance p2 p3)
(+ (distance p1 p2)
(distance p1 p3)) fz)))
-大卫
不客气。
快速解释我的共线谓词函数:LM:Collinar-p使用三角形不等式来测试三个点的共线性,LM:ListCollinar-p使用两个共线单位向量之间的向量点积等于+/-1的事实。 李^^^(链接非常有用)
啊,我刚刚写了一个(对我来说)更简单的共线,但我不确定它是否正确。请推荐帮助我
(defun ST:Geo-Linear (p1 p2 p3 fuzz)
((lambda ( a b )
(or
(equal (abs (- a b)) pi fuzz)
(equal (abs (- a b)) 0 fuzz)
)
)
(angle p1 p2)(angle p1 p3)
))
(defun ST:Geo-ListLinear (lst / tmp)
(setq i 2)
(cond ((and (= (length lst) 3)(ST:Geo-Linear(car lst)(cadr lst)(caddr lst) 1e-)(setq tmp T))
(T (while (and (< i (1- (length lst)))
(setq tmp (ST:Geo-Linear (nth 0 lst)(nth 1 lst) (nth (setq i (1+ i)) lst) 1e-))
tmp
)
)
)
tmp
)
当它发现三点不“一致”时,原因函数将立即停止,所以我认为它会更快一些 角度功能将测量UCS平面X轴的角度。 我想了想,但我想(不确定)如果只比较角度可能没有问题。如果它是线性的,当X轴改变时,直线上3点的差仍然等于0或pi(我不确定)。
页:
[1]
2