Non-Static Objects [In progress]

Hi guys

This will be a small post since I only received on error message:

...\C++\RunningMan\CPlayer.cpp|208|error: 'class CCamera' has no member named 'SetPosition'|
||=== Build finished: 1 errors, 4 warnings (0 minutes, 0 seconds) ===|


I have a static object of the CCamera-class declared in CCamera-class ^^

PLEASE WAIT,Tomorrow I edit with more info

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
//Lapack

/*========================================================================
  FUNCIONES RELACIONADAS CON LA RESOLUCION DE SISTEMAS DE ECUACIONES
  ======================================================================== */

// INCLUSION DE LIBRERIAS NECESARIAS
#include <stdio.h>
#include "an_lapack.h"

// FUNCION PARA CALCULAR LA INVERSA DE UNA MATRIZ POR EL METODO DE GAUSS
Array2D< real > an_inversa(
  const Array2D< real > &A  /* MATRIZ */) 
{
  int N=A.dim1(); 
  if(N!=A.dim2()) return Array2D<real>();
  
  real max,paso,mul;
  int i,j,i_max,k;
  Array2D< real > PASO(N,2*N); 
  Array2D< real > A_1(N,N);
  
  for(i=0;i<N;i++){
    for(j=0;j<N;j++){
      PASO[i][j]=A[i][j];
      PASO[i][j+N]=0.;
    }
  }
  for(i=0;i<N;i++)
      PASO[i][i+N]=1.;

  for(i=0;i<N;i++){
    max=an_abs(PASO[i][i]);
    i_max=i;
    for(j=i;j<N;j++){
       if(an_abs(PASO[j][i])>max){
         i_max=j; max=an_abs(PASO[j][i]);
       }
    }

    if(max==0.){
      printf("Matriz No Invertible\n");
      return Array2D<real>();
    }
    if(i_max>i){
      for(k=0;k<2*N;k++){
        paso=PASO[i][k];
        PASO[i][k]=PASO[i_max][k];
        PASO[i_max][k]=paso;
      }
    }

    for(j=i+1;j<N;j++){
      mul=-PASO[j][i]/PASO[i][i];
      for(k=i;k<2*N;k++) PASO[j][k]+=mul*PASO[i][k];
    }
  }
  if(an_abs(PASO[N-1][N-1])==0.){
      printf("Matriz No-Invertible\n");
      return Array2D<real>();
    }

  for(i=N-1;i>0;i--){
    for(j=i-1;j>=0;j--){
      mul=-PASO[j][i]/PASO[i][i];
      for(k=i;k<2*N;k++) PASO[j][k]+=mul*PASO[i][k];
    }
  }
  for(i=0;i<N;i++)
    for(j=N;j<2*N;j++)
      PASO[i][j]/=PASO[i][i];

  for(i=0;i<N;i++)
    for(j=0;j<N;j++)
      A_1[i][j]=PASO[i][j+N];
      
  return(A_1);
}

