lzz0517 发表于 2012-6-16 15:48:44

本帖最后由 lzz0517 于 2012-6-16 15:50 编辑

法线矢量为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轴矢量呢

highflybird 发表于 2012-6-16 20:17:56

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就好办些。 有空时候,我说一下这个矩阵的来源。

lzz0517 发表于 2012-6-17 21:54:42

嗯,静待佳音!

highflybird 发表于 2012-6-20 10:20:52

假设一个法线矢量为'(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)
)
)

lzz0517 发表于 2012-6-20 14:48:52

矢量 的x 和y 数值都大于0.015625,就用 ‘(0 0 1) 跟 '(0.218218 0.436436 0.872872) 叉积,
否则要用 '(0 1 0)跟它叉积这里有个问题,就是这个判断条件是从哪里得到的呢?那本参考书上有介绍呢?根据你的说明,这个矩阵的来历我差不多懂了,只是还有剩下这个问题!

highflybird 发表于 2012-6-21 00:07:27

lzz0517 发表于 2012-6-20 14:48 static/image/common/back.gif
这里有个问题,就是这个判断条件是从哪里得到的呢?那本参考书上有介绍呢?根据你的说明,这个矩阵的来历 ...

这个是经验数,根据lisp的trans函数得到的。
估计是为了避免 出现'(0 0 1) 跟'(0 0 1) 叉积的结果为 ‘(0 0 0) 这样的情况出现。
所以,对这个经验数字我也了解不多。但的确要这么做,在CAD不这么做,就会变换出错。

lzz0517 发表于 2012-6-21 15:51:33

非常感谢你的回答,让我走出计算块中椭圆弧起始角度与终止角度的误区!让我找到正确的DXF转换方法!

chenlight 发表于 2012-12-2 23:53:23

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. ”
能不能提供下这个网页的内容呀!谢谢!

highflybird 发表于 2012-12-4 12:10:25

chenlight 发表于 2012-12-2 23:53 static/image/common/back.gif
这个网页现在打不开了!
显示“The topic or board you are looking for appears to be either missing...

需要注册用户才能打开这个网页。

zdqwy19 发表于 2012-12-6 07:12:48

RE: 椭圆弧旋转后计算角度问题

highflybird 发表于 2012-12-4 12:10 static/image/common/back.gif
需要注册用户才能打开这个网页。

Vlisp好象有获得椭圆弧圆心、起点、终点、长轴矢量、短轴矢量这五个点的函数,比用组码方便多了。另外那个网站停止注册了?
页: 1 2 3 4 5 6 7 8 9 10 [11]
查看完整版本: 椭圆弧旋转后计算角度问题