|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
t% D' A* i$ p4 W
, n, o6 @( i3 m! z6 G- d$ ~. }( ? Q6 v8 ~6 G) {" x* ~8 L
#include <math.h>
; }. }! s1 p! s5 L( D& a( h//矩阵复制) C/ H. X- r! g# k7 t% q
void Project_Matrix_Copy(double from_mtx[4][4], double to_mtx[4][4]): k) D [! ^+ T/ n3 A
{
1 u* _5 y7 W5 o; P& U# J' O" Z. H int i,j;$ [: m& s# ]; F: s3 |
$ o5 k5 |! D/ p" Q5 O/ \) e! C for(i=0;i<4;i++)% K) J8 U' P& g2 \- y/ _
for(j=0;j<4;j++)
! z) w! M7 [* Z; l: j to_mtx[i][j]=from_mtx[i][j];) G; h* z0 n1 Z
}% d2 U( G7 X# [2 q
//矩阵初始化
* y" n1 P0 s; S! ^% n% F; O7 Svoid Project_Matrix_Identity(double mtx[4][4]). Q# b7 A, Y5 n- S4 V4 }4 ?
{
o- w3 g9 p$ Y! N8 o/ Y' ^8 ? int i,j;! E, N2 S1 ~& J' o0 n' S
! a& @; l% o6 y1 R, Z6 O- @ for(i=0;i<4;i++)4 o, m+ s* ~& y9 D& A
for(j=0;j<4;j++)
* ?& q3 d! D1 p3 c Q( s. I' [3 X( e if(i==j)$ d' i" p5 U% a/ |
mtx[i][j]=1.0;& i: z; y" x, D& ^3 i; g
else# p I5 o% ` X1 \, [
mtx[i][j]=0.0;" S8 N3 N/ n/ n3 ]* O2 k! f( v8 P
}! _2 i; E4 D+ }$ g) S- P# F
//矩阵相乘: J0 z& B+ G% b' d
void Project_Matrix_Product(double left_mtx[4][4],double right_mtx[4][4],double get_mtx[4][4])3 o: K1 r' O* a1 \
{
. v6 B: y* m' e y0 B1 Q) v4 `
; l1 i* d! y8 [; \ Z2 h6 ] int i,j,k;4 {$ j( q+ U* \+ s
double left[4][4],right[4][4];
2 a% D) A9 ~5 |4 b3 s0 g% Q) K' m0 i! G1 D# X3 ?, j
Project_Matrix_Copy(left_mtx,left);5 H1 `# q; L1 I0 j, x
Project_Matrix_Copy(right_mtx,right);' P) G) |" a C4 ]+ X6 r
for(i=0;i<4;i++)
% G' T0 a- A. g. S1 v w for(j=0;j<4;j++)
h' _# E3 E4 T3 f2 e7 K! P* b {
" o1 A% C: q& [9 V0 u! L% L get_mtx[i][j]=0.0;- G, J5 z" _# V" F
for(k=0;k<4;k++)- p8 o. Z% v8 c; |
get_mtx[i][j]+=left[i][k]*right[k][j];% p8 v( a8 \1 S$ m/ V
}2 A- U' r4 d% F
}
4 r$ i# i, M2 z9 ^/ e//转置矩阵. Y1 F# E) @' X' j! @4 X7 L
void Project_MatrixGet_Transpose(double mtx[4][4],double transpose_mtx[4][4])
8 X% Q% p) S; o2 @. `1 R7 G{4 k- a+ c$ L, W. J/ T7 a
int i,j;, E1 D. ]: }" H3 k" }6 g
for(i=0;i<4;i++)
) r: U& Z+ p: g0 \5 t3 m {* ~! q& L9 Y0 O
for(j=0;j<4;j++)
; R. r9 a6 x* c% [6 l- S* _! j+ G {9 \; l+ u8 u/ k! ~
transpose_mtx[i][j]=mtx[j][i];8 p; G& D4 {8 t- A0 q2 b) G
}2 ]5 C- P" q& d1 o
}
+ T `6 O- [# ?, w( |}. `. e' \4 i5 w% X0 p( x
//从11元组获取变换矩阵
6 [6 J9 z- o3 ovoid Project_Matrix_Get_From_Move(double translation[3],double point[3],double rotation[3],double angle,double pos[4][4])8 m+ b+ I0 o' m0 O
{; E5 v" w! b' Q- ?$ z# y
4 p+ Q8 w/ Z0 l4 {
//Project_Matrix_Get_Rotation(rotation,point,angle,pos);
& B2 U( j) e' G int i,j;
+ g( h% w1 @3 @; }7 ^& s for(i=0;i<4;i++)
! i$ J4 i; M( N& ^0 E, g for(j=0;j<4;j++)3 `6 [' K6 t+ R# F4 \: [7 j
if(i==j)4 N# x* i* S' H; o3 w, J$ n
pos[i][j]=1.0;* p7 A3 k# M# H+ P
else
: g) U( k" Y2 ] pos[i][j]=0.0;4 _$ `6 k' Z# h! P U
pos[3][0]+=translation[0];4 Z6 l, _+ @: B) {- Z
pos[3][1]+=translation[1];6 c; |8 b" ~# `
pos[3][2]+=translation[2];3 ^4 d" ?- a% H
}6 H3 X, u' o3 S9 v
//向量缩放
; u! ]7 `: ]: L. L* i9 ~# Fvoid Project_Vector_Scale(double a[3],double scale,double b[3])
- {. F; n) _3 D. j" W" M: h{% u [1 F' X* j3 @( Z! b/ ~! r
b[0]=a[0]*scale;* y! s2 _+ x% c: w1 z
b[1]=a[1]*scale;
B, Q3 Z. g5 }. |5 S) f2 U b[2]=a[2]*scale;' h5 U5 e B8 ^# c8 y5 u
}& c5 ~3 y6 d" E3 n) ]; N8 |
! y# T) e9 u- V- R: m7 H0 g
|
|