|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
- h1 l) o/ U0 }6 m0 O+ I
, R9 ~. w, }$ L9 P ?& v* L
. h" H3 I9 E' x) v- n8 {' U# j#include <math.h> 5 |. v" r& \7 n1 V! s H
//矩阵复制) h- _ g4 Z! B
void Project_Matrix_Copy(double from_mtx[4][4], double to_mtx[4][4])) o1 Z2 ~: \. K' j% y6 q9 i# p6 ]
{
5 I' I5 b# x" v5 f; z" f int i,j;( F, I- g2 x) x. p
( `! S" ]+ H" k2 m; h9 v for(i=0;i<4;i++)
, D: @$ [+ D& c7 | for(j=0;j<4;j++)3 q- S- q* X0 ?
to_mtx[i][j]=from_mtx[i][j];
9 M5 p- V/ ~+ S; P}' u: h; S* Q& r5 \/ b2 B+ }7 r7 U; G
//矩阵初始化4 F6 h- O1 `4 Y3 r. M+ e5 u
void Project_Matrix_Identity(double mtx[4][4])
4 P9 U1 ?7 Y. r) q{; j+ e3 ?& A7 M" t) @, S7 n. O4 R
int i,j;
3 m! @+ h- x( q8 m9 _+ Q, k! x% e * Y% e4 b% U5 k! H! H
for(i=0;i<4;i++)
" ?9 H8 {- N2 F. t for(j=0;j<4;j++)/ S6 F3 D" i# N
if(i==j)
# s) F+ y4 v( }& s0 S6 c mtx[i][j]=1.0;
1 K4 q1 f+ d- p& h1 y0 } else
' k3 w7 V- W+ k |/ o' y mtx[i][j]=0.0;
/ P; e8 K2 s2 w! E% z0 b8 q% P}3 y( ]' j2 c1 ^& ]% f% X) b6 p
//矩阵相乘2 V" F7 `+ y# }+ B5 H
void Project_Matrix_Product(double left_mtx[4][4],double right_mtx[4][4],double get_mtx[4][4])4 [. n z. {# \4 O# n( s
{( V; M/ m/ \, N# X+ k0 o
7 |, s1 I3 F u
int i,j,k;: p! v0 k0 }; Q o: d2 ]+ {. L9 O
double left[4][4],right[4][4];( E6 n9 `1 G4 A5 f
6 ]9 m6 k, h9 \4 M; E7 q
Project_Matrix_Copy(left_mtx,left);
% M( s Y8 X, Z U Project_Matrix_Copy(right_mtx,right);+ P8 ~( e% d7 U
for(i=0;i<4;i++)
" j5 j B& j5 a+ { for(j=0;j<4;j++)
: w* ?3 r2 {8 X- h/ H4 z {
O6 t' i1 G+ e6 B% W0 Q i get_mtx[i][j]=0.0;( }; E" q) P- ^& f, k5 \. @7 C5 s
for(k=0;k<4;k++)" X3 M$ `" b' {' A
get_mtx[i][j]+=left[i][k]*right[k][j];! T. B3 r, h! d
}
% U. }4 `: r' X6 _6 ]}" H" v/ A5 V- M: x5 T' Z4 D& v
//转置矩阵! q& |% b4 G6 \* W, w5 o0 ?
void Project_MatrixGet_Transpose(double mtx[4][4],double transpose_mtx[4][4])
8 A# J9 g" B' l% t{
. R' P/ E( B7 S$ w6 D* O, X int i,j;' _2 t8 X" y) v/ k- h8 m" [! G
for(i=0;i<4;i++)
1 H* [4 q# v" [! @& Q2 W {
% v) r& w4 ~9 W8 ~! i/ D1 E0 U for(j=0;j<4;j++)
2 t2 K/ B+ w- A z( Z {
7 x1 A% j; v7 m- p: R transpose_mtx[i][j]=mtx[j][i];
% r& r, t, n# W& y" h' P! p }( g; Z& {. C9 | k' m
}+ d) F7 v. z$ Z+ v& m& R
}
t+ c; E" e7 b+ t6 K# d5 \3 W//从11元组获取变换矩阵6 F# H5 ~& C/ i/ e0 c
void Project_Matrix_Get_From_Move(double translation[3],double point[3],double rotation[3],double angle,double pos[4][4])' M; d" @7 Q1 ~" s' D4 u0 w2 f
{
! b& y+ w. B: a/ c! r9 h( O2 o. N% P
//Project_Matrix_Get_Rotation(rotation,point,angle,pos);! N3 l) v% E$ M% ?! B+ ]' V! O
int i,j;
% }# L. P- a& R! k; P for(i=0;i<4;i++)- y8 f4 k% K7 W4 \4 v' h9 b
for(j=0;j<4;j++)
9 U) i- M) J- Q- }: O if(i==j)
2 B% V9 n7 r) W' h5 n pos[i][j]=1.0;: G, t ~6 O) T- ]- H1 D% l
else; i3 H. s; _7 c; U3 A
pos[i][j]=0.0;! r& W3 b+ _7 x, K
pos[3][0]+=translation[0];$ j5 ~6 i" b4 E+ J6 M& P0 N
pos[3][1]+=translation[1];
9 ^! F+ F8 W1 R; E3 ~ pos[3][2]+=translation[2];
W- P- ^5 g! t/ G- p}6 m; [# f5 G0 A2 G
//向量缩放
+ P6 m/ {; t2 w/ Fvoid Project_Vector_Scale(double a[3],double scale,double b[3])/ b. G% l4 C" R. u" H
{
& P# G5 O1 P' z! q" i b[0]=a[0]*scale;8 B4 v% l, q5 d p/ n( i
b[1]=a[1]*scale;7 s; x, ]7 N* p2 `6 R" L
b[2]=a[2]*scale;
& Q, P! Z3 X' k# y7 t8 |' t7 Q}8 L$ c: e, U( C Q. T( w
Q' }: ]8 u) t f |
|