// FUNCION PARA RESOLVER SISTEMAS POR EL METODO DE GAUSS
Array1D< real > an_gauss(
  const Array2D< real > &A  /* MATRIZ DEL SISTEMA */, 
  const Array1D< real > &b) /* VECTOR DE TERMINOS INDEPENDINENTES */
{
  
  real max,paso,mul;
  int i,j,i_max,k;
  
  //WE CHECK DIMENSIONS 
  if( A.dim1()!=A.dim2() || A.dim1()!=b.dim() ) return(Array1D< real >()); 
  
  int N=A.dim1();
  Array2D< real > PASO(N,N+1);
  Array1D< real > u=b.copy(); 

  // RELLENAMOS LA MATRIZ DE PASO
  for(i=0;i<N;i++){
    for(j=0;j<N;j++){
      PASO[i][j]=A[i][j];
    }
    PASO[i][N]=u[i];
  }

  // INICIAMOS EL PROCESO DE CONVERTIR EN CERO DE LA DIAGONAL HACIA ABAJO 
  for(i=0;i<N;i++){
    max=an_abs(PASO[i][i]);
    i_max=i;
    for(j=i;j<N;j++){
       if(an_abs(PASO[j][i])>max){
         i_max=j; max=an_abs(PASO[j][i]);
       }
    }
    if(max<10e-120){
      printf("Sistema no tiene Solucion 0\n"); 
      return(Array1D< real >());
    }
    if(i_max>i){
      for(k=0;k<=N;k++){
        paso=PASO[i][k];
        PASO[i][k]=PASO[i_max][k];
        PASO[i_max][k]=paso;
      }
    }
    for(j=i+1;j<N;j++){
      mul=-PASO[j][i]/PASO[i][i];
      for(k=i;k<=N;k++) PASO[j][k]+=mul*PASO[i][k];
    }
  }
  
  // INICIAMOS EL REMONTE PARA RESOLVER EL SISTEMA
  if(an_abs(PASO[N-1][N-1])<10e-120){
      printf("Sistema no tiene Solucion 1\n");
      return(Array1D< real >());
    }

  for(i=N-1;i>0;i--){
    for(j=i-1;j>=0;j--){
      mul=-PASO[j][i]/PASO[i][i];
      for(k=i;k<=N;k++) PASO[j][k]+=mul*PASO[i][k];
    }
  }
  for(i=0;i<N;i++)
      u[i]=PASO[i][N]/PASO[i][i];

  // printf("METODO DE GAUSS TERMINA BIEN\n"); 
  return(u);
}

// FUNCION PARA CALCULAR EL ERROR DEL SISTEMA
real an_error_sistema(const Array2D< real > &A, const Array1D< real > &u, const Array1D< real > &b)
{
   int i;
   if(b.dim()==0 || b.dim()!=u.dim() || b.dim()!=A.dim1() ||  b.dim()!=A.dim2()) return(0.); 
   Array1D< real > e=A*u-b;
   
   real Sum=0.;
   for (i=0;i<b.dim();i++){
      Sum = Sum + an_abs(e[i])/(an_abs(b[i])+ 1.);
   }
   return (Sum/b.dim());
}

/* FUNCION PARA LEER UN VECTOR DE DISCO. RETORNA LA DIMENSION DEL VECTOR */
int an_leer_vector(
  char *nombrefichero, 
   Array1D< real > &vector)
{ 
  int dimension; 
  float paso; 
  FILE *f; 
  
  // ABRIMOS EL FICHERO
  if(f=fopen( nombrefichero, "r"),!f){
    printf("Problema con la apertura del fichero\n");
    return -1; 
  } 
  
  // LEEMOS LA DIMENSION 
  fscanf(f,"%d\n",&dimension); 
  if(dimension<1) return(-2); 
  
  // COGEMOS MEMORIA 
   Array1D< real > v(dimension);
  
  // LEEMOS EL VECTOR 
  for(int i=0;i<dimension;i++){ 
    fscanf(f,"%f\n",&paso); 
    v[i]=paso; 
  }
  fclose(f); 
  vector=v.copy(); 
  return dimension; 
} 

/* FUNCION PARA ESCRIBIR UN VECTOR DE DISCO DE DIMENSION dimension Y LO ALMACENA EN vector */
int an_escribir_vector(
  char *nombrefichero, 
   Array1D< real > &vector) 
{ 
  int i; 
  FILE *f; 
  int dimension=vector.dim(); 
  if(f=fopen( nombrefichero, "w"),!f){
    printf("Problema con la escritura del fichero\n");
    return 1; 
  } 
  fprintf(f,"%d\n",dimension); 
  for(i=0;i<dimension;i++) fprintf(f,"%f\n",(float) vector[i]); 
  fclose(f); 
  return 0; 
} 
 
