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
|
position_leg * algo(int *leg, double step,double direction,int nb_step,int nb_move,position *Pa, result *result2, int b, vector <int> leg_used)
{
int leg_buyong[4];
if(nb_move==1)
{
leg_used.clear();
int a=bu_yong(*Pa,result2,leg,direction,step, leg_buyong);
b=(pow(2,(double)a+1)-2)/2;// suite... n(n+1)/2
}
position Pa_temp=*Pa;
int c,i,j, d;
vector <pos_xy>::iterator iter_pos;
vector <int> leg_to_move;
vector <int> leg_used_temp;
vector <int>::iterator iter_int;
leg_to_move.clear();
position Pa_forward;
R_inside res_inside;
bool moved;
int m;
bool bina[4];
int count_leg=0;
position_leg* R_FINAL=NULL;
vector <int>::iterator iter_int_leg_used;
for(iter_int_leg_used=leg_used.begin();iter_int_leg_used!=leg_used.end();iter_int_leg_used++)
{
count_leg++;
}
while(b!=-1)
{
c=dectobin(b,bina); //bin ={1,1,1,1} -> no movement
printf("test2");
i=0;
j=count_leg+1;
if(nb_move==1)// si c'est le premier mouvement
{
leg_to_move.clear();
for(d=0;d<4;d++) // On récupere seulement les pattes qui doivent bouger durant ce mouvement suivant b
{
if (bina[3-d]==0)// Normalement plus nécessaire -> && leg_buyong[d]!=0)
{
leg_to_move.push_back(leg_buyong[d]);
i++;
}
else//les pattes qui ne vont pas etre utlisé
{
leg_used[j]=leg_buyong[d];
}
}
}
else
{
printf("test4");
leg_to_move.clear();
for(m=0;m<4;m++)
{
moved=true;
for(iter_int_leg_used = leg_used.begin();iter_int_leg_used!=leg_used.end();iter_int_leg_used++)
{
if(*iter_int_leg_used==leg[m])
{
moved=false;
}
}
if(moved)
{
leg_to_move.push_back(leg[m]);
}
}
}
printf("test3");
iter_int = leg_to_move.begin();//on récupere bien le premier element de leg_to_move
while(!leg_to_move.empty()&&leg_to_move.end()!=iter_int)//tant qu'il n'est pas vide on continue
{
res_inside=inside2(leg, Pa_temp, X_CG, Y_CG,D_MAX,leg_used);
iter_pos = result2[*iter_int-1].pos_step.begin();
if(res_inside.n!=0 && (*iter_int==res_inside.leg2[0]||*iter_int==res_inside.leg2[1]))
{
iter_pos = result2[*iter_int-1].pos_step.begin();
while(iter_pos!=result2[*iter_int-1].pos_step.end())
{
printf("test1");
Pa_temp.Pa[*iter_int-1][0]= iter_pos->x;
Pa_temp.Pa[*iter_int-1][1]= iter_pos->y;
if(check_value_v2(Pa_temp,*iter_int))// On teste que les pattes ne se croisent pas
{
if(nb_move!=4)
{
printf("%d - %d |",nb_step,nb_move+1);
leg_used_temp.clear();
leg_used_temp.insert(leg_used_temp.end(),leg_used.begin(),leg_used.end());
leg_used_temp.push_back(*iter_int);
R_FINAL=algo(leg, step,direction,nb_step,nb_move+1,&Pa_temp,result2,b,leg_used_temp);
}
else
{
printf("%d - 1",nb_step-1);
Pa_forward=Pa_temp;
forward_Pa(&Pa_forward,step,direction);
R_FINAL=algo(leg, step,direction,nb_step-1,1,&Pa_forward,result2,b,leg_used);
}
if(R_FINAL!=NULL||(nb_move==4 && nb_step==0))
{
//création d'un nouveau élement ici avant R_FINAL à partir des coordonnées x et y
// et on fait un return sur le nouvel element
R_FINAL = new position_leg(nb_step,nb_move,R_FINAL,iter_pos->x,iter_pos->y);
return R_FINAL;
}
}
iter_pos++;
}
printf("test5");
}
iter_int++;
}
if(nb_move==1)
{
b--;
}
else b=-1;
}
return NULL;
} |