如何判断三个点的位置关系
本帖最后由 小万LISP 于 2024-1-19 09:34 编辑(setq a(getpoint "\n指定第一点:"))
(setq b(getpoint "\n指定第二点:"))
(setq c(getpoint "\n 第三点大概位置:"))
如何判断C点在哪个区域呢?
;;(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 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延长线上(可分前、后)、左,右,左前方、右前方、左后方、右后方
llsheng_73 发表于 2024-1-19 09:42
只能准确描述C在AB的左边或右边或者在ab线段上或AB的延长线上,一个点和另外两个点应该有4种关系,可以通过 ...
73大佬给力~ 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)))
)
) 不写代码了,手慢,麻烦,提个简单思路供参考
用角度差<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左侧 补充:如果角度差 <0,加上 360 就行了
页:
[1]