乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 124|回复: 19

[编程交流] 点相对位置

[复制链接]

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:01:36 | 显示全部楼层 |阅读模式
大家好,
 
我有三个点A(x1,y1),B(x2,y2)和C(x3,y3)。当从A到B看时,我如何找到C的哪一边。也就是说,通过计算三个点的坐标,点C是在AB线的左侧还是右侧。
 
提前谢谢。
 
芦荟
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 16:06:32 | 显示全部楼层
你好,阿洛伊,
 
请试试这个。
  1. (and (setq a (getpoint "\nSpecify point A :"))
  2.     (setq b (getpoint "\nSpecify point B :" a))
  3.     (setq c (getpoint "\nSpecify point C :"))
  4.     (alert (strcat "Point resides on the " (if (minusp (sin (- (angle a b) (angle a c)))) "Left" "Right") " Side."))
  5.     )
回复

使用道具 举报

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:09:56 | 显示全部楼层
谢谢塔瓦。实际上,我希望通过一个程序分配三个点,以自动处理土方工程中挖方和填方的面积计算。我想我可以利用最后一行。
再次感谢。
 
芦荟
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:13:03 | 显示全部楼层
还有一个向量答案类似于Tharwat解,我知道我用过它,但很难找到它,使用x&y
 
找到一个返回+或-答案的示例。现在找到我的lisp版本。
 
  1. (p2.X-p1.X)*(p3.Y-p1.Y)-(p2.Y-p1.Y)*(p3.X-p1.X)
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 16:15:33 | 显示全部楼层
 
欢迎你,祝你好运。
回复

使用道具 举报

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:20:36 | 显示全部楼层
嗨,比格尔,
我搜索时发现了类似的向量叉积。但我觉得它太长了。此外,它涉及行列式和转置等。感谢您指出。
 
芦荟
回复

使用道具 举报

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:23:03 | 显示全部楼层
嗨,塔瓦,
它工作得很好。我将发布代码和生成的图纸,用于自动计算切割和填充区域。
 
这里x2是挖方或填方末端的交点,q3是A,q4是B,pz是C。它给出了两个挖方和一个填方的总和。你为我节省了很多时间。
 
芦荟
  1. (if x2 (progn (setq i2 (angle q3 q4)) (setq i3(angle q3 pz))))   
  2.    (if (and x2 (and (> (sin (- i2 i3)) 0.0))) (setq fill (+ fill a)))
  3.    (if (and x2 (and (< (sin (- i2 i3)) 0.0))) (setq cut (+ cut a)))

170139cjyz7m7gxjm7i7mi.jpg
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:24:21 | 显示全部楼层
另一种方法是使用向量叉积:
  1. (defun c:test ( / a b c )
  2.    (if (and (setq a (getpoint "\n1st point of line: "))
  3.             (setq b (getpoint "\n2nd point of line: " a))
  4.             (setq c (getpoint "\nPoint to test: "))
  5.        )
  6.        (LM:clockwise-p a c b)
  7.    )
  8. )
  9. ;; Clockwise-p - Lee Mac
  10. ;; Returns T if p1,p2,p3 are clockwise oriented
  11. (defun LM:clockwise-p ( a b c )
  12.    (apply '> (mapcar '* (mapcar '- c a) (reverse (mapcar '- b a '(0 0)))))
  13. )
回复

使用道具 举报

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:27:57 | 显示全部楼层
谢谢LM。我也会试试这个。我相信这会奏效的。但最后一行很难理解。
回复

使用道具 举报

0

主题

3

帖子

3

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 16:30:27 | 显示全部楼层
试试这个
  1. ;determines the orientation on the basis of pointaxis P1 -> P2
  2. ;Points in current UCS
  3. ;example function:
  4. ;(setq
  5. ;  pt1 (getpoint "\nfirst point: ")
  6. ;  pt2 (getpoint "\nsecond point: " pt1)
  7. ;(while
  8. ;  (/= (car (setq pt3 (grread 'T 1 0))) 3)
  9. ;  (if (leftright-p pt1 pt2 (cadr pt3))
  10. ;    (princ "\nyou are left: ")
  11. ;    (princ "\nyou are right: ")
  12. ;  )
  13. ;returns T=left nil=right
  14. (defun leftright-p
  15. ( pt1 pt2 pt3 /
  16.    area
  17. )
  18. (setq area
  19.    (+
  20.      (- (* (car pt1) (cadr pt2)) (* (cadr pt1) (car pt2)))
  21.      (- (* (cadr pt1) (car pt3)) (* (car pt1) (cadr pt3)))
  22.      (- (* (car pt2) (cadr pt3)) (* (car pt3) (cadr pt2)))
  23.    )
  24. )
  25. (and
  26.    (> area 0)
  27.    (not (equal area 0 0.0000001))
  28. )
  29. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-12 12:04 , Processed in 1.077483 second(s), 74 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表