|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
$ y9 D1 m4 P$ P% K: r- s. p5 c
" Y+ X, L5 S' U! ?! U% c. f' Q
+ K/ u0 y8 f; U+ L9 s# \#include <math.h> 4 x+ ]& t9 m0 j& @7 k3 d
//矩阵复制
# J2 a: i E% y# x; ^& Y4 _void Project_Matrix_Copy(double from_mtx[4][4], double to_mtx[4][4])
$ z- ~$ t+ J1 x) u- v' M{0 b3 E8 s6 v; p/ Q: ^3 G3 c+ E6 c
int i,j;
* ~! t: z. X5 x, j0 d0 g
; X( |/ u3 l3 Y) D4 {, m for(i=0;i<4;i++)4 x, S0 w5 U, |
for(j=0;j<4;j++)
$ [ b; y6 k" B5 G" ] to_mtx[i][j]=from_mtx[i][j];1 \1 o, A+ r* e* X
}! e8 \8 C7 o0 O' y' m
//矩阵初始化
. x' x+ c7 Y, { i, dvoid Project_Matrix_Identity(double mtx[4][4])6 r% U: K/ A U' }
{. }' Y1 e* L" I- e0 U5 z
int i,j;
( m0 E6 o( j5 m. y% z * f# p$ {- D1 Z9 W
for(i=0;i<4;i++)( T8 i9 ]+ X) {9 D+ T
for(j=0;j<4;j++), D6 q3 @; J: R8 P# b5 A, l
if(i==j)' x4 v# S+ }9 s& E- o, D4 L
mtx[i][j]=1.0;& |& j4 Y1 j7 D8 \) k' S
else
' C6 g. f8 ?* h- I' B mtx[i][j]=0.0;
+ K8 o7 o' t% |5 E}
: K, Z. U$ h/ S//矩阵相乘7 P' m: Z; z7 E% C
void Project_Matrix_Product(double left_mtx[4][4],double right_mtx[4][4],double get_mtx[4][4]). M) P# O. p) {3 h+ \
{
; J g& ?/ T, \! Q& P$ _4 b/ \# _% P0 Y. Z
int i,j,k;5 P, L0 P) ~; L1 q6 n2 \
double left[4][4],right[4][4];
) B7 ]( Q& n5 A) w+ h- U4 }
. j" Q# o, ]8 a! \. [ Project_Matrix_Copy(left_mtx,left);% j M7 H3 i; h5 c) t
Project_Matrix_Copy(right_mtx,right);8 b, c% |( N- D; _
for(i=0;i<4;i++)& x9 t: Q* I# U* K7 O6 J
for(j=0;j<4;j++)4 @9 d2 _4 t' H
{' Q$ \& @/ T# [- ?
get_mtx[i][j]=0.0;
, c! s; v9 t2 {- |8 O% H8 a* K @ for(k=0;k<4;k++)
+ o* x* ?" x# [2 Q5 j! a get_mtx[i][j]+=left[i][k]*right[k][j];. Q+ ]1 W. c5 [ m- R) O
}# }$ ?# G0 J) V% V# C1 {
}1 ~3 Z6 V3 [8 j; L
//转置矩阵4 E" S* R0 Z( m+ Q0 Z- t0 B
void Project_MatrixGet_Transpose(double mtx[4][4],double transpose_mtx[4][4])# q" G1 _9 m) W# q
{
) f. a! D: X0 E3 n( N$ v int i,j;
1 T% a9 J5 ^! @+ T/ Q1 M: z8 G3 X for(i=0;i<4;i++)
& E3 j* P6 ]% f" J2 ]% q6 M. { {* q, H, ?2 q$ w" q+ R2 W( j1 f0 ]
for(j=0;j<4;j++)
; x6 j! s u" W) W- O {
9 {+ h& s9 k) O2 K. n5 M transpose_mtx[i][j]=mtx[j][i];
7 g8 r6 |0 a1 ]# A }/ t4 I0 e, B# r/ t( C6 M- F
}5 v) z1 C+ X) S& I# v- V
}( l$ Y8 _( C( L5 L7 q7 C( V( c
//从11元组获取变换矩阵
$ a4 j0 y0 z9 P2 m' x5 L$ y+ | wvoid Project_Matrix_Get_From_Move(double translation[3],double point[3],double rotation[3],double angle,double pos[4][4])9 m6 x- N9 E+ {. {5 @, s
{3 l X; T4 V$ a/ D8 A
' k P' C# [6 }9 b3 g5 [* [6 m //Project_Matrix_Get_Rotation(rotation,point,angle,pos);: ~1 r* b8 }; z3 i0 u6 X3 c( H' k# N
int i,j;
( Z/ C0 `* Y1 ~' k3 _) K for(i=0;i<4;i++)4 i1 T) }0 e6 m5 X
for(j=0;j<4;j++)
9 e( B) _* w) @- Y& {" m if(i==j)
9 M2 \$ w. L/ C( l pos[i][j]=1.0;( M' W) E& v) ?5 @5 q
else
( V1 X: d$ X; c, T pos[i][j]=0.0;0 n& _# L5 B$ U$ n9 J$ R+ `
pos[3][0]+=translation[0];
: E. t1 }; b3 X& T. p6 } pos[3][1]+=translation[1];* J! ?# B: \9 T
pos[3][2]+=translation[2];
$ p6 }1 {* M/ t9 O% p) I* x}* |* c& n% t+ `7 X' z7 [
//向量缩放
+ M% V& T2 A% r" f- l' s/ U" dvoid Project_Vector_Scale(double a[3],double scale,double b[3])2 J2 M. ^0 k8 l6 v( b% L4 ^) W
{
: _8 m* q2 p. a. i3 w4 _ b[0]=a[0]*scale;* w7 G0 c! ~% i8 ~$ K
b[1]=a[1]*scale;
) L# m2 D. e L! P b[2]=a[2]*scale;. Y! F- h$ A, U
}/ d+ g: p/ e. G% |: H
5 C. ]2 u/ x0 b- x5 x4 r3 Y$ R |
|