/* FUNCION PARA LEER UNA MATRIZ DE DISCO DE DIMENSION 
dimension Y LO ALMACENA EN LA MATRIZ matriz  */
int an_leer_matriz( 
  char *nombrefichero, 
  Array2D< real > &matriz)
{ 
  int dimension1,dimension2; 
  float paso; 
  FILE *f; 
  if(f=fopen( nombrefichero, "r"),!f){
    printf("Problema con la apertura del fichero\n");
    return 1; 
  } 
  fscanf(f,"%d %d\n",&dimension1, &dimension2); 
  if(dimension1<1 || dimension2<1) return(-1); 
  
  // RESERVAMOS MEMORIA PARA LA MATRIZ
  Array2D< real > m(dimension1,dimension2); 
  
  for(int i=0;i<dimension1;i++){  
    for(int j=0;j<dimension2;j++){ 
            
       fscanf(f,"%f ",&paso); 
       m[i][j]=paso; 
       //printf("paso=%e\n",(double) m[i][j]); 
    }
    fscanf(f,"\n");
  }   
  fclose(f); 
  matriz=m.copy(); 
  return dimension1; 
} 
 
/* FUNCION PARA ESCRIBIR UNA MATRIZ EN DISCO
dimension */
int an_escribir_matriz( 
  char *nombrefichero,
  Array2D< real > &matriz) 
{ 
  int i,j; 
  FILE *f; 
  if(f=fopen( nombrefichero, "w"),!f){
    printf("Problema con la escritura del fichero\n");
    return 1; 
  } 
  fprintf(f,"%d %d\n",matriz.dim1(),matriz.dim2()); 
  for(i=0;i<matriz.dim1();i++){  
    for(j=0;j<matriz.dim2();j++){ 
       fprintf(f,"%f ",(float) matriz[i][j]); 
    }
    fprintf(f,"\n");
  }     
  fclose(f); 
  return 0; 
} 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// METODO DE RELAJACION 
#include "an_relajacion.h"


//FUNCION QUE CALCULA LA SOLUCION DE UN SISTEMA POR EL METODO DE RELAJACION
// DEVUELVE EL NUMERO DE ITERACIONES QUE REALIZA. SI TERMINA CON ERROR DEVUELVE -1
int relajacion (
  const Array2D< real > &A, // MATRIZ DEL SISTEMA
  const Array1D< real > &b, // VECTOR INDEPENDIENTE DEL SISTEMA
  Array1D< real > &u, // SOLUCION INICIAL Y FINAL DEL SISTEMA
  const real w, //PARAMETRO DE RELAJACION
  const int nMax, // NUMERO MAXIMO DE ITERACIONES
  const real TOL // TOLERANCIA PARA PARAR EL ALGORITMO 
  )
{
  // COMPROBAMOS QUE LOS VECTORES Y MATRIZ SON DE LA MISMA DIMENSION
  if(A.dim1()!=A.dim2() || A.dim1()!=b.dim() || u.dim()!=b.dim() ){
    printf("relajacion() : VECTORES O MATRIZ DE DIFERENTE TAMAGNO \n"); 
  }
  
  // HACEMOS LAS ITERACIONES DEL ALGORITMO
  for(int n=1;n<=nMax;n++){
    // RECORREMOS LAS INCOGNITAS DE FORMA ASCENDENTE
    real error=0.; // variable para almacenar el error en la iteracion 
    for (int i=0;i<u.dim();i++){ 
      // RECORREMOS CADA FILA 
      real temp=b[i]; // variable para guardar el nuevo valor de u[i]
      for(int j=0;j<i;j++){
        temp -= A[i][j]*u[j];
      }
      for(int j=i+1;j<u.dim();j++){
        temp -= A[i][j]*u[j];
      } 
      temp=w*temp/A[i][i] + (1-w)*u[i];
      error+=an_distancia(u[i],temp); 
      u[i] = temp;
    }
    if ((error/u.dim())<TOL){  return n;}
  }
  return -1; 
}
Topic archived. No new replies allowed.