明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3679|回复: 18

[函数] trans函数的疑惑

[复制链接]
发表于 2023-8-30 13:17:26 | 显示全部楼层 |阅读模式
;;;计算cp到p1 p2的垂足点
(defun PerToLine  (cp p1 p2 / norm)
  (setq        norm (mapcar '- p2 p1)
        p1   (trans p1 0 norm)
        cp   (trans cp 0 norm)
        )
  (trans (list (car p1) (cadr p1) (caddr cp)) norm 0)
  )

请教各位大佬,这段代码的trans函数怎么解释,我只知道用来转换坐标,但这里是另外一种用法,完全看不懂。

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2023-8-30 14:10:01 | 显示全部楼层
本帖最后由 vormittag 于 2023-8-30 14:28 编辑

很简单:
1、(mapcar '- p2 p1) 是 p1 指向 p2 的向量,作为平面法向量 norm
2、(trans p1 0 norm) 是将 p1 从WCS 坐标转换为 以 norm 为法向量的 OCS 坐标,该坐标系原点与WCS相同,但是以 norm 为Z轴,显然垂足在 OCS 坐标系中的 x、y 坐标与 p1 在 OCS 坐标系下x、y 坐标对应相等。
3、(trans cp 0 norm) 将 cp 点的坐标从 WCS 转换到这个OCS,显然,垂足在 OCS 坐标系中的 z 坐标与 cp 在 OCS 坐标系下 z 坐标对应相等。
4、(trans (list (car p1) (cadr p1) (caddr cp)) norm 0) 把坐标组合起来,再转换回到WCS,齐活了。

从下面这个图里你可能更能看得明白,OXYZ 是世界坐标系 WCS,OX’Y’Z’ 是 对象坐标系 OCS,OZ’∥P1P2,显然,垂足 P 在 OCS 坐标系中的 x、y 坐标与 P1 一致(of course,也与P2 一致,用谁无所谓),P 在 OCS 坐标系中的 z 坐标与 CP 的 z 坐标一致。组装一下,然后转换回到 WCS 就好了啊。



本帖子中包含更多资源

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

x

评分

参与人数 7明经币 +7 收起 理由
magicheno + 1 很给力!
freedom_ice + 1
天天问 + 1 很给力!
USER2128 + 1 赞一个!
飞雪神光 + 1 赞一个!
xj6019 + 1 真是高手,这个函数太强大,我一直都是懵逼.
自贡黄明儒 + 1 很给力!

查看全部评分

回复 支持 8 反对 0

使用道具 举报

发表于 2024-5-3 15:00:53 | 显示全部楼层
本帖最后由 wide 于 2024-5-3 15:05 编辑
vormittag 发表于 2023-8-30 14:10
很简单:
1、(mapcar '- p2 p1) 是 p1 指向 p2 的向量,作为平面法向量 norm
2、(trans p1 0 norm) 是将  ...

http://bbs.mjtd.com/forum.php?mo ... %B1%EA%D7%A2&page=2,17楼代码中求中点部分能解释习吗?
  • (defun c:test1 (/ get_dim_mid ss n)
  •   (defun get_dim_mid (en / ent pt10 pt13 pt14 v pt13t)
  •     (setq ent  (entget en)
  •       pt10  (cdr (assoc 10 ent))
  •       pt13  (cdr (assoc 13 ent))
  •       pt14  (cdr (assoc 14 ent))
  •       v  (mapcar '- pt10 pt14)
  •       pt14  (trans pt14 0 v)
  •       pt13t  (trans pt13 0 v)
  •     )
  •     (mapcar
  •       '+
  •       pt10
  •       (mapcar '(lambda (x y) (* 0.5 (- x y)))
  •         pt13
  •         (trans (list (car pt14) (cadr pt14) (caddr pt13t)) v 0)
  •       )
  •     )
  •   )
  •   (setq ss (ssget))
  •   (repeat (setq n (sslength ss))
  •     (entmake
  •       (list (cons 0 "circle")
  •         (cons 10 (get_dim_mid (ssname ss (setq n (1- n)))))
  •         (cons 40 100)
  •       )
  •     )
  •   )
  • )

点评

找准 dxf 组码 10 13 14 分别代表的含义以后不难理解。  发表于 2024-5-6 09:40
发表于 2023-8-30 13:49:32 | 显示全部楼层
我也看不懂但是受益匪浅 代码我收了
 楼主| 发表于 2023-8-30 15:04:22 | 显示全部楼层
vormittag 发表于 2023-8-30 14:10
很简单:
1、(mapcar '- p2 p1) 是 p1 指向 p2 的向量,作为平面法向量 norm
2、(trans p1 0 norm) 是将  ...

谢谢您了,我看懂了。没有您详细的解释,光解释这个函数,估计我一时半会也明白不了。再次谢谢您。

点评

不客气  发表于 2023-8-30 15:13
发表于 2023-8-30 16:25:28 | 显示全部楼层
本帖最后由 树櫴希德 于 2023-8-30 18:54 编辑

  1. (setq p1 (getpoint"\n please select a point:"))
  2. (setq p2 (getpoint p1 "\n please select a point:"))
  3. (setq cp (getpoint "\n please select a point:"))
  4. (setq        norm (mapcar '- p2 p1) )

  5. (setq pp (trans cp 0 norm))

  6.       (trans '(12456 41785 15) 0 '(1933.41 1093.65 990.0))
vormittag 发表于 2023-8-30 14:10
很简单:
1、(mapcar '- p2 p1) 是 p1 指向 p2 的向量,作为平面法向量 norm
2、(trans p1 0 norm) 是将  ...

必须收藏 赞
发表于 2023-8-30 18:03:02 来自手机 | 显示全部楼层
厉害,明白了。
发表于 2023-8-31 08:39:01 | 显示全部楼层
点赞,关注+收藏。
发表于 2023-8-31 08:41:30 | 显示全部楼层
trans方法很巧妙啊.我之前写了一个,用向量方法的,显得麻烦一些了
发表于 2023-8-31 11:21:19 | 显示全部楼层
vormittag 发表于 2023-8-30 14:10
很简单:
1、(mapcar '- p2 p1) 是 p1 指向 p2 的向量,作为平面法向量 norm
2、(trans p1 0 norm) 是将  ...

受教了,大佬出马解释,基本知道原理了
发表于 2023-9-1 02:01:00 | 显示全部楼层
厉害,说得清楚明白,学些了,多谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-28 04:16 , Processed in 0.205544 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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