小万LISP 发表于 2024-1-19 09:22:04

如何判断三个点的位置关系

本帖最后由 小万LISP 于 2024-1-19 09:34 编辑

(setq a(getpoint "\n指定第一点:"))
(setq b(getpoint "\n指定第二点:"))
(setq c(getpoint "\n 第三点大概位置:"))
如何判断C点在哪个区域呢?

Gu_xl 发表于 2024-1-19 09:22:05

;;(relation3p (getpoint "\nA点:") (getpoint "\nB点:") (getpoint "\nC点:"))
(defun relation3p (A B C/ R)
(setq        r
       (trans
           (mapcar '- C A)
           0
           (mapcar '- B A)
       )
)
(cond
    ((equal (car r) 0.0 1e-6)
   (princ "\n点C在直线AB上")
   0
    )
    ((> (car r) 0)
   (princ "\n点C在直线AB左侧")
   1
    )
    ((< (car r) 0)
   (princ "\n点C在直线AB右侧")
   -1
    )
)
)

llsheng_73 发表于 2024-1-19 09:42:13

本帖最后由 llsheng_73 于 2024-1-19 11:01 编辑

只能准确描述C在AB的左边或右边或者在ab线段上或AB的延长线上,一个点和另外两个点应该有4种关系,可以通过以AB为基准,将C点通过TRANS转换为以AB为基准的坐标,然后就可以根据结果进行判断了
(defun PToLn(p p1 p2)(trans(mapcar(function -)p1 p)0(mapcar(function -)p1 p2)))
(defun c:tt(/ a b c l p)
(and(setq a(getpoint"指定A点"))
      (setq b(getpoint"指定B点"A))
      (setq l(distance a b))
      (while(or(grdraw a b 1)(setq c(getpoint"指定C点")))
      (alert(cond((equal(car(setq p(PToLn c a b)))0 1e-8)
                  (if(<= 0(caddr p)l)"C在A-B线段上""C在A-B延长线上"))
                   ((>(car p)0)"C在A-B左侧")
                   ((<(car p)0)"C在A-B右侧")
                   )))))
当然,也可以综合TRANS的返回结果的第一个值的0、正、负及最后一个值的负,0-ab长度之间,大于ab长度进一步区分为:线段AB之间、线段AB延长线上(可分前、后)、左,右,左前方、右前方、左后方、右后方

magicheno 发表于 2024-1-19 10:56:01

llsheng_73 发表于 2024-1-19 09:42
只能准确描述C在AB的左边或右边或者在ab线段上或AB的延长线上,一个点和另外两个点应该有4种关系,可以通过 ...

73大佬给力~

自贡黄明儒 发表于 2024-1-19 11:11:41

highflybird大佬的
;;;定义三点的行列式,即三点之倍面积
;;注p1 p2 p3 逆时针为正。
(defun det (p1 p2 p3 / x2 y2)
(setq        x2 (car p2)
        y2 (cadr p2)
)
(- (* (- x2 (car p3)) (- y2 (cadr p1)))
   (* (- x2 (car p1)) (- y2 (cadr p3)))
)
)

shiy65 发表于 2024-1-19 16:18:20

不写代码了,手慢,麻烦,提个简单思路供参考
用角度差<CAB (弧度,转换成角度)判断也简单

(setq aq(* (/ 180 pi) (- (angle a c) (angle a b) )

aq = 0   在ab或延长线上,再查距离ac和ab比值dq 判断
          (setq dq (/(-(distance a c) (distance a b)) (distance a b)))
            比值 >1在ab延长线上
            比值 =1在b点
            比值 <1在ab 之间
            比值 =0在a点

aq>180   在ab右侧
aq=180   在ab反向延长线上
aq<180在ab左侧

shiy65 发表于 2024-1-19 16:29:50

补充:如果角度差 <0,加上 360 就行了
页: [1]
查看完整版本: 如何判断三个点的位置关系