法线矢量为Az(0,0,-1),假定Y轴矢量为Ay(0,1,0),则X轴矢量为Ax=Ay X Az=(-1,0,0);然后我们就能用这个矩阵进行坐标轴的求解了吗?即
|Ax.xAy.x Az.x| |-1 00 |
(x,y,z) * |Ax.yAy.y Az.y| 代入上面的矩阵为(x,y,z) * |010 | =(-x,y,-z), 这个就是我们要求的结果吗
|Ax.zAy.z Az.z| |00 -1 |
如果不是这样进行求解,那么你说的那个矩阵又是怎么求得的呢?为什么是假定Y轴矢量,而不是假定X轴矢量呢 lzz0517 发表于 2012-6-16 15:48 static/image/common/back.gif
法线矢量为Az(0,0,-1),假定Y轴矢量为Ay(0,1,0),则X轴矢量为Ax=Ay X Az=(-1,0,0);然后我们就能用这 ...
关于如何从法线矢量得到 变换矩阵,一下子说起来真得很麻烦。
如果你懂lisp就好办些。 有空时候,我说一下这个矩阵的来源。 嗯,静待佳音! 假设一个法线矢量为'(12 4)把这个矢量化为单位矢量得到ZDir : '(0.218218 0.436436 0.872872)
因为这个矢量 的x 和y 数值都大于0.015625,就用 ‘(0 0 1) 跟 '(0.218218 0.436436 0.872872) 叉积,
否则要用 '(0 1 0)跟它叉积。 这样结果是: ‘(-0.436436 0.218218 0.0) ,把这个再单位矢量化,
得到XDir : (-0.894427 0.447214 0.0)
用ZDir跟XDir 叉积,得到 '(-0.39036 -0.78072 0.48795) ,再把这个单位矢量化(可以省略这一步的)
得到YDir ‘(-0.39036 -0.78072 0.48795) ,因而,得到变换矩阵为为:
( (-0.894427 0.447214 0.0)
(-0.39036 -0.78072 0.48795)
(0.218218 0.436436 0.872872)
)
这个就是变换矩阵.
以下为LISP代码:
;;;example : (OcsMatrix '(1 2 4))
;;; OcsMatrix
;;; Returns the OCS 3x3 matrix (X, Y, Z vectors) from an 'extrusion vector' (zdir)
;;; the matrix is calculated with the arbitrary axis algorythm.
;;
;; Argument : the 'extrusion direction' vector
(defun OcsMatrix (zdir / xdir)
(or (= 1.0 (distance '(0 0 0) zdir))
(setq zdir (Normalize zdir))
)
(if (and (< (abs (car zdir)) 0.015625)
(< (abs (cadr zdir)) 0.015625)
)
(setq xdir (Normalize (CrossProduct '(0 1 0) zdir)))
(setq xdir (Normalize (CrossProduct '(0 0 1) zdir)))
)
(list xdir (Normalize (CrossProduct zdir xdir)) zdir)
)
;; CrossProduct
;; Returns the cross product (vector) of two vectors
;;
;; Arguments : two vectors
(defun CrossProduct (v1 v2)
(list(- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
(- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
(- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
)
)
;; Normalize
;; Returns the single unit vector
;;
;; Argument : a vector
(defun Normalize (v)
((lambda (l)
(if (/= 0 l)
(mapcar (function (lambda (x) (/ x l))) v)
)
)
(distance '(0 0 0) v)
)
)
矢量 的x 和y 数值都大于0.015625,就用 ‘(0 0 1) 跟 '(0.218218 0.436436 0.872872) 叉积,
否则要用 '(0 1 0)跟它叉积这里有个问题,就是这个判断条件是从哪里得到的呢?那本参考书上有介绍呢?根据你的说明,这个矩阵的来历我差不多懂了,只是还有剩下这个问题! lzz0517 发表于 2012-6-20 14:48 static/image/common/back.gif
这里有个问题,就是这个判断条件是从哪里得到的呢?那本参考书上有介绍呢?根据你的说明,这个矩阵的来历 ...
这个是经验数,根据lisp的trans函数得到的。
估计是为了避免 出现'(0 0 1) 跟'(0 0 1) 叉积的结果为 ‘(0 0 0) 这样的情况出现。
所以,对这个经验数字我也了解不多。但的确要这么做,在CAD不这么做,就会变换出错。 非常感谢你的回答,让我走出计算块中椭圆弧起始角度与终止角度的误区!让我找到正确的DXF转换方法! highflybird 发表于 2012-5-30 10:22 static/image/common/back.gif
http://www.theswamp.org/index.php?topic=13526.0
这个网页现在打不开了!
显示“The topic or board you are looking for appears to be either missing or off limits to you.Please login below or register an account with TheSwamp. ”
能不能提供下这个网页的内容呀!谢谢! chenlight 发表于 2012-12-2 23:53 static/image/common/back.gif
这个网页现在打不开了!
显示“The topic or board you are looking for appears to be either missing...
需要注册用户才能打开这个网页。
RE: 椭圆弧旋转后计算角度问题
highflybird 发表于 2012-12-4 12:10 static/image/common/back.gif需要注册用户才能打开这个网页。
Vlisp好象有获得椭圆弧圆心、起点、终点、长轴矢量、短轴矢量这五个点的函数,比用组码方便多了。另外那个网站停止注册了?