ketxu 发表于 2022-7-6 09:10:04

检查点是否为直线

你能帮我检查多点是否在一条直线上(全方向)的最快方法吗?。我只是认为idea用x,y计算k,并检查循环三点配对,但它可能太慢了
(很抱歉我的英语不好)

Tharwat 发表于 2022-7-6 09:18:59

你好
 
选择一条线,例程将选择位于所选线上的所有点。
 

(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)
)


 
塔瓦特

David Bethel 发表于 2022-7-6 09:21:43


;;;++++++++++ 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))

 
-大卫

Lee Mac 发表于 2022-7-6 09:28:32

几何函数

ketxu 发表于 2022-7-6 09:30:02

谢谢大家,很高兴得到帮助^
@塔瓦:很抱歉我的英语不好,所以我越来越难描述,这可能会造成误解^我没有重点,只是要检查一下
@大卫:这就像是登记一段时间。如果pt仍然在线,但超出了l1-l2(l1-l2的延伸)又如何?因此,我将添加更多条件^^
@李:哦,说声谢谢,然后抄下来。我喜欢LM:ListCollinar-p,但它更难理解(对我来说^^)

David Bethel 发表于 2022-7-6 09:36:57


;;;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)))

-大卫

Lee Mac 发表于 2022-7-6 09:40:45

 
不客气。
 
快速解释我的共线谓词函数:LM:Collinar-p使用三角形不等式来测试三个点的共线性,LM:ListCollinar-p使用两个共线单位向量之间的向量点积等于+/-1的事实。

ketxu 发表于 2022-7-6 09:43:16

李^^^(链接非常有用)
 
啊,我刚刚写了一个(对我来说)更简单的共线,但我不确定它是否正确。请推荐帮助我
(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
)
当它发现三点不“一致”时,原因函数将立即停止,所以我认为它会更快一些

Lee Mac 发表于 2022-7-6 09:47:47

角度功能将测量UCS平面X轴的角度。

ketxu 发表于 2022-7-6 09:54:19

我想了想,但我想(不确定)如果只比较角度可能没有问题。如果它是线性的,当X轴改变时,直线上3点的差仍然等于0或pi(我不确定)。
页: [1] 2
查看完整版本: 检查点是否为直线