明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 877|回复: 7

[讨论] 如何判断三个点的位置关系

[复制链接]
发表于 2024-1-19 09:22:04 | 显示全部楼层 |阅读模式
1明经币
本帖最后由 小万LISP 于 2024-1-19 09:34 编辑

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

附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

发表于 2024-1-19 09:22:05 | 显示全部楼层
  1. ;;(relation3p (getpoint "\nA点:") (getpoint "\nB点:") (getpoint "\nC点:"))
  2. (defun relation3p (A B C  / R)
  3.   (setq        r
  4.          (trans
  5.            (mapcar '- C A)
  6.            0
  7.            (mapcar '- B A)
  8.          )
  9.   )
  10.   (cond
  11.     ((equal (car r) 0.0 1e-6)
  12.      (princ "\n点C在直线AB上")
  13.      0
  14.     )
  15.     ((> (car r) 0)
  16.      (princ "\n点C在直线AB左侧")
  17.      1
  18.     )
  19.     ((< (car r) 0)
  20.      (princ "\n点C在直线AB右侧")
  21.      -1
  22.     )
  23.   )
  24. )
回复

使用道具 举报

发表于 2024-1-19 09:42:13 | 显示全部楼层
本帖最后由 llsheng_73 于 2024-1-19 11:01 编辑

只能准确描述C在AB的左边或右边或者在ab线段上或AB的延长线上,一个点和另外两个点应该有4种关系,可以通过以AB为基准,将C点通过TRANS转换为以AB为基准的坐标,然后就可以根据结果进行判断了
  1. (defun PToLn(p p1 p2)(trans(mapcar(function -)p1 p)0(mapcar(function -)p1 p2)))
  2. (defun c:tt(/ a b c l p)
  3.   (and(setq a(getpoint"指定A点"))
  4.       (setq b(getpoint"指定B点"A))
  5.       (setq l(distance a b))
  6.       (while(or(grdraw a b 1)(setq c(getpoint"指定C点")))
  7.         (alert(cond((equal(car(setq p(PToLn c a b)))0 1e-8)
  8.                     (if(<= 0(caddr p)l)"C在A-B线段上""C在A-B延长线上"))
  9.                    ((>(car p)0)"C在A-B左侧")
  10.                    ((<(car p)0)"C在A-B右侧")
  11.                    )))))

当然,也可以综合TRANS的返回结果的第一个值的0、正、负及最后一个值的负,0-ab长度之间,大于ab长度进一步区分为:线段AB之间、线段AB延长线上(可分前、后)、左,右,左前方、右前方、左后方、右后方

评分

参与人数 1明经币 +1 金钱 +50 收起 理由
小万LISP + 1 + 50 赞一个!

查看全部评分

回复

使用道具 举报

发表于 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)))
  )
)

评分

参与人数 1明经币 +1 收起 理由
小万LISP + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 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左侧

点评

这个方式更好理解。赞!  发表于 2024-1-20 07:02
回复

使用道具 举报

发表于 2024-1-19 16:29:50 | 显示全部楼层
补充:如果角度差 <0,加上 360 就行了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 23:46 , Processed in 0.168872 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表