#pragma once
#include
#include
#include
typedef float matrix33 [3][3];
// hang so PI
#define M_PI 3.14159265358979
// macro doi tu do --> radian
#define RAD(goc) ((goc)*(M_PI/180.0))
// macro doi tu radian --> goc
#define GOC(rad) ((rad)*180.0/M_PI)
// ham lam tron
#define ROUND(n) ((int)(n+0.5))
void matrix_zezo(matrix33 m)
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
m[i][j]=0;
}
void matrix_id(matrix33 m)
{
matrix_zezo(m);
m[0][0]=m[1][1]=m[2][2]=1;
}
void mul_matrix(float x,float y,matrix33 m,float &xout,float &yout)
{
xout = x*m[0][0] +y*m[1][0] + m[2][0];
yout = x*m[0][1] +y*m[1][1] + m[2][1];
}
void mul_matrix(matrix33 ma,matrix33 mb,matrix33 mout)
{
matrix33 mtmp;matrix_zezo(mtmp);
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
float sum=0;
for(int k=0;k<3;k++)
{
sum+=ma[i][k]*mb[k][j];
}//k
mtmp[i][j] =sum;
}//j
}//i
memcpy(mout,mtmp,sizeof(mtmp));
}
void matrix_translate(matrix33 m,float dx,float dy)
{
matrix33 mtmp;matrix_id(mtmp);
mtmp[2][0]=dx;mtmp[2][1]=dy;
mul_matrix(m,mtmp,m);
}
void matrix_scale(matrix33 m,float sx,float sy)
{
matrix33 mtmp;matrix_id(mtmp);
mtmp[0][0]=sx;mtmp[1][1]=sy;
mul_matrix(m,mtmp,m);
}
void matrix_rotate(matrix33 m,float angle)
{
matrix33 mtmp;matrix_id(mtmp);
mtmp[0][0]=(float)cos(RAD(angle));mtmp[0][1]=(float)sin(RAD(angle));
mtmp[1][0]=(float)-sin(RAD(angle));mtmp[1][1]=(float)cos(RAD(angle));
mul_matrix(m,mtmp,m);
}
void matrix_rotate(matrix33 m,float angle,float x,float y)
{
matrix_translate(m,-x,-y);
matrix_rotate(m,angle);
matrix_translate(m,x,y);
}
void matrix_reflectiion(matrix33 m,float ox,float oy)
{
matrix33 mtmp;matrix_id(mtmp);
mtmp[0][0]=ox;mtmp[1][1]=oy;
mul_matrix(m,mtmp,m);
}
void matrix_shear(matrix33 m,float shx,float shy)
{
matrix33 mtmp;matrix_id(mtmp);
mtmp[0][1]=shx;mtmp[1][0]=shy;
mul_matrix(m,mtmp,m);
}
vui longtest lai