Tableau dynamique 2D

Tableau dynamique 2D - C++ - Programmation

Marsh Posté le 13-04-2009 à 09:35:07    

Bonjour  :)  
 
J'essaie de manipuler un tableau 2D dont la 2ème colonne serait de taille variable. Autrement dit, la première colonne regrouperait les identifiants de mollécules tandis que la seconde, ceux de particules associées; le nombre de particules étant différent selon chaque mollécules...  
 
Dans le code ci-dessous, j'essaie d'associer l'identifiant d'une mollécule à un couple de particules, en fonctions des informations qu'elles contiennent ou non. Si aucune d'entre elles n'en possède on en crée un nouveau, sinon lorsqu'au moins l'une d'entre elle appartient déjà à une mollécule, l'autre prend alors le même identifiant molécullaire. En revanche, si chaque particule à un identifiant distinct, alors l'une d'entre elle prend le même identifiant molléculaire que l'autre mais doit supprimer sa référence associé à la mollécule antérieure:
 

Code :
  1. static vector< vector<int> > molles_A;//(1, vector<int>(NMAX));
  2. int molle_i=0;
  3. ...
  4. //------------------------------------------------------------------------------------------------
  5. void setMolleID( NxActor *A, NxActor *B )
  6. {
  7. ONE_o* oA = (ONE_o*)A->userData;
  8. int molIdA = oA->id_mol;
  9. ONE_o* oB = (ONE_o*)B->userData;
  10. int molIdB = oB->id_mol;
  11. if(  molIdA == NULL &&  molIdB == NULL ) //------ NOT YET
  12. {
  13.  updateMolles_A( 1, NULL, NULL, A, B );
  14.  ONE_o* oA = (ONE_o*)A->userData;
  15.       oA->id_mol = mol_i;
  16.  ONE_o* oB = (ONE_o*)B->userData;
  17.       oB->id_mol = mol_i;
  18.                mol_i ++;
  19. }
  20. else if(  molIdA != NULL &&  molIdB == NULL )//---- A
  21. {
  22.  updateMolles_A( 2, molIdA, NULL, NULL, B );
  23.   ONE_o* oB = (ONE_o*)B->userData;
  24.      oB->id_mol = molIdA;
  25. }
  26. else if(  molIdA == NULL &&  molIdB != NULL ) //---- B
  27. {  cerr << "{PhysicCORE::setMolleID} C)  molIdB != NULL " << endl;
  28.  updateMolles_A( 3, NULL, molIdB, A, NULL );
  29.  ONE_o* oA = (ONE_o*)A->userData;
  30.       oA->id_mol = molIdB;
  31. }
  32. else if(  molIdA != NULL &&  molIdB != NULL ) //---- A & B
  33. {
  34.  NxArray<NxJoint *> jtsA = getJOINTS_L( A );
  35.  NxArray<NxJoint *> jtsB = getJOINTS_L( B );
  36.  int A_T = jtsA.size();
  37.  int B_T = jtsB.size();
  38.  if( A_T > B_T )
  39.  {
  40.   updateMolles_A( 4, molIdA, molIdB, A, B );
  41.   ONE_o* oB = (ONE_o*)B->userData;
  42.        oB->id_mol = molIdA;
  43.  }
  44.  else if( A_T < B_T)
  45.  { 
  46.   updateMolles_A( 5, molIdA, molIdB, A, B );
  47.   ONE_o* oA = (ONE_o*)A->userData;
  48.          oA->id_mol = molIdB;
  49.  }
  50.  else //--- Devrait être arbitraire
  51.  { 
  52.   updateMolles_A( 6, molIdA, molIdB, A, B );
  53.   ONE_o* oA = (ONE_o*)A->userData;
  54.          oA->id_mol = molIdB;
  55.  }
  56. }
  57. }
  58. //----------------------------------------------------------------------------------------------
  59. void updateMolles_A( int md, int molIdA, int molIdB, NxActor *A=NULL, NxActor *B=NULL )
  60. {
  61. int t1 = molles_A.size();
  62. int t2;
  63. int i; int j; boolpClean;
  64. vector<int>act_A;
  65. ONE_o* oA= NULL;
  66. ONE_o* oB= NULL;
  67. int idA= NULL ;
  68. int idB= NULL;
  69. if (  A!=NULL )
  70.    {
  71.  oA = (ONE_o*)A->userData;
  72.  idA = oA->id;
  73. }
  74. if (  B!=NULL)
  75. {
  76.  oB = (ONE_o*)B->userData;
  77.  idB = oB->id;
  78. }
  79. if ( md == 1 )
  80. {
  81.  if ( oA && oB)
  82.   act_A.push_back( idA );
  83.  act_A.push_back( idB ); );
  84.  molles_A.push_back( act_A );
  85. }
  86. else if ( md == 2 )
  87. {
  88.  if (  oB != NULL )
  89.  act_A = molles_A[ molIdA ];
  90.  act_A.push_back( idB );
  91. }
  92. else if ( md == 3 )
  93. {
  94.  if (  oA!= NULL )
  95.  act_A = molles_A[ molIdB ];
  96.  act_A.push_back( idA );
  97. }
  98. else if ( md == 4 )
  99. {
  100.  if (  oA!= NULL && oB!= NULL )
  101.  act_A = molles_A[ molIdA ];
  102.  act_A.push_back( idB );
  103.  pClean = cleanMolles_A( idB, molIdB );
  104. }
  105. molle_i++;
  106. }
  107. //------------------------------------------------------------------------------------------------
  108. bool cleanMolles_A( int id, int molId )
  109. {
  110. bool pClean =false;
  111. vector<int>act_A = molles_A[molId];
  112. int t1 = act_A.size();
  113. if ( t1 != 0 )
  114. {
  115.  for( int i=0;i<t1;i++)
  116.  {
  117.   if( act_A[i] == id )
  118.   {
  119.    act_A.erase( act_A.begin() + i );
  120.     pClean = true;
  121.     break;
  122.   }
  123.  }
  124. }
  125. return pClean;
  126. }


Le problème c'est qu'au lieu d'ajouter (push_back) de nouveaux id de particules dans la seconde colonne du tableau, qui se limite alors à 2 éléments max, il me les ajoute dans une nouvelle mollécule :sweat:  
 
Auriez-vous une petite idée sur la correction à faire ?
merzi


Message édité par spinzero le 13-04-2009 à 09:55:05
Reply

Marsh Posté le 13-04-2009 à 09:35:07   

Reply

Marsh Posté le 13-04-2009 à 10:08:16    

boost::multi_array :o
et dobulon avec ton autre post

Reply

Marsh Posté le 13-04-2009 à 12:08:12    

Joel F a écrit :

boost::multi_array :o
et dobulon avec ton autre post


 
Oui, ce serait mieux  :)  
J'avais essayé d'utiliser multi_array mais l'ajout avec[n][n] et la supression -dont je n'ai pas vu d'exemple- d'élément d'une dimension ne me paraissait pas évident :pt1cable:  
On va rvoir ça alors...


Message édité par spinzero le 13-04-2009 à 12:12:08
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed