Advertisement
Guest User

Fast bot

a guest
Nov 18th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.54 KB | None | 0 0
  1. // 0, 1, 2, 3 - going past debri and doing Rendezvous
  2.  
  3. float mypos[12],hp[3],vb[3],debris[41][4],base[3],origine[3],debrisx[3],bordo[3],distanza[4],p1[3],p2[3],p3[3],st[3],e[12];
  4. int i,k;
  5. float bestPoint[3];
  6. float preBest[3];
  7. float myState[12];
  8. float myPos[3];
  9. float dest[3];
  10. float initPos[3]; //initPos of other bot
  11. float target[12];
  12.  
  13. float distanze(float x[], float y[]){
  14. float z,vbr[3];
  15. mathVecSubtract(vbr,x,y,3);
  16. z=mathVecMagnitude(vbr,3);
  17. return z;
  18. }
  19.  
  20. void init(){
  21. api.getOtherZRState(target);
  22. initPos[0] = target[0];
  23. initPos[1] = target[1];
  24. initPos[2] = target[2];
  25.  
  26. i=0;
  27. k=0;
  28. //api.setPosGains(0.85,3,4);
  29. api.setPosGains(0.65,3,4);
  30. base[0]=0.197;
  31. base[1]=-0.135;
  32. base[2]=0.033;
  33. origine[0]=0;
  34. origine[1]=0.4;
  35. origine[2]=0;
  36. st[0]=180*PI/180;
  37. st[1]=0;
  38. st[2]=-PI/2;
  39. api.getMyZRState(mypos);
  40. game.getDebris(debris);
  41.  
  42. debrisx[0]=debris[20][0];
  43. debrisx[1]=debris[20][1];
  44. debrisx[2]=debris[20][2];
  45. bordo[0]=-0.64;
  46. bordo[1]=debrisx[1];
  47. bordo[2]=0;
  48. distanza[0]=distanze(debrisx,bordo);
  49.  
  50.  
  51. debrisx[0]=debris[23][0];
  52. debrisx[1]=debris[23][1];
  53. debrisx[2]=debris[23][2];
  54. bordo[0]=0.64;
  55. bordo[1]=debrisx[1];
  56. bordo[2]=0;
  57. distanza[1]=distanze(debrisx,bordo);
  58.  
  59. debrisx[0]=debris[35][0];
  60. debrisx[1]=debris[35][1];
  61. debrisx[2]=debris[35][2];
  62. bordo[0]=-0.64;
  63. bordo[1]=debrisx[1];
  64. bordo[2]=0;
  65. distanza[2]=distanze(debrisx,bordo);
  66.  
  67. debrisx[0]=debris[37][0];
  68. debrisx[1]=debris[37][1];
  69. debrisx[2]=debris[37][2];
  70. bordo[0]=-0.64;
  71. bordo[1]=debrisx[1];
  72. bordo[2]=0;
  73. distanza[3]=distanze(debrisx,bordo);
  74.  
  75. if(distanza[2]>distanza[3] and distanza[2]>0.22){
  76. p1[0]=-0.55;
  77. p1[1]=0.55;
  78. p1[2]=0;
  79. p2[0]=-0.55;
  80. p2[1]=-0.11;
  81. p2[2]=0;
  82. p3[0]=-0.26;
  83. p3[1]=-0.18;
  84. p3[2]=0;
  85. }
  86.  
  87. else if(distanza[3]>distanza[2] and distanza[3]>0.22){
  88. p1[0]=0.55;
  89. p1[1]=0.55;
  90. p1[2]=0;
  91. p2[0]=0.55;
  92. p2[1]=-0.11;
  93. p2[2]=0;
  94. p3[0]=0.26;
  95. p3[1]=-0.18;
  96. p3[2]=0;
  97. }
  98.  
  99. else{
  100. if(distanza[0]>distanza[1]){
  101. p1[0]=-0.55;
  102. p1[1]=0.55;
  103. p1[2]=0;
  104. p2[0]=-0.55;
  105. p2[1]=-0.11;
  106. p2[2]=0;
  107. p3[0]=-0.26;
  108. p3[1]=-0.18;
  109. p3[2]=0;
  110. }
  111.  
  112. else{
  113. p1[0]=0.55;
  114. p1[1]=0.55;
  115. p1[2]=0;
  116. p2[0]=0.55;
  117. p2[1]=-0.11;
  118. p2[2]=0;
  119. p3[0]=0.26;
  120. p3[1]=-0.18;
  121. p3[2]=0;
  122. }
  123. }
  124. api.getMyZRState(myState);
  125. getBestRamPoint(bestPoint);
  126.  
  127. preBest[0] = bestPoint[0];
  128. preBest[1] = myState[1] - .5f;
  129. preBest[2] = bestPoint[2];
  130.  
  131. }
  132.  
  133. void loop(){
  134. api.getMyZRState(myState);
  135.  
  136. for(int inc = 0; inc < 3; inc++){
  137. myPos[inc] = myState[inc];
  138. }
  139. game.getOtherEulerState(e);
  140. DEBUG(("%d",i));
  141. game.getMyEulerState(mypos);
  142. hp[0]=0.2;
  143. hp[1]=1;
  144. hp[2]=0;
  145. e[6]=e[6];
  146. e[7]=-e[7];
  147. e[8]=-e[8];
  148. if(i<=3){
  149. game.setEulerTarget(st);
  150. }
  151. if(i==0){
  152. api.setPositionTarget(preBest);
  153. //moveTo(preBest,0);
  154. DEBUG(("Distance:%f",distanze(myPos,preBest)));
  155. if(distanze(myPos,preBest) < .25f){
  156. i = 1;
  157. }
  158. }
  159. if(i==1){
  160. api.setPositionTarget(bestPoint);
  161. //moveTo(bestPoint,1);
  162. DEBUG(("Distance:%f",distanze(myPos,bestPoint)));
  163. if(distanze(myPos,bestPoint) < .2f) {
  164. i = 3;
  165. }
  166. }
  167. else if(i==3){
  168. predict(15.3);
  169. moveTo(dest,1);
  170. //api.setPositionTarget(dest);
  171.  
  172. }
  173. else if(i==4){
  174. base[0]=e[0]-0.002;
  175. base[2]=e[2]+0.005;
  176. api.setPositionTarget(base);
  177. e[6]=e[6];
  178. e[8]=e[8];
  179. game.setEulerTarget(e+6);
  180. if(distanze(mypos,base)<0.01)
  181. i++;
  182. }
  183.  
  184. else if(i==5){
  185. base[0]=e[0]+0.04;
  186. base[1]=e[1]+0.166+0.1705;
  187. base[2]=e[2];
  188. api.setPositionTarget(base);
  189. game.setEulerTarget(e+6);
  190. if(distanze(mypos,base)<0.01){
  191. i++;
  192. }
  193. }
  194.  
  195. else if(i==6){
  196. api.setPosGains(0.5,1,5);
  197. base[0]=e[0]+0.04;
  198. base[1]=e[1]+0.166+0.1705;
  199. base[2]=e[2];
  200. api.setPositionTarget(base);
  201. e[8]=e[8]-0.20;
  202. game.setEulerTarget(e+6);
  203. }
  204.  
  205. else if(i==8){
  206. game.setEulerTarget(e+6);
  207. api.setPositionTarget(origine);
  208. }
  209.  
  210. if(game.checkRendezvous()==true and i==3){
  211. game.completeRendezvous();
  212. i++;
  213. }
  214. }
  215.  
  216. void getBestRamPoint(float bestpoint[3]){
  217. float debris[41][4];
  218.  
  219. game.getDebris(debris);
  220.  
  221. float min = 100000;
  222. float minx = -0.64f;
  223. float minz = -0.64f;
  224.  
  225. for(float x = -0.3f; x <= 0.5f; x += 0.01f){
  226. for(float z = -0.4f; z <= 0.4f; z += 0.01f){
  227. float s = (x - z)*(x - z)*0.01;
  228. for(int i = 0; i < 41; i++){
  229. if(inrange(x, z, debris[i][0], debris[i][2], debris[i][3], 0.155f)){
  230. s += debris[i][3];
  231. }
  232. }
  233. if(s < min){
  234. min = s;
  235. minx = x;
  236. minz = z;
  237. }
  238. }
  239. }
  240.  
  241. bestpoint[0] = minx;
  242. bestpoint[1] = 0;
  243. bestpoint[2] = minz;
  244.  
  245. }
  246. bool inrange(float x1, float z1, float x2, float z2, float r1, float r2){
  247. return
  248. (((x1 - x2) * (x1 - x2)) + ((z1 - z2) * (z1 - z2)))
  249. <=
  250. ((r1 + r2) * (r1 + r2));
  251.  
  252. }
  253. void moveTo(float target[3], int stop) {
  254. /*if(distance(target,myPos) < .17f){
  255. api.setPositionTarget(target);
  256. }*/
  257.  
  258. if(stop == 1){
  259. float moveTemp[3];
  260. mathVecSubtract(moveTemp, target, myState, 3);
  261.  
  262.  
  263.  
  264. float d = mathVecMagnitude(moveTemp, 3);
  265. d = sqrt(sqrtf(d * d * d ));
  266.  
  267. scale(moveTemp, d / mathVecMagnitude(moveTemp, 3));
  268.  
  269. mathVecAdd(moveTemp, myState, moveTemp, 3);
  270.  
  271. //DEBUG(("%f, %f, %f", moveTemp[0], moveTemp[1], moveTemp[2]));
  272.  
  273.  
  274. api.setPositionTarget(moveTemp);
  275. }
  276.  
  277. else{
  278. float moveTemp[3];
  279. mathVecSubtract(moveTemp, target, myState, 3);
  280.  
  281. float d = mathVecMagnitude(moveTemp, 3);
  282. d = sqrt(sqrtf(d * d ));
  283.  
  284. scale(moveTemp, d / mathVecMagnitude(moveTemp, 3));
  285.  
  286. mathVecAdd(moveTemp, myState, moveTemp, 3);
  287.  
  288. //DEBUG(("%f, %f, %f", moveTemp[0], moveTemp[1], moveTemp[2]));
  289.  
  290.  
  291. api.setPositionTarget(moveTemp);
  292. }
  293.  
  294.  
  295. }
  296. void scale(float output[3], float scale) {
  297. output[0] *= scale;
  298. output[1] *= scale;
  299. output[2] *= scale;
  300. }
  301.  
  302.  
  303. //Rendezvous stuff
  304. //Angle after certain time
  305. float getTheta(int time){
  306. return (.0667f * time);
  307. }
  308.  
  309. void predict(int time){
  310. //dest[0]=0.2*cosf(atanf(other[2]/other[0])+2*PI/3)+0.04;dest[1]=other[1]+0.25;dest[2]=0.2*sinf(atanf(other[2]/other[0])+2*PI/3) - .05f;
  311. dest[2] = (1 * initPos[2] * cosf(getTheta(time)) - initPos[0] * sinf(getTheta(time)) ) + .04f; //slight adjustment with +.05
  312. dest[0] = -1 * initPos[2] * sinf(getTheta(time)) + initPos[0] * cosf(getTheta(time)) + .03f;
  313. dest[1] = initPos[1] + .34f;
  314. DEBUG(("dest:%f,%f,%f",dest[0],dest[1],dest[2]));
  315. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement