我们都知道,Trans函数可以将一个点的坐标值 (或一个位移量) 从某一坐标系统转换到另一个坐标系统。其语法是: (trans pt from to [disp]) pt参数个含有三个实型数的串列, 可以解释成一个 3D 的点或一个 3D 的位移 (向量)。from 这个参数是一个代码 (Code), 代表 pt 所在的坐标系统, 而 to 这个参数也是一个代码, 代表 pt 所想要转换到的坐标系统 。disp 参数是可有可无的, 假如此参数存在而且其值并非 nil, 则 pt 所代表的就是一个 3D 的位移而不是一个点。下列所述的任何一个代码均可为 from 和 to 的参数。 ● 下表所列出的是坐标系统整型数码:
其实参数 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) ) |
|