Quellcode von Tetraeder.java |
import javax.swing.*; |
import java.awt.*; |
import java.awt.image.*; |
/* |
* Tetraeder.java |
* |
* Created on 30. Oktober 2004, 10:09 |
*/ |
|
/** |
* {@link Matrix} |
* {@link NewPolygon} |
* {@link Polyeder} |
* Erzeugt ein Object der Klasse Polyeder in Form eines Tetraeders und |
* visualisiert sie ueber die paint Methode. Die Steuerung der |
* Rotationen, Translationen etc. geschieht ueber eine Instanz der |
* Klasse Matrix. |
* |
* @author Rüdiger Witte-Petersen |
*/ |
public class Tetraeder extends JApplet implements Runnable { |
|
/** Hoehe des Tetraeders bei Seitenlaenge 1*/ |
private double th = Math.sqrt(2.0 / 3.0); |
/** Entfernung Mittelpunkt Seitendreieck / Seite, Seitenlaenge 1 */
|
private double ms = Math.sqrt(1.0 / 12.0); |
/** Entfernung Mittelpunkt Seitendreieck / Ecke, Seitenlaenge 1 */
|
private double me = Math.sqrt(1.0 / 3.0); |
/** Hoehe des Mittelpunktes des Tetraeders bei Seitenlaenge 1 */
|
private double mp = Math.sqrt(1.0 / 24.0); |
|
private double[][] koord = {{ -0.5, 0, 0.5, 0 }, |
{ -mp, th - mp, -mp, -mp },
|
{ -ms, 0, -ms, me },
|
{ 1, 1, 1, 1 }};
|
/** Array fuer die Zugriffsparameter der einzelnen Polygone, die letzten |
3 ints stehen fuer die Farbe des jeweiligen Polygons */ |
private int[][] poly_param = {{ 0, 1, 2, 255, 255, 0 }, //gelb |
{ 3, 1, 0, 0, 255, 255 }, //cyan
|
{ 2, 1, 3, 0, 255, 0 }, //gruen
|
{ 0, 2, 3, 255, 0, 255 }}; //magenta
|
|
/** Zugriffskonstanten fuer die Koordinaten */ |
private final int wx = 0; |
private final int wy = 1; |
private final int wz = 2; |
// unendliche Laufzeit |
private boolean zeigen = true; |
/** Thread erstellen */ |
Thread myThread = new Thread(this); |
/** Instanz vom Datentyp Polyeder */ |
Polyeder tetra; |
/** Instanz vom Datentyp Matrix */ |
Matrix m = new Matrix(); |
/** Konstante fuer die Strichstaerke */ |
private final BasicStroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT, |
BasicStroke.JOIN_ROUND);
|
|
/** Neue Instanz startet Thread */ |
public Tetraeder() { |
myThread.start(); |
} |
/** |
* Tetraeder wird zunaechst vergroessert, dann wird die z-Koordinate |
* fuer den Raum gesetzt und tetra upgedated. Dann wird die Matrix |
* auf null gesetzt und es erfolgt die Programmierung der Rotation. |
* Durch die Translation zuvor auf den Ursprung geschieht die |
* anschliessende Rotation um die eigene Achse. |
*/ |
public void run() { |
tetra = new Polyeder(koord, poly_param,320, 200, 40); |
m.scale(18,18,18); |
m.translate(0,0,22); |
tetra.update(m); |
m.clear(); |
|
m.translate(-tetra.wpos[wx], -tetra.wpos[wy], -tetra.wpos[wz]); |
m.rotate(0.004, -0.004, 0); |
m.translate(tetra.wpos[wx], tetra.wpos[wy], tetra.wpos[wz]); |
|
while(zeigen) { |
tetra.update(m); |
try { |
Thread.sleep(5); |
} catch(InterruptedException e) {} |
repaint(); |
}
|
} |
|
/** Das Array der Polygone wird hier visualisiert. Zuvor wird jedoch
|
* die jeweilige Farbe der einzelnen Polygone gesetzt, die in den |
* letzten drei Positionen der Zugriffsarrays gespeichert sind. |
* Desweiteren erfolgt Antialiasing und Double-Buffering.
|
* @param g Graphics Object |
*/ |
public void paint(Graphics g) { |
Graphics2D g2d = (Graphics2D) g; |
BufferedImage bi = (BufferedImage)createImage(this.getWidth(), |
this.getHeight());
|
Graphics2D big = bi.createGraphics(); |
big.setRenderingHint(RenderingHints.KEY_ANTIALIASING, |
RenderingHints.VALUE_ANTIALIAS_ON); |
big.setStroke(stroke); |
big.setColor(new Color(255,255,200)); |
big.fillRect(0,0, this.getWidth(), this.getHeight()); |
|
for(int i = 0; i < tetra.p.length; i++) {
|
big.setColor(new Color(poly_param[i][poly_param[i].length-3], |
poly_param[i][poly_param[i].length-2],
|
poly_param[i][poly_param[i].length-1]));
|
if(tetra.sichtbar(tetra.p[i])) { |
big.fillPolygon(tetra.p[i]); |
big.setColor(Color.black); |
big.setStroke(stroke); |
big.drawPolygon(tetra.p[i]); |
} |
} |
g2d.drawImage(bi, 0,0,this); |
} |
} |