Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.71 KB | None | 0 0
  1. package nanocourse;
  2.  
  3. import java.awt.Color;
  4. import nano.*;
  5. import java.util.Random;
  6.  
  7.  
  8. public class Exercise3_final extends javax.swing.JFrame{
  9.  
  10. public Exercise3_final() {
  11.  
  12. int xSizeInput=1000;
  13. int ySizeInput=800;
  14. double bacteriumRadiusInput=20;
  15. double neutrophilRadiusInput=40;
  16. double chanceSynthesizeInput=100;
  17. double chanceDegradeInput=0.1;
  18. int amountBioInput=10000;
  19. double aggressivenessInput=1;
  20. int amountRBCInput=20;
  21.  
  22. int xSize = xSizeInput;
  23. int ySize = ySizeInput;
  24. Canvas myScreen = new Canvas(xSize, ySize);
  25. Pen myPen = new Pen(myScreen);
  26. Random random = new Random();
  27. int frame=0; //how many frames have passed since start program
  28. int amountEaten=0;
  29.  
  30. //properties red blood cells
  31. int amountRBC=amountRBCInput;
  32. int [] xPosRBC = new int [amountRBC];
  33. int [] yPosRBC = new int [amountRBC];
  34. int M=100;
  35. double [] xValueRBC = new double[M];
  36. double [] yValueRBC = new double[M];
  37. int [] rbcRadius= new int [amountRBC];
  38. for(int i=0;i<amountRBC;i++)
  39. {
  40. rbcRadius[i]=random.nextInt(30)+20;
  41. }
  42. //red blood cells starting positions
  43. for(int i=0;i<amountRBC;i++) //generate random positions
  44. {
  45. xPosRBC[i]=random.nextInt(xSize);
  46. yPosRBC[i]=random.nextInt(ySize);
  47. }
  48.  
  49. for(int i=0;i<amountRBC;i++) //make it so the rbc do not intersect
  50. {
  51. for(int j=0;j<amountRBC;j++)
  52. {
  53. while(Math.sqrt(Math.pow(Math.abs(xPosRBC[j]-xPosRBC[i]),2)+Math.pow(Math.abs(yPosRBC[j]-yPosRBC[i]), 2))<(rbcRadius[i]+rbcRadius[j]) && i!=j)
  54. {
  55. xPosRBC[i]=random.nextInt(xSize); //random starting position of bacterium
  56. yPosRBC[i]=random.nextInt(ySize);
  57. j=0;
  58. }
  59. }
  60. }
  61. //properties bacterium
  62. int xPosBacterium=random.nextInt(xSize); //random starting position of bacterium
  63. int yPosBacterium=random.nextInt(ySize);
  64. double bacteriumRadius=bacteriumRadiusInput; //radius of bacterium
  65. for(int j=0;j<amountRBC;j++)
  66. {
  67. while(Math.sqrt(Math.pow(Math.abs(xPosRBC[j]-xPosBacterium),2)+Math.pow(Math.abs(yPosRBC[j]-yPosBacterium), 2))<(rbcRadius[j]+bacteriumRadius))
  68. {
  69. xPosBacterium=random.nextInt(xSize); //random starting position of bacterium
  70. yPosBacterium=random.nextInt(ySize);
  71. j=0;
  72. }
  73. }
  74. int K=100; //how many points used to draw bacterium
  75. double [] xValueBacterium = new double[K]; //
  76. double [] yValueBacterium = new double[K];
  77. boolean bacteriumAlive=true;
  78.  
  79. //properties biomolecules
  80. int amountBio=amountBioInput;
  81. boolean [] bioExist = new boolean[amountBio];
  82. int [] xPosBio = new int [amountBio];
  83. int [] yPosBio = new int [amountBio];
  84. int [] dXBio = new int [amountBio];
  85. int [] dYBio = new int [amountBio];
  86. int [] lifetimeBio = new int [amountBio];
  87. double chanceDegrade=chanceDegradeInput; //chance that a biomolecule gets degraded per frame
  88. double chanceSynthesize=chanceSynthesizeInput; //chance that a biomolecule gets synthesized per frame
  89. for(int i=0;i<amountBio;i++)
  90. {
  91. bioExist[i]=false; //setting existing state to false
  92. }
  93.  
  94. //properties Neutrophil
  95. int xPosNeutrophil=random.nextInt(xSize);
  96. int yPosNeutrophil=random.nextInt(ySize);
  97. double neutrophilRadius=neutrophilRadiusInput;
  98.  
  99. for(int j=0;j<amountRBC;j++)
  100. {
  101. while(Math.sqrt(Math.pow(Math.abs(xPosRBC[j]-xPosNeutrophil),2)+Math.pow(Math.abs(yPosRBC[j]-yPosNeutrophil), 2))<(rbcRadius[j]+neutrophilRadius))
  102. {
  103. xPosNeutrophil=random.nextInt(xSize); //random starting position of bacterium
  104. yPosNeutrophil=random.nextInt(ySize);
  105. j=0;
  106. }
  107. }
  108. int L=100;
  109. double [] xValueNeutrophil= new double[L];
  110. double [] yValueNeutrophil= new double[L];
  111.  
  112. double xVector, yVector, xNormVector,yNormVector,magnitude,xSumVector,ySumVector;
  113. double aggressiveness=aggressivenessInput;
  114.  
  115. while(true) //while program is running
  116. {
  117. frame++;
  118. //1. Simulating a moving Bacterium
  119.  
  120. int dXBacterium=random.nextInt(11)-5; //random motion
  121. int dYBacterium=random.nextInt(11)-5;
  122. xPosBacterium=xPosBacterium+dXBacterium;
  123. yPosBacterium=yPosBacterium+dYBacterium;
  124. for(int j=0;j<amountRBC;j++)
  125. {
  126. if(Math.sqrt(Math.pow(Math.abs(xPosRBC[j]-xPosBacterium),2)+Math.pow(Math.abs(yPosRBC[j]-yPosBacterium), 2))<(rbcRadius[j]+bacteriumRadius))
  127. {
  128. dXBacterium=-dXBacterium;
  129. dYBacterium=-dYBacterium;
  130. xPosBacterium=xPosBacterium+dXBacterium;
  131. yPosBacterium=yPosBacterium+dYBacterium;
  132. }
  133. }
  134.  
  135. if(xPosBacterium<(bacteriumRadius/2+2*myPen.getSize())) //boundaries bacterium,accounting for size bacterium
  136. {
  137. xPosBacterium=(int)bacteriumRadius/2+2*myPen.getSize();
  138. }
  139. else if(xPosBacterium>xSize - (bacteriumRadius/2+2*myPen.getSize()))
  140. {
  141. xPosBacterium=xSize - ((int)bacteriumRadius/2+2*myPen.getSize());
  142. }
  143. else if(yPosBacterium<(bacteriumRadius/2+2*myPen.getSize()))
  144. {
  145. yPosBacterium=((int)bacteriumRadius/2+2*myPen.getSize());
  146. }
  147. else if(yPosBacterium>ySize - (bacteriumRadius/2+2*myPen.getSize()))
  148. {
  149. yPosBacterium=ySize - ((int)bacteriumRadius/2+2*myPen.getSize());
  150. }
  151.  
  152.  
  153.  
  154. //2. Simulating synthesis and secretion of biomolecules by the bacterium.
  155. for(int i=0;i<amountBio;i++)
  156. {
  157. double synthesizeNumber=Math.random()*100;
  158. if(synthesizeNumber<chanceSynthesize && i==frame)
  159. {
  160. bioExist[frame]=true; //make the biomolecules exist
  161. }
  162.  
  163.  
  164. if(bioExist[i]==true && frame!=1) //if biomolecule exist apply motion
  165. {
  166. dXBio[i]=random.nextInt(51)-25;
  167. dYBio[i]=random.nextInt(51)-25;
  168. xPosBio[i]=xPosBio[i]+dXBio[i];
  169. yPosBio[i]=yPosBio[i]+dYBio[i];
  170. for(int j=0;j<amountRBC;j++)
  171. {
  172. if(Math.sqrt(Math.pow(Math.abs(xPosRBC[j]-xPosBio[i]),2)+Math.pow(Math.abs(yPosRBC[j]-yPosBio[i]), 2))<rbcRadius[j])
  173. {
  174. dXBio[i]=-dXBio[i];
  175. dYBio[i]=-dYBio[i];
  176. xPosBio[i]=xPosBio[i]+dXBio[i];
  177. yPosBio[i]=yPosBio[i]+dYBio[i];
  178. }
  179. }
  180. }
  181. else //if biomolecule doesn't exist, make position equal bacterium position
  182. {
  183. xPosBio[i]=xPosBacterium;
  184. yPosBio[i]=yPosBacterium;
  185. }
  186.  
  187.  
  188. if(xPosBio[i]>xSize) //boundaries biomolecules
  189. {
  190. xPosBio[i]=xSize;
  191. }
  192. if(xPosBio[i]<0)
  193. {
  194. xPosBio[i]=0;
  195. }
  196. if(yPosBio[i]>ySize)
  197. {
  198. yPosBio[i]=ySize;
  199. }
  200. if(yPosBio[i]<0)
  201. {
  202. yPosBio[i]=0;
  203. }
  204.  
  205. if(bioExist[i]==true)
  206. {
  207. lifetimeBio[i]++;
  208. double degradationNumber=Math.random()*100;
  209. if(degradationNumber<chanceDegrade)
  210. {
  211. bioExist[i]=false;
  212. }
  213. }
  214.  
  215. if(bioExist[i]==true && lifetimeBio[i]<=100) //if biomolecule lives shorter than 100 frames==>green
  216. {
  217. myPen.setColor(Color.GREEN); //drawing biomolecules
  218. myPen.setShape(Shape.CIRCLE);
  219. myPen.setSize(5);
  220. }
  221. if(bioExist[i]==true && (lifetimeBio[i]>100 && lifetimeBio[i]<=500)) //if biomolecule lives 101-500 frames==>green
  222. {
  223. myPen.setColor(Color.yellow); //drawing biomolecules
  224. myPen.setShape(Shape.CIRCLE);
  225. myPen.setSize(5);
  226. }
  227. if(bioExist[i]==true && (lifetimeBio[i]>500 && lifetimeBio[i]<=1000)) //if biomolecule lives 501-1000 frames==>orange
  228. {
  229. myPen.setColor(Color.ORANGE); //drawing biomolecules
  230. myPen.setShape(Shape.CIRCLE);
  231. myPen.setSize(5);
  232. }
  233. if(bioExist[i]==true && (lifetimeBio[i]>1000 && lifetimeBio[i]<=1500)) //if biomolecule lives 1001-1500 frames==>red
  234. {
  235. myPen.setColor(Color.RED); //drawing biomolecules
  236. myPen.setShape(Shape.CIRCLE);
  237. myPen.setSize(5);
  238. }
  239. if(bioExist[i]==true && lifetimeBio[i]>1500) //if biomolecule lives 2001+ frames==>magenta
  240. {
  241. myPen.setColor(Color.magenta); //drawing biomolecules
  242. myPen.setShape(Shape.CIRCLE);
  243. myPen.setSize(5);
  244. }
  245. if(bioExist[i]==true)
  246. {
  247. myPen.draw(xPosBio[i],yPosBio[i]);
  248. }
  249. if(Math.sqrt(Math.pow(Math.abs(xPosBio[i]-xPosNeutrophil),2)+Math.pow(Math.abs(yPosBio[i]-yPosNeutrophil), 2))<neutrophilRadius)
  250. {
  251. bioExist[i]=false; //degrade if inside neutrophil
  252. }
  253. }
  254. if(bacteriumAlive==true)
  255. {
  256. for(int i = 0; i <K ; i++) //defining circle, drawing points, placed here because it needs to be on top
  257. {
  258. xValueBacterium[i] = bacteriumRadius*Math.cos(2*Math.PI*i/K);
  259. yValueBacterium[i] = bacteriumRadius*Math.sin(2*Math.PI*i/K);
  260. myPen.setColor(Color.MAGENTA);
  261. myPen.setShape(Shape.CIRCLE);
  262. myPen.setSize(5);
  263. myPen.draw((int)xValueBacterium[i]+xPosBacterium,(int)yValueBacterium[i]+yPosBacterium);
  264. }
  265. }
  266. //5. Simulating the neutrophil eating the bacteriun
  267.  
  268. xSumVector=0;
  269. ySumVector=0;
  270. for(int i=0;i<amountBio;i++)
  271. {
  272. if(Math.abs(xPosBio[i]-xPosNeutrophil)<(30+neutrophilRadius) && Math.abs(yPosBio[i]-yPosNeutrophil)<(30+neutrophilRadius) && bioExist[i]==true)
  273. {
  274. xVector=xPosBio[i]-xPosNeutrophil;
  275. yVector=yPosBio[i]-yPosNeutrophil;
  276. magnitude=Math.sqrt(Math.pow(xVector, 2)+Math.pow(yVector, 2));
  277. xNormVector=xVector/magnitude;
  278. yNormVector=yVector/magnitude;
  279. xSumVector=xSumVector+xNormVector;
  280. ySumVector=ySumVector+yNormVector;
  281.  
  282. }
  283. }
  284.  
  285. //3. Simulating a moving neutrophil
  286. int dXNeutrophil=random.nextInt(11)-5+(int)aggressiveness*(int)xSumVector;
  287. int dYNeutrophil=random.nextInt(11)-5+(int)aggressiveness*(int)ySumVector;
  288. xPosNeutrophil=xPosNeutrophil+dXNeutrophil;
  289. yPosNeutrophil=yPosNeutrophil+dYNeutrophil;
  290. for(int j=0;j<amountRBC;j++)
  291. {
  292. if(Math.sqrt(Math.pow(Math.abs(xPosRBC[j]-xPosNeutrophil),2)+Math.pow(Math.abs(yPosRBC[j]-yPosNeutrophil), 2))<(rbcRadius[j]+neutrophilRadius))
  293. {
  294. dXNeutrophil=-dXNeutrophil; //random motion
  295. dYNeutrophil=-dYNeutrophil;
  296. xPosNeutrophil=xPosNeutrophil+dXNeutrophil;
  297. yPosNeutrophil=yPosNeutrophil+dYNeutrophil;
  298. }
  299.  
  300. }
  301.  
  302.  
  303.  
  304.  
  305. myPen.setSize(8);
  306. if(xPosNeutrophil<(neutrophilRadius/2+2*myPen.getSize())) //boundaries neutrophil
  307. {
  308. xPosNeutrophil=(int)neutrophilRadius/2+2*myPen.getSize();
  309. }
  310. else if(xPosNeutrophil>xSize - (neutrophilRadius/2+2*myPen.getSize()))
  311. {
  312. xPosNeutrophil=xSize - ((int)neutrophilRadius/2+2*myPen.getSize());
  313. }
  314. else if(yPosNeutrophil<(neutrophilRadius/2+2*myPen.getSize()))
  315. {
  316. yPosNeutrophil=((int)neutrophilRadius/2+2*myPen.getSize());
  317. }
  318. else if(yPosNeutrophil>ySize - (neutrophilRadius/2+2*myPen.getSize()))
  319. {
  320. yPosNeutrophil=ySize - ((int)neutrophilRadius/2+2*myPen.getSize());
  321. }
  322. for(int i = 0; i <L ; i++) //defining circle, drawing points, placed here because it needs to be on top
  323. {
  324. xValueNeutrophil[i] = neutrophilRadius*Math.cos(2*Math.PI*i/L);
  325. yValueNeutrophil[i] = neutrophilRadius*Math.sin(2*Math.PI*i/L);
  326. myPen.setColor(Color.blue);
  327. myPen.setShape(Shape.CIRCLE);
  328. myPen.draw((int)xValueNeutrophil[i]+xPosNeutrophil,(int)yValueNeutrophil[i]+yPosNeutrophil);
  329. }
  330.  
  331. if(Math.abs(xPosNeutrophil-xPosBacterium)<(neutrophilRadius+bacteriumRadius) && Math.abs(yPosNeutrophil-yPosBacterium)<(neutrophilRadius+bacteriumRadius) && bacteriumRadius >=0)
  332. {
  333. bacteriumRadius=bacteriumRadius-1;
  334. if(bacteriumRadius==0)
  335. {
  336. bacteriumAlive=false;
  337. }
  338. }
  339.  
  340. if(bacteriumAlive==false)
  341. {
  342. bacteriumAlive=true;
  343. amountEaten++;
  344. xPosBacterium=random.nextInt(xSize); //random starting position of bacterium
  345. yPosBacterium=random.nextInt(ySize);
  346. bacteriumRadius=bacteriumRadiusInput;
  347. for(int j=0;j<amountRBC;j++)
  348. {
  349. while(Math.sqrt(Math.pow(Math.abs(xPosRBC[j]-xPosBacterium),2)+Math.pow(Math.abs(yPosRBC[j]-yPosBacterium), 2))<(rbcRadius[j]+bacteriumRadius))
  350. {
  351. xPosBacterium=random.nextInt(xSize); //random starting position of bacterium
  352. yPosBacterium=random.nextInt(ySize);
  353. j=0;
  354. }
  355. }
  356. }
  357.  
  358. for(int i=0;i<amountRBC;i++)
  359. {
  360. for(int j=0;j<M;j++) //red blood cells
  361. {
  362. xValueRBC[j] = rbcRadius[i]*Math.cos(2*Math.PI*j/M);
  363. yValueRBC[j] = rbcRadius[i]*Math.sin(2*Math.PI*j/M);
  364. myPen.setColor(Color.RED);
  365. myPen.setShape(Shape.CIRCLE);
  366. myPen.setSize(5);
  367. myPen.draw((int)xValueRBC[j]+xPosRBC[i],(int)yValueRBC[j]+yPosRBC[i]);
  368. }
  369. }
  370. for(int i=0;i<amountEaten;i++)
  371. {
  372. myPen.setColor(Color.white);
  373. myPen.setShape(Shape.CIRCLE);
  374. myPen.setSize(30);
  375. myPen.draw(50*(i+1),ySize-50);
  376. }
  377.  
  378. myScreen.update(); //updating/refreshing screen
  379. myScreen.pause(10);
  380. myScreen.clear();
  381. }
  382.  
  383.  
  384.  
  385. }
  386.  
  387. public static void main(String[] args) {
  388. Exercise3_final e = new Exercise3_final();
  389. }
  390. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement