mardi 27 octobre 2009

Distance entre deux éléments situés dans 2 espaces différents projettés l'un sur l'autre

#include
#include
#include



using namespace std;




float calcDistance(int num_pop_a, int num_pop_b, float* c_a,
           float* c_b, int d_a,int d_b,int***mapping){
  int d_max;
  if(d_a > d_b)
    d_max = d_a;
  else
    d_max = d_b;

  float* dists = new float[d_max];
  for(int i = 0; i < d_max; ++i)
    if((mapping[num_pop_a][num_pop_b][2*i] == -1) ||
       (mapping[num_pop_a][num_pop_b][(2*i)+1] == -1))
      dists[i] = 0;
    else
      {
    dists[i] = c_b[mapping[num_pop_a][num_pop_b][(2*i)+1]] - c_a[mapping[num_pop_a][num_pop_b][2*i]];
    dists[i] *= dists[i];
      }
  float distance = 0;
  for(int i = 0; i < d_max; ++i)
    distance += dists[i];

  return sqrt(distance);
}

//Fournir la distance entre 2 points situés dans des espaces de dimension kkonque.
// Si dimension différente pour les 2 espaces, les distances dans les dimension n'existant pas
//dans un des espaces sont nulles.
//Un "mapping" des coordonnées entre les espaces contenant l'élément pré et l'élément post est fourni
int main(int argc, char* argv[]){

  int dim_e_A = 1;
  int dim_e_B = 2;

  float* coords_p_A = new float[dim_e_A];
  float* coords_p_B = new float[dim_e_B];

  //tableau contenant une matrice 2D représentant
  // les projections possibles entre les espaces considérés
  // ici A est dans un espace et B dans un autre
  int*** mapping = new int**[2];

  //Projections de l'espace de A
  mapping[0] = new int*[2];
  //Projections de l'espace de B
  mapping[1] = new int*[2];

  //Projection qu'on utilise ici A -> B
  mapping[0][1] = new int[4];

  //On indique dans la 3eme dimension du tableau
  // les correspondances entre les dimensions des deux espaces
  // considérés.
  // Ici : A : 1 coords (X:0), B : 2 coords : (X:0,Y:1)
  //le -1 indique 'pas de coordonnées'
  //Dans cet exemple, X_A correspond à X_B
  //mapping[0][1][0] = 0;
  //mapping[0][1][1] = 0;
  //mapping[0][1][2] = -1;
  //mapping[0][1][3] = 1;

  //Dans cet exemple, X_A correspond à Y_B
  mapping[0][1][0] = -1;
  mapping[0][1][1] = 0;
  mapping[0][1][2] = 0;
  mapping[0][1][3] = 1;

  coords_p_A[0] = 2;

  coords_p_B[0] = 1;
  coords_p_B[1] = 5;

  float distance = calcDistance(0,1,coords_p_A,coords_p_B,dim_e_A,dim_e_B,mapping);

  cout << "distance A - B = " << distance << endl;
  return 1;
};

Aucun commentaire:

Enregistrer un commentaire