00001
00002 #include "2Dlib.h"
00003
00011 matriz IniMatrix (int n)
00012 {
00013 matriz matrix;
00014 int i;
00015
00016 matrix=(double**)malloc(n*sizeof(double*));
00017 for (i=0;i<n;i++){
00018 matrix[i]=(double*)calloc(n,sizeof(double));
00019 }
00020 return matrix;
00021 }
00022
00030 void FreeMatrix (matriz matrix,int n)
00031 {
00032 int i;
00033 for (i=0;i<n;i++) free (matrix[i]);
00034 free (matrix);
00035 }
00036
00044 void mulmat (matriz a, matriz b, matriz c)
00045 {
00046 int i,j,k;
00047
00048 for (i=0;i<3;i++){
00049 for (j=0;j<3;j++){
00050 c[i][j]=0.0;
00051 for(k=0;k<3;k++){
00052 c[i][j]=c[i][j]+(a[i][k]*b[k][j]);
00053 }
00054 }
00055 }
00056 }
00057
00065 void IniGiro (matriz matrix, double Angulo)
00066 {
00067 Angulo=(Angulo*PI)/180;
00068 matrix[0][0]=matrix[1][1]=cos(Angulo);
00069 matrix[0][1]=sin(Angulo);
00070 matrix[1][0]=-sin(Angulo);
00071 matrix[2][0]=matrix[2][1]=0;
00072 matrix[2][2]=1;
00073 }
00074
00085 void IniGiroRespectoPunto (matriz matrix, double Angulo, double x,double y)
00086 {
00087 double AnguloRAD;
00088
00089 AnguloRAD=(Angulo*PI)/180.0;
00090 IniGiro(matrix,Angulo);
00091 matrix[2][0]=-x*(1-cos(AnguloRAD))+y*sin(AnguloRAD);
00092 matrix[2][1]=y*(1-cos(AnguloRAD))+x*sin(AnguloRAD);
00093 }
00094
00102 void IniTraslacion (matriz matrix, double x, double y)
00103 {
00104 matrix[0][0]=matrix[1][1]=matrix[2][2]=1;
00105 matrix[2][0]=long(x);
00106 matrix[2][1]=long(y);
00107 }
00108
00115 void IniSimetriaX (matriz matrix)
00116 {
00117 matrix[0][0]=matrix[2][2]=1;
00118 matrix[1][1]=-1;
00119 }
00120
00127 void IniSimetriaY (matriz matrix)
00128 {
00129 matrix[1][1]=matrix[2][2]=1;
00130 matrix[0][0]=-1;
00131 }
00132
00140 void IniEscalado (double EscaladoX,double EscaladoY,matriz matrix)
00141 {
00142 matrix[0][0]=EscaladoX;
00143 matrix[1][1]=EscaladoY;
00144 matrix[2][2]=1;
00145 }
00146
00151 void IniEscaladoRespectoPunto (double EscaladoX,double EscaladoY,
00152 double X,double Y,matriz matrix)
00153 {
00154 IniEscalado (EscaladoX,EscaladoY,matrix);
00155 matrix[2][0]=X*(1-EscaladoX);
00156 matrix[2][1]=-Y*(1+EscaladoY);
00157 }
00158
00167 Pt2D MultVect (matriz matrix, Pt2D punto)
00168 {
00169 Pt2D p;
00170
00171 p.x=int((punto.x*matrix[0][0])+(punto.y*matrix[1][0])+(matrix[2][0]));
00172 p.y=int((punto.x*matrix[0][1])+(punto.y*matrix[1][1])+(matrix[2][1]));
00173 return p;
00174 }
00175
00182 matriz Inversa3X3 (matriz matrix)
00183 {
00184 double tmp;
00185 matriz resultado;
00186
00187 resultado=IniMatrix(3);
00188
00189 tmp=+(matrix[0][0]*matrix[1][1]*matrix[2][2])+(matrix[1][0]*matrix[0][2]*matrix[2][1])+(matrix[2][0]*matrix[0][1]*matrix[1][2])
00190 -(matrix[0][0]*matrix[1][2]*matrix[2][1])-(matrix[1][0]*matrix[0][1]*matrix[2][2])-(matrix[2][0]*matrix[0][2]*matrix[1][1]);
00191
00192 resultado[0][0]=((matrix[1][1]*matrix[2][2])-(matrix[1][2]*matrix[2][1]))/tmp;
00193 resultado[0][1]=-(((matrix[0][1]*matrix[2][2])-(matrix[0][2]*matrix[2][1]))/tmp);
00194 resultado[0][2]=((matrix[0][1]*matrix[1][2])-(matrix[0][2]*matrix[1][1]))/tmp;
00195 resultado[1][0]=-(((matrix[1][0]*matrix[2][2])-(matrix[1][2]*matrix[2][0]))/tmp);
00196 resultado[1][1]=((matrix[0][0]*matrix[2][2])-(matrix[0][2]*matrix[2][0]))/tmp;
00197 resultado[1][2]=-(((matrix[0][0]*matrix[1][2])-(matrix[0][2]*matrix[1][0]))/tmp);
00198 resultado[2][0]=((matrix[1][0]*matrix[2][1])-(matrix[1][1]*matrix[2][0]))/tmp;
00199 resultado[2][1]=-(((matrix[0][0]*matrix[2][1])-(matrix[0][1]*matrix[2][0]))/tmp);
00200 resultado[2][2]=((matrix[0][0]*matrix[1][1])-(matrix[0][1]*matrix[1][0]))/tmp;
00201 return resultado;
00202 }