乐筑天下

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

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

[复制链接]

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:09:54 | 显示全部楼层
 
当然,由于平行向量的叉积是零向量。。。除了我不允许零范数,因此我用一个小补丁更新了我的代码
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2022-7-6 11:12:01 | 显示全部楼层
你好
规格化例程为0,0,0向量返回nil。
 
下面是一个例程,用于评估列表中的所有点是否共线(也适用于三维点)
 
  1. ;; Linearp (gile)
  2. ;; Evaluates if all points in the list are colinear
  3. ;;
  4. ;; Arguments: a points list
  5. (defun linearp (lst / v1 v2)
  6. (or
  7.    (null (cddr lst))
  8.    (and (or
  9.       (null (setq v1 (Normalize (mapcar '- (cadr lst) (car lst)))))
  10.       (null (setq v2 (Normalize (mapcar '- (caddr lst) (car lst)))))
  11.       (equal v1 v2 1e-9)
  12.       (equal v1 (mapcar '- v2) 1e-9)
  13.     )
  14.     (linearp (cdr lst))
  15.    )
  16. )
  17. )
  18. ;; Normalize
  19. ;; Returns the single unit vector of a vector
  20. ;;
  21. ;; Argument : a vector
  22. (defun Normalize (v)
  23. ((lambda (l)
  24.     (if (/= 0 l)
  25.       (mapcar (function (lambda (x) (/ x l))) v)
  26.     )
  27.   )
  28.    (distance '(0 0 0) v)
  29. )
  30. )
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 11:17:14 | 显示全部楼层
我不认为三个共线点可以创建一个平面。任何返回都会导致某种错误。所以零回报是正确的。至少在我看来。。。。只要它不会崩溃-大卫
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2022-7-6 11:19:36 | 显示全部楼层
 
这是CALCAD发布的例程的工作方式。
 
  1. (if (setq normal (Norm_3pts p1 p2 p3))
  2. (princ (strcat "\nThe normal vector is: " (vl-princ-to-string normal)))
  3. (princ "\np1 p2 p3 are colinear, they do not define a plane")
  4. )
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 11:23:21 | 显示全部楼层
吉尔,
 
是的,我明白了。
 
我们正在将3DAFCE集转换为可挤出实体:
 
  1. [b][color=BLACK]([/color][/b]and
  2. [b][color=FUCHSIA]([/color][/b]setq i -1
  3.       ss [b][color=NAVY]([/color][/b]ssget [color=#2f4f4f]"X"[/color] '[b][color=MAROON]([/color][/b][b][color=GREEN]([/color][/b]0 . [color=#2f4f4f]"3DFACE"[/color][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  4. [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]setq en [b][color=MAROON]([/color][/b]ssname ss [b][color=GREEN]([/color][/b]setq i [b][color=BLUE]([/color][/b]1+ i[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  5.         [b][color=NAVY]([/color][/b]setq ed [b][color=MAROON]([/color][/b]entget en[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  6.         [b][color=NAVY]([/color][/b]foreach p '[b][color=MAROON]([/color][/b]10 11 12 13[b][color=MAROON])[/color][/b]
  7.              [b][color=MAROON]([/color][/b]set [b][color=GREEN]([/color][/b]read [b][color=BLUE]([/color][/b]strcat [color=#2f4f4f]"P"[/color] [b][color=RED]([/color][/b]itoa p[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  8.                        [b][color=GREEN]([/color][/b]cdr [b][color=BLUE]([/color][/b]assoc p ed[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  9.         [b][color=NAVY]([/color][/b]setq ocs [b][color=MAROON]([/color][/b]cond [b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]not [b][color=RED]([/color][/b]is_pt_colinear p10 p11 p12 1e-8[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  10.                          [b][color=BLUE]([/color][/b]normal p10 p11 p12[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  11.                         [b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]not [b][color=RED]([/color][/b]is_pt_colinear p10 p11 p13 1e-8[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  12.                          [b][color=BLUE]([/color][/b]normal p10 p11 p13[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  13.                         [b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]not [b][color=RED]([/color][/b]is_pt_colinear p11 p12 p13 1e-8[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  14.                          [b][color=BLUE]([/color][/b]normal p11 p12 p13[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  15.                         [b][color=GREEN]([/color][/b]T nil[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  16.         [b][color=NAVY]([/color][/b]and ocs
  17.            [b][color=MAROON]([/color][/b]entmake [b][color=GREEN]([/color][/b]list [b][color=BLUE]([/color][/b]cons 0 [color=#2f4f4f]"SOLID"[/color][b][color=BLUE])[/color][/b][b][color=BLUE]([/color][/b]cons 62 256[b][color=BLUE])[/color][/b]
  18.                           [b][color=BLUE]([/color][/b]cons 6 [color=#2f4f4f]"BYLAYER"[/color][b][color=BLUE])[/color][/b][b][color=BLUE]([/color][/b]cons 39 0[b][color=BLUE])[/color][/b]
  19.                           [b][color=BLUE]([/color][/b]assoc 8 ed[b][color=BLUE])[/color][/b]
  20.                           [b][color=BLUE]([/color][/b]cons 10 [b][color=RED]([/color][/b]trans p10 0 ocs[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  21.                           [b][color=BLUE]([/color][/b]cons 11 [b][color=RED]([/color][/b]trans p11 0 ocs[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  22.                           [b][color=BLUE]([/color][/b]cons 12 [b][color=RED]([/color][/b]trans p13 0 ocs[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  23.                           [b][color=BLUE]([/color][/b]cons 13 [b][color=RED]([/color][/b]trans p12 0 ocs[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  24.                           [b][color=BLUE]([/color][/b]cons 210 ocs[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  25.            [b][color=MAROON]([/color][/b]entdel en[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  26. [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 
我们知道这些面是共面的,因为它们的生成方式不同,但不知道它们没有一对重合点(三边面)。所以我测试了不同的点组合来找到平面。我可能可以使用空测试来提高效率-大卫
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2022-7-6 11:29:40 | 显示全部楼层
如果在共线点的情况下,您的“正常”例程返回nil,您可以编写:
  1. (setq ocs (cond    ((normal p10 p11 p12))
  2.        ((normal p10 p11 p13))
  3.        ((normal p11 p12 p13))
  4.      )
  5. )

 
在我这边,处理3d面时,我宁愿将它们转换为只有p12等于p13的三角形面。
我编写了一个小例程,用这种方式转换3dfaces:
  1. ;; Triang3dFace
  2. ;; Divides a quadrangular 3d face into two triangular 3d faces and returns its ename
  3. ;; or 'normalise' a triangular one (3rd and 4th vertices overlapped) and returns nil.
  4. ;;
  5. ;; Argument : a 3d face (ENAME)
  6. (defun Triang3dFace    (f3d / p1 p2 p3 p4)
  7. (setq    elst (entget f3d)
  8.    p1   (cdr (assoc 10 elst))
  9.    p2   (cdr (assoc 11 elst))
  10.    p3   (cdr (assoc 12 elst))
  11.    p4   (cdr (assoc 13 elst))
  12. )
  13. (cond
  14.    ((equal p3 p4 1e-9) nil)
  15.    ((equal p1 p2 1e-9)
  16.     (entmod (subst (cons 11 p3)
  17.            (assoc 11 elst)
  18.            (subst (cons 12 p4) (assoc 12 elst) elst)
  19.         )
  20.     )
  21.     nil
  22.    )
  23.    ((equal p1 p4 1e-9)
  24.     (entmod (subst (cons 13 p3) (assoc 13 elst) elst))
  25.     nil
  26.    )
  27.    (T
  28.     (if (< (distance p2 p4) (distance p1 p3))
  29.       (progn
  30.     (entmod
  31.       (subst (cons 12 p4) (assoc 12 elst) elst)
  32.     )
  33.     (entmakex
  34.       (subst (cons 10 p2)
  35.          (assoc 10 elst)
  36.          (subst (cons 11 p3)
  37.             (assoc 11 elst)
  38.             (subst (cons 12 p4) (assoc 12 elst) elst)
  39.          )
  40.       )
  41.     )
  42.       )
  43.       (progn
  44.     (entmod (subst (cons 13 p3) (assoc 13 elst) elst))
  45.     (entmakex
  46.       (subst (cons 11 p3)
  47.          (assoc 11 elst)
  48.          (subst (cons 12 p4) (assoc 12 elst) elst)
  49.       )
  50.     )
  51.       )
  52.     )
  53.    )
  54. )
  55. )
  56. ;; TRIFACE
  57. ;; Converts selected 3d faces in 'normalised' triangular faces
  58. (defun c:TriFace (/ n ss ent)
  59. (if (and (setq n  -1
  60.         ss (ssget '((0 . "3DFACE")))
  61.       )
  62.      )
  63.    (while (setq ent (ssname ss (setq n (1+ n))))
  64.      (Triang3dFace ent)
  65.    )
  66. )
  67. (princ)
  68. )
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 11:33:20 | 显示全部楼层
吉尔,
 
这听起来很像3Dmax所做的。使用3dsout和3dsin,可以得到非常相似的结果。谢谢-大卫
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-6 20:46 , Processed in 0.441567 second(s), 64 queries .

© 2020-2025 乐筑天下

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