hubeiwdlue 发表于 2023-8-30 13:17:26

trans函数的疑惑

;;;计算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函数怎么解释,我只知道用来转换坐标,但这里是另外一种用法,完全看不懂。

vormittag 发表于 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 就好了啊。



nijiea123 发表于 2023-9-1 10:40:06

通俗易懂,不错不错呀,看来数学肯定学的不错:D-

wide 发表于 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)
[*]      )
[*]    )
[*])
[*])

飞雪神光 发表于 2023-8-30 13:49:32

我也看不懂但是受益匪浅 代码我收了

hubeiwdlue 发表于 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 16:25:28

本帖最后由 树櫴希德 于 2023-8-30 18:54 编辑

(setq p1 (getpoint"\n please select a point:"))
(setq p2 (getpoint p1 "\n please select a point:"))
(setq cp (getpoint "\n please select a point:"))
(setq      norm (mapcar '- p2 p1) )

(setq pp (trans cp 0 norm))

      (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) 是将...

必须收藏 赞

renxianjing 发表于 2023-8-30 18:03:02

厉害,明白了。

sncokina 发表于 2023-8-31 08:39:01

点赞,关注+收藏。{:1_1:}

mituzhe 发表于 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) 是将...

受教了,大佬出马解释,基本知道原理了

960322 发表于 2023-9-1 02:01:00

厉害,说得清楚明白,学些了,多谢
页: [1] 2
查看完整版本: trans函数的疑惑