spinzero | 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 :
- static vector< vector<int> > molles_A;//(1, vector<int>(NMAX));
- int molle_i=0;
- ...
- //------------------------------------------------------------------------------------------------
- void setMolleID( NxActor *A, NxActor *B )
- {
- ONE_o* oA = (ONE_o*)A->userData;
- int molIdA = oA->id_mol;
- ONE_o* oB = (ONE_o*)B->userData;
- int molIdB = oB->id_mol;
- if( molIdA == NULL && molIdB == NULL ) //------ NOT YET
- {
- updateMolles_A( 1, NULL, NULL, A, B );
- ONE_o* oA = (ONE_o*)A->userData;
- oA->id_mol = mol_i;
- ONE_o* oB = (ONE_o*)B->userData;
- oB->id_mol = mol_i;
- mol_i ++;
- }
- else if( molIdA != NULL && molIdB == NULL )//---- A
- {
- updateMolles_A( 2, molIdA, NULL, NULL, B );
- ONE_o* oB = (ONE_o*)B->userData;
- oB->id_mol = molIdA;
- }
- else if( molIdA == NULL && molIdB != NULL ) //---- B
- { cerr << "{PhysicCORE::setMolleID} C) molIdB != NULL " << endl;
- updateMolles_A( 3, NULL, molIdB, A, NULL );
- ONE_o* oA = (ONE_o*)A->userData;
- oA->id_mol = molIdB;
- }
- else if( molIdA != NULL && molIdB != NULL ) //---- A & B
- {
- NxArray<NxJoint *> jtsA = getJOINTS_L( A );
- NxArray<NxJoint *> jtsB = getJOINTS_L( B );
- int A_T = jtsA.size();
- int B_T = jtsB.size();
- if( A_T > B_T )
- {
- updateMolles_A( 4, molIdA, molIdB, A, B );
- ONE_o* oB = (ONE_o*)B->userData;
- oB->id_mol = molIdA;
- }
- else if( A_T < B_T)
- {
- updateMolles_A( 5, molIdA, molIdB, A, B );
- ONE_o* oA = (ONE_o*)A->userData;
- oA->id_mol = molIdB;
- }
- else //--- Devrait être arbitraire
- {
- updateMolles_A( 6, molIdA, molIdB, A, B );
- ONE_o* oA = (ONE_o*)A->userData;
- oA->id_mol = molIdB;
- }
- }
- }
- //----------------------------------------------------------------------------------------------
- void updateMolles_A( int md, int molIdA, int molIdB, NxActor *A=NULL, NxActor *B=NULL )
- {
- int t1 = molles_A.size();
- int t2;
- int i; int j; boolpClean;
- vector<int>act_A;
- ONE_o* oA= NULL;
- ONE_o* oB= NULL;
- int idA= NULL ;
- int idB= NULL;
- if ( A!=NULL )
- {
- oA = (ONE_o*)A->userData;
- idA = oA->id;
- }
- if ( B!=NULL)
- {
- oB = (ONE_o*)B->userData;
- idB = oB->id;
- }
- if ( md == 1 )
- {
- if ( oA && oB)
- act_A.push_back( idA );
- act_A.push_back( idB ); );
- molles_A.push_back( act_A );
- }
- else if ( md == 2 )
- {
- if ( oB != NULL )
- act_A = molles_A[ molIdA ];
- act_A.push_back( idB );
- }
- else if ( md == 3 )
- {
- if ( oA!= NULL )
- act_A = molles_A[ molIdB ];
- act_A.push_back( idA );
- }
- else if ( md == 4 )
- {
- if ( oA!= NULL && oB!= NULL )
- act_A = molles_A[ molIdA ];
- act_A.push_back( idB );
- pClean = cleanMolles_A( idB, molIdB );
- }
- molle_i++;
- }
- //------------------------------------------------------------------------------------------------
- bool cleanMolles_A( int id, int molId )
- {
- bool pClean =false;
- vector<int>act_A = molles_A[molId];
- int t1 = act_A.size();
- if ( t1 != 0 )
- {
- for( int i=0;i<t1;i++)
- {
- if( act_A[i] == id )
- {
- act_A.erase( act_A.begin() + i );
- pClean = true;
- break;
- }
- }
- }
- return pClean;
- }
|
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 Auriez-vous une petite idée sur la correction à faire ?
merzi Message édité par spinzero le 13-04-2009 à 09:55:05
|