Guest User

Untitled

a guest
Feb 17th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.16 KB | None | 0 0
  1. public class Main extends Applet {
  2.  
  3. private final int N = 3;
  4. private Ball[] balls = new Ball[N];
  5. private boolean flag = true;
  6.  
  7. public void paint(Graphics g){
  8. g.setColor(Color.green);
  9. g.fillRect(0,0,this.getWidth(),this.getHeight());
  10.  
  11. if(flag) {
  12. for(int i = 0; i < N; i++) {
  13. balls[i] = new Ball(this);
  14. balls[i].start();
  15. }
  16. try {
  17. Thread.sleep(0);
  18. } catch (InterruptedException e) {
  19. e.printStackTrace();
  20. }
  21. flag = false;
  22. }
  23.  
  24. g.dispose();
  25. }
  26. }
  27.  
  28. public class Ball extends Thread {
  29.  
  30. private Graphics2D g2d, buffGraphics;
  31. private Shape ball;
  32. private AffineTransform ballTransform = new AffineTransform();
  33. private BufferedImage bi;
  34. private Color color;
  35. private double width, height, deltaY, deltaX = 0.011;
  36. private final int rad = 20, diam = 2 * rad;
  37.  
  38. Ball(Applet applet){
  39. bi = new BufferedImage(applet.getWidth(), applet.getHeight(), BufferedImage.TYPE_INT_ARGB);
  40. buffGraphics = bi.createGraphics();
  41.  
  42. g2d = (Graphics2D)applet.getGraphics();
  43. g2d.setColor(Color.green);
  44.  
  45. color = new Color((int)(Math.random() * 255),(int)(Math.random() * 255), (int)(Math.random() * 255) );
  46. ball = new Ellipse2D.Double(Math.random() * (applet.getWidth() - diam),
  47. Math.random() * (applet.getHeight() - diam),diam,diam);
  48. double h = 8 + Math.random() * 9;
  49. double temp = Math.random();
  50. double hX = PositiveOrNegative() * ((int)(temp * (h + 1)) == (int) h ? h : temp * h);
  51. double hY = PositiveOrNegative() * Math.sqrt(h * h - hX * hX);
  52. ballTransform.setToTranslation(hX, hY);
  53.  
  54. deltaY = Math.abs(hY / (hX / deltaX));
  55. width = applet.getWidth();
  56. height = applet.getHeight();
  57. }
  58.  
  59. private static int PositiveOrNegative()
  60. {
  61. return (Math.random() >= 0.5) ? 1 : -1;
  62. }
  63.  
  64. @Override
  65. public void run() {
  66. buffGraphics.setColor(color);
  67. buffGraphics.fill(ball);
  68. g2d.drawImage(bi, 0 , 0, null);
  69.  
  70. while(true) {
  71. try {
  72. if(ball.getBounds().x + diam == width || ball.getBounds().x == 0)
  73. ballTransform.setToTranslation(-ballTransform.getTranslateX(), ballTransform.getTranslateY());
  74. else if(ball.getBounds().x + diam + ballTransform.getTranslateX() > width
  75. && ballTransform.getTranslateX() / Math.abs(ballTransform.getTranslateX()) == 1) {
  76. double hx = width - ball.getBounds().x - diam - 1,
  77. hy = hx * Math.abs(ballTransform.getTranslateY()) / ballTransform.getTranslateX();
  78. AffineTransform af1 = new AffineTransform();
  79. af1.setToTranslation(hx,ballTransform.getTranslateY() / Math.abs(ballTransform.getTranslateY()) * hy);
  80.  
  81. Thread.sleep(30);
  82. draw();
  83.  
  84. ballTransform.setToTranslation(-ballTransform.getTranslateX(), ballTransform.getTranslateY());
  85. }
  86. else if(ball.getBounds().x + ballTransform.getTranslateX() < 0
  87. && ballTransform.getTranslateX() / Math.abs(ballTransform.getTranslateX()) == -1) {
  88. double hx = ball.getBounds().x + 1,
  89. hy = hx * Math.abs(ballTransform.getTranslateY()) / ballTransform.getTranslateX() * (-1);
  90. AffineTransform af1 = new AffineTransform();
  91. af1.setToTranslation( -hx,ballTransform.getTranslateY() / Math.abs(ballTransform.getTranslateY()) * hy);
  92.  
  93. Thread.sleep(30);
  94. draw();
  95.  
  96. ballTransform.setToTranslation(-ballTransform.getTranslateX(), ballTransform.getTranslateY());
  97. }
  98. if(ball.getBounds().y + diam == height || ball.getBounds().y == 0)
  99. ballTransform.setToTranslation(ballTransform.getTranslateX(), -ballTransform.getTranslateY());
  100. else if(ball.getBounds().y + diam + ballTransform.getTranslateY() > height
  101. && ballTransform.getTranslateY() / Math.abs(ballTransform.getTranslateY()) == 1) {
  102. double hy = height - ball.getBounds().y - diam - 1,
  103. hx = hy * Math.abs(ballTransform.getTranslateX()) / ballTransform.getTranslateY();
  104. AffineTransform af1 = new AffineTransform();
  105. af1.setToTranslation(ballTransform.getTranslateX() / Math.abs(ballTransform.getTranslateX()) * hx, hy);
  106.  
  107. Thread.sleep(30);
  108. draw();
  109.  
  110. ballTransform.setToTranslation(ballTransform.getTranslateX(), -ballTransform.getTranslateY());
  111. }
  112. else if(ball.getBounds().y + ballTransform.getTranslateY() < 0
  113. && ballTransform.getTranslateY() / Math.abs(ballTransform.getTranslateY()) == -1) {
  114. double hy = ball.getBounds().y + 1,
  115. hx = hy * Math.abs(ballTransform.getTranslateX()) / ballTransform.getTranslateY() * (-1);
  116. AffineTransform af1 = new AffineTransform();
  117. af1.setToTranslation(ballTransform.getTranslateX() / Math.abs(ballTransform.getTranslateX()) * hx, -hy);
  118.  
  119. Thread.sleep(30);
  120. draw();
  121.  
  122. ballTransform.setToTranslation(ballTransform.getTranslateX(), -ballTransform.getTranslateY());
  123. }
  124.  
  125. Thread.sleep(60);
  126. draw();
  127.  
  128. if(Math.abs(ballTransform.getTranslateX()) - deltaX <= 0 ||
  129. Math.abs(ballTransform.getTranslateY()) - deltaY <= 0) break;
  130. ballTransform.setToTranslation(ballTransform.getTranslateX() / Math.abs(ballTransform.getTranslateX()) *
  131. (Math.abs(ballTransform.getTranslateX()) - deltaX), ballTransform.getTranslateY() /
  132. Math.abs(ballTransform.getTranslateY()) * (Math.abs(ballTransform.getTranslateY()) - deltaY));
  133. deltaX += 0.0015;
  134. deltaY = Math.abs(ballTransform.getTranslateY() / (ballTransform.getTranslateX() / deltaX));
  135. } catch (InterruptedException e) {
  136. e.printStackTrace();
  137. }
  138. }
  139. while(true) {
  140. try {
  141. Thread.sleep(60);
  142. } catch (InterruptedException e) {
  143. e.printStackTrace();
  144. }
  145. g2d.drawImage(bi, 0, 0, null);
  146. }
  147.  
  148. }
  149.  
  150. private void draw(){
  151. g2d.fillOval(ball.getBounds().x-1,ball.getBounds().y-1,
  152. ball.getBounds().width+2, ball.getBounds().height+2);
  153. buffGraphics.setColor(Color.green);
  154. buffGraphics.setComposite(AlphaComposite.Clear);
  155. buffGraphics.fillOval(ball.getBounds().x-1,ball.getBounds().y-1,
  156. ball.getBounds().width+2, ball.getBounds().height+2);
  157. buffGraphics.setComposite(AlphaComposite.SrcOver);
  158. buffGraphics.setColor(color);
  159.  
  160. ball = ballTransform.createTransformedShape(ball);
  161. buffGraphics.fill(ball);
  162. g2d.drawImage(bi, 0 , 0, null);
  163. }
  164. }
Add Comment
Please, Sign In to add comment