分享

Trans 函数的妙用

 pannel78 2018-05-26


     

  我们都知道,Trans函数可以将一个点的坐标值 (或一个位移量) 从某一坐标系统转换到另一个坐标系统。其语法是:

(trans pt from to [disp])

pt参数个含有三个实型数的串列, 可以解释成一个 3D 的点或一个 3D 的位移 (向量)。from 这个参数是一个代码 (Code), 代表 pt 所在的坐标系统, 而 to 这个参数也是一个代码, 代表 pt 所想要转换到的坐标系统 。disp 参数是可有可无的, 假如此参数存在而且其值并非 nil, 则 pt 所代表的就是一个 3D 的位移而不是一个点。下列所述的任何一个代码均可为 from 和 to 的参数。

    ● 下表所列出的是坐标系统整型数码:

坐标系统

通用坐标系统 (WCS)

用户坐标系统 (UCS)

显示:目前视区的 DCS (当使用码0或码1时)。目前模型空间视区的 DCS(当使用码3时)

图纸空间 DCS (只能在使用码2时使用)

其实参数 from、to还可以使用平面坐标系的定义Z轴即物体的法向量(normal vector),譬如:WCS的定义Z轴为:’(0 0 1),X、Y轴与Z轴遵循右手准则。

下图下图是计算直线P1P2与园的交点图示,黑色X-Y平面为WCS坐标系,红色的Z-X为Z轴经过P1P2的用户定义的UCS坐标系;

 

1、Z-X平面的法向量值:(mapcar '- p2 p1)

2、圆心CP到P1P2的垂足点P0在Z-X平面的坐标为:取P1投影到Z-X平面的X、Y值, CP投影到Z-X平面的Z值(此时实际已经计算得到点CP到直线P1P2的垂足点坐标), 计 算 半 弦 长 d =

√(R*R-Z0*Z0),Z0为CP投影到Z-X平面的X值。则交点J1、J2在Z-X平面的Z值为:P0在Z-X平面的Z值减去d和加上d,其X、Y值等于P1投影到Z-X平面的X、Y值。再将J1、J2投影回X-Y平面,即得到J1、J2的X-Y平面坐标。

3、特例情况:a:P0在园上 ,即直线和园相切

b:P0在园外,即直线和园不相交

********************************


;;;直线与园交点实现函数示例,参数:P 直线第一点、q直线第二点,C圆心点,R园半径;

(defun IntersLineCircle	 (p1 p2 cp r / p0 d n s)

  (setq	n  (mapcar '- p2 p1) ;_ 新投影面的法向量

	P1 (trans p1 0 n) ;_ P1坐标转换到新投影面n

	cp (trans cp 0 n) ;_ CP坐标转换到新投影面n

	p0 (list (car p1) (cadr p1) (caddr cp)) ;_ P0在新投影面坐标

	)

  (cond

    ((equal r (setq d (distance cp p0))) ;_ 直线和园相切

     (list (trans p0 n 0))

     )

    ((< d r) ;_ 相交

     (setq s (sqrt (- (* r r) (* d d))))

     (list

       (trans (list (car p1) (cadr p1) (- (caddr cp) s)) n 0) ;_ J1坐标

       (trans (list (car p1) (cadr p1) (+ (caddr cp) s)) n 0) ;_ J2坐标

       )

     )

    )

  )

;;;下面是计算点CP到直线P1P2的垂足点P0函数,很好理解了!

(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的坐标转换,可以省去很多复杂的数

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多