Posted By

donfips on 01/12/11


Tagged


Versions (?)

Baum


 / Published in: Java
 

  1. package shape;
  2.  
  3. import java.awt.Color;
  4. import java.awt.GradientPaint;
  5. import java.awt.Graphics2D;
  6. import java.awt.Graphics;
  7. import java.awt.Polygon;
  8. import java.awt.Shape;
  9. import java.awt.Rectangle;
  10.  
  11. /**
  12.  * Zeichnet einen Baum mit vorgegebenen Größen aus der ShapeBase
  13.  * aus MeineKleineStrasse.
  14.  *
  15.  * @author Markus Tacker <[email protected]>
  16.  * @author Philipp Siegmund<[email protected]>
  17.  * @version $Id: Baum.java 116 2010-01-26 08:20:47Z m $
  18.  */
  19. public class Baum extends ShapeBase
  20. {
  21. private char type;
  22. private int laubBaumBreite;
  23. private int laubBaumHoehe;
  24. private Color baumColor;
  25. private Color trunkColor;
  26. private Color snowColor;
  27. private Polygon trunk;
  28. private Polygon[] nadeln;
  29. private boolean snow = false;
  30. private int laubBaumX;
  31. private int laubBaumY;
  32. private GradientPaint snowPaint;
  33.  
  34. /**
  35. * Konstruktor
  36. *
  37. * @param x X-Koordinate des Baumes
  38. * @param y Y-Koordinate des Baumes
  39. * @param breite Breite des Baumes
  40. * @param hoehe Höhe des Baumes
  41. */
  42. public Baum(int x, int y, int breite, int hoehe)
  43. {
  44. super(x, y, breite, hoehe);
  45. this.type = Math.random() > 0.5 ? 'n' : 'l';
  46. this.laubBaumBreite = (int)(this.getBreite() * (0.5 + Math.random() * 0.5));
  47. this.baumColor = new Color((int)(Math.random() * 100), 50 + (int)(Math.random() * 50), (int)(Math.random() * 50));
  48. this.trunkColor = new Color(50 + (int)(Math.random() * 20), 30 + (int)(Math.random() * 20), (int)(Math.random() * 20));
  49. this.laubBaumHoehe = (int)(this.getHoehe() * (0.5 + Math.random() * 0.35));
  50. // Formen initialisieren
  51. this.createTrunk();
  52. switch(this.type) {
  53. case 'n':
  54. this.createNadelGreen();
  55. break;
  56. case 'l':
  57. this.laubBaumX = this.getAbsoluteX((int)((this.getBreite() - this.laubBaumBreite) / 2));
  58. this.laubBaumY = this.getAbsoluteY(0);
  59. break;
  60. }
  61. }
  62.  
  63. /**
  64. * Bestimmt, ob Schnee auf dem Baum liegt
  65. *
  66. * @param Schnee an/ausschalten
  67. * @return Instanz des Baumes
  68. */
  69. public Baum hasSnow(boolean snow)
  70. {
  71. this.snow = snow;
  72. if (snow) {
  73. this.snowColor = new Color(255, 255, 255);
  74. float gradientX = this.laubBaumY + (this.laubBaumHoehe / 2);
  75. this.snowPaint = new GradientPaint(gradientX, this.laubBaumY, this.snowColor, gradientX, this.laubBaumY + this.laubBaumHoehe, this.baumColor);
  76. }
  77. return this;
  78. }
  79.  
  80. /**
  81. * Erzeugt das Polygon für den Stamm in unterschiedlichen Farben mittels Math.random
  82. */
  83. private void createTrunk()
  84. {
  85. this.trunk = new Polygon();
  86. int breiteUnten = (int)(this.getBreite() * 0.2);
  87. // Unten links
  88. this.trunk.addPoint(this.getAbsoluteX((this.getBreite() / 2) - (breiteUnten / 2)), this.getAbsoluteY(this.getHoehe()));
  89. // Unten rechts
  90. this.trunk.addPoint(this.getAbsoluteX((this.getBreite() / 2) + (breiteUnten / 2)), this.getAbsoluteY(this.getHoehe()));
  91. // Oben rechts
  92. this.trunk.addPoint(this.getAbsoluteX((this.getBreite() / 2) + (breiteUnten / 4)), this.getAbsoluteY(this.getHoehe() / 2));
  93. // Oben links
  94. this.trunk.addPoint(this.getAbsoluteX((this.getBreite() / 2) - (breiteUnten / 4)), this.getAbsoluteY(this.getHoehe() / 2));
  95. }
  96.  
  97. /**
  98. * Erzeugt die Polygone für das Grün eines Nadelbaums
  99. */
  100. private void createNadelGreen()
  101. {
  102. int greenHeight = (int)(this.getHoehe() * 0.8);
  103. int steps = greenHeight / 10;
  104. this.nadeln = new Polygon[steps];
  105. Polygon currGreen;
  106. for (int n = 1; n <= steps; n++) {
  107. int greenBreite = (int)(this.getBreite() / (steps - 1) * n);
  108. currGreen = new Polygon();
  109. currGreen.addPoint(this.getAbsoluteX((int)(this.getBreite() / 2)), this.getAbsoluteY(n * 10));
  110. currGreen.addPoint(this.getAbsoluteX((int)((this.getBreite() - greenBreite) / 2)), this.getAbsoluteY(n * 10 + 20));
  111. currGreen.addPoint(this.getAbsoluteX((int)((this.getBreite() - greenBreite) / 2) + greenBreite), this.getAbsoluteY(n * 10 + 20));
  112. this.nadeln[n - 1] = currGreen;
  113. }
  114. }
  115.  
  116. /**
  117. * Zeichnet den Baum auf der Grafikausgabe
  118. *
  119. * @param g Grafik-Objekt
  120. */
  121. public void paint(Graphics g)
  122. {
  123. this.paintTrunk(g);
  124. this.paintGreen(g);
  125. }
  126.  
  127. /**
  128. * Zeichnet den Stamm
  129. *
  130. * @param g Grafik-Objekt
  131. */
  132. private void paintTrunk(Graphics g)
  133. {
  134. g.setColor(this.trunkColor);
  135. g.fillPolygon(this.trunk);
  136. }
  137.  
  138. /**
  139. * Bestimmt Grün abhängig von der vorher bestimmten Sorte
  140. *
  141. * @param g Grafik-Objekt
  142. */
  143. private void paintGreen(Graphics g)
  144. {
  145. switch(this.type) {
  146. case 'n':
  147. this.paintNadelGreen(g);
  148. break;
  149. case 'l':
  150. this.paintLaubGreen(g);
  151. break;
  152. }
  153. }
  154.  
  155. /**
  156. * Zeichnet das Grün eines Nadelbaums
  157. *
  158. * @param g Grafik-Objekt
  159. */
  160. private void paintNadelGreen(Graphics g)
  161. {
  162. for (int n = 0; n < this.nadeln.length; n++) {
  163. if (this.snow) {
  164. int rb = Math.max(10, 255 - n * 20);
  165. g.setColor(new Color(rb, 255 - n * 10, rb));
  166. } else {
  167. g.setColor(new Color(10, 255 - n * 10, 10));
  168. }
  169. g.fillPolygon(this.nadeln[n]);
  170. }
  171. }
  172.  
  173. /**
  174. * Zeichnet das Grün eines Laubbaums mit variablen Größen der Baumkrone
  175. *
  176. * @param g Grafik-Objekt
  177. */
  178. private void paintLaubGreen(Graphics g)
  179. {
  180. if (this.snow) {
  181. g2.setPaint(this.snowPaint);
  182. g2.fillOval(this.laubBaumX, this.laubBaumY, this.laubBaumBreite, this.laubBaumHoehe);
  183. } else {
  184. g.setColor(this.baumColor);
  185. g.fillOval(this.laubBaumX, this.laubBaumY, this.laubBaumBreite, this.laubBaumHoehe);
  186. }
  187. }
  188. }

Report this snippet  

You need to login to post a comment.