乐筑天下

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

[编程交流] (3) 三维点到UCS拉伸

[复制链接]

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 10:29:46 | 显示全部楼层 |阅读模式
给定(3)个非共线的唯一3D点,我需要计算由这3个点组成的平面的组210拉伸值:
 
  1. (setq p10 '(2 2 2)
  2.      p11 '(4 2 2)
  3.      p12 '(4 2 4))

 
将返回'(0-1 0)或'(0 1 0)
 
我知道我在遥远的过去见过这个公式,但它早已从我的脑海中消失了。
 
我可能可以通过UCS命令和(trans)来实现,但这很粗糙。TIA-David
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:35:40 | 显示全部楼层
没有检查共线性,但我将把它留给你:
 
  1. ;; Vector normal (Lee Mac)
  2. (defun normal ( p1 p2 p3 )
  3. (one (vcv (mapcar '- p3 p2) (mapcar '- p3 p1)))
  4. )
  5. ;; Vector x Scalar (Lee Mac)
  6. (defun vxs ( v s )
  7. (mapcar '(lambda ( n ) (* n s)) v)
  8. )
  9. ;; Vector norm (Lee Mac)
  10. (defun nrm ( v )
  11. (sqrt (apply '+ (mapcar '(lambda ( n ) (* n n)) v)))
  12. )
  13. ;; Unit Vector (Lee Mac)
  14. (defun one ( v )
  15. ( (lambda ( n ) (if (equal 0.0 n 1e-14) nil (vxs v (/ 1.0 n)))) (nrm v))
  16. )
  17. ;; Vector Cross Product (Lee Mac)
  18. (defun vcv ( u v )
  19. (list
  20.    (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  21.    (- (* (car  v) (caddr u)) (* (car  u) (caddr v)))
  22.    (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  23. )
  24. )
  1. _$ (normal p10 p11 p12)
  2. (0.0 1.0 0.0)
回复

使用道具 举报

10

主题

109

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 10:40:32 | 显示全部楼层
和往常一样,李·麦克在这方面领先我,但这是吉尔的代码,它可能会满足你的需要。
 
  1. ;; AnglePlanePlane
  2. ;; Returns the angle (radians) between two planes (using Al Kashi theorem)
  3. ;; the returned angle is always between 0 and pi radians
  4. ;;
  5. ;; Arguments: the single unit normal vectors of the planes
  6. (defun AnglePlanePlane (nor1 nor2)
  7. ((lambda (d)
  8.     (acos (/ (- 2 (* d d)) 2))
  9.   )
  10.    (distance nor1 nor2)
  11. )
  12. )
  13. ;;; Acos
  14. ;;; Returns the Arc Cosine of number
  15. ;;;
  16. ;;; Argument: a number between -1 and 1
  17. (defun acos (num)
  18. (cond
  19.    ((equal num 1 1e-9) 0.0)
  20.    ((equal num -1 1e-9) pi)
  21.    ((< -1 num 1)
  22.     (atan (sqrt (- 1 (expt num 2))) num)
  23.    )
  24. )
  25. )
  26. ;; CrossProduct
  27. ;; Returns the cross product (vector) of two vectors
  28. ;;
  29. ;; Arguments: two vectors
  30. (defun CrossProduct (v1 v2)
  31. (list    (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
  32.    (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
  33.    (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
  34. )
  35. )
  36. ;; Normalize
  37. ;; Returns the single unit vector of a vector
  38. ;;
  39. ;; Argument : un vecteur
  40. (defun Normalize (v)
  41. ((lambda (l)
  42.     (if (/= 0 l)
  43.       (mapcar (function (lambda (x) (/ x l))) v)
  44.     )
  45.   )
  46.    (distance '(0 0 0) v)
  47. )
  48. )
  49. ;; Norm_3Points
  50. ;; Returns the single unit normal vector of a plane definedby 3 points
  51. ;;
  52. ;; Arguments: three points
  53. (defun norm_3pts (p0 p1 p2)
  54. (Normalize (CrossProduct (mapcar '- p1 p0) (mapcar '- p2 p0)))
  55. )
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 10:41:18 | 显示全部楼层
 
从那里尝试一个函数:
 
http://www.caduser.ru/forum/index.php?PAGE_NAME=read&FID=2&TID=32826
 
  1. ;; (return normal to plane defined by 3 points)
  2. ;**********************************************************
  3. ; Вектор нормали к плоскости. Плоскость задана 3-мя точкам,
  4. ;**********************************************************
  5. ; P1, P2, P3 - точки
  6. ; Возвращает вектор нормали. (P1 P2 P3 не на одной прямой)
  7. ;Примечание: в большинстве функций библиотеки полскость задается точкой и вектором нормали к ней
  8. ;Если в Вашем случае плоскость задана 3-мя точками используйте эту функцию для вычисления вектора нормали
  9. (defun 3d_WNormp (P1 P2 P3 / W1 W2)
  10. (setq W1 (mapcar '- P2 P1)
  11.        W2 (mapcar '- P3 P2)
  12. )
  13. (list (- (* (cadr W1)(caddr W2)) (* (caddr W1)(cadr W2)))
  14.        (- (* (caddr W1)(car W2)) (* (car W1)(caddr W2)))
  15.        (- (* (car W1)(cadr W2)) (* (cadr W1)(car W2)))
  16. )
  17. )

 
~'J'~
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:47:38 | 显示全部楼层
全部使用向量叉积,只有mine和Giles归一化生成的垂直向量。
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 10:51:00 | 显示全部楼层
谢谢
 
吉尔看起来有点眼熟,但不完全是。李要好好学习!
 
  1. ;;;Are Points CoLinear
  2. ;;;ARG -> 3 Points and Fuzz
  3. ;;;RET -> T nil
  4. (defun is_pt_colinear (p1 p2 p3 fz)
  5. (or (equal (distance p1 p3)
  6.             (+ (distance p1 p2)
  7.                (distance p2 p3)) fz)
  8.      (equal (distance p1 p2)
  9.             (+ (distance p1 p3)
  10.                (distance p3 p2)) fz)
  11.      (equal (distance p2 p3)
  12.             (+ (distance p1 p2)
  13.                (distance p1 p3)) fz)))

 
-大卫
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:55:35 | 显示全部楼层
略带简洁:
 
  1. ;; Collinearity check (Lee Mac)
  2. (defun isCollinear ( p1 p2 p3 fz )
  3. (equal (rem (angle p1 p2) pi) (rem (angle p2 p3) pi) fz)
  4. )
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 10:56:08 | 显示全部楼层
 
 
我认为这只适用于2d点_大卫
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:59:59 | 显示全部楼层
 
说得好。
回复

使用道具 举报

10

主题

109

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 11:05:44 | 显示全部楼层
真的需要共线检查吗?使用gile代码,共线点集返回零。还有什么可能出错?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-6 17:35 , Processed in 0.473021 second(s), 72 queries .

© 2020-2025 乐筑天下

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