Quelltext von Pyramide.java |
import javax.swing.*; |
import java.awt.*; |
import java.awt.image.*; |
/* |
* Pyramide.java |
* |
* Created on 26. Oktober 2004, 09:22 |
*/ |
|
/** |
* {@link Matrix} |
* {@link NewPolygon} |
* {@link Polyeder} |
* Erzeugt ein Object der Klasse Polyeder in Form einer Pyramide 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 Pyramide extends JApplet implements Runnable { |
|
/** Hoehe der Pyramide */ |
private double h = Math.sqrt(0.5); |
private double[][] koord = {{ -0.5, -0.5, 0.5, 0.5, 0 }, |
{ -h/2, -h/2, -h/2, -h/2, h/2 },
|
{ -0.5, 0.5, 0.5, -0.5, 0 },
|
{ 1, 1, 1, 1, 1 }};
|
// Array fuer die Zugriffsparameter der einzelnen Polygone, die letzten |
// 3 ints stehen fuer die Farbe des jeweiligen Polygons, kommt in dieser |
// Klasse jedoch nicht zum Einsatz, siehe paint-Methode |
private int[][] poly_param = {{ 0, 4, 3, 255, 0, 0 }, //rot |
{ 1, 4, 0, 0, 255, 0 }, //gruen
|
{ 2, 4, 1, 0, 0, 255 }, //blau
|
{ 3, 4, 2, 255, 0, 255 }, //magenta
|
{ 0, 3, 2, 1, 255, 255, 0 }}; //gelb
|
|
/** 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 pyra; |
/** Instanz vom Datentyp Matrix */ |
Matrix m = new Matrix(); |
/** Konstante fuer die Strichstaerke */ |
private final BasicStroke stroke = new BasicStroke(4, BasicStroke.CAP_BUTT, |
BasicStroke.JOIN_ROUND);
|
|
/** Creates a new instance of Pyramide */ |
public Pyramide() { |
myThread.start(); |
} |
/** |
* Pyramide wird zunaechst vergroessert, dann wird die z-Koordinate |
* fuer den Raum gesetzt und cube 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() { |
pyra = new Polyeder(koord, poly_param,320, 200, 0); |
m.scale(8,8,8); |
m.translate(0,0,10); |
m.rotate(0,0.003, 0); |
pyra.update(m); |
m.clear(); |
|
m.translate(-pyra.wpos[wx], -pyra.wpos[wy], -pyra.wpos[wz]); |
m.rotate(0.00, -0.004, 0.00); |
m.translate(pyra.wpos[wx], pyra.wpos[wy], pyra.wpos[wz]); |
|
while(zeigen) { |
pyra.update(m); |
|
try { |
Thread.sleep(15); |
} 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 < pyra.p.length; i++) {
|
big.setColor(Color.black); |
big.drawPolygon(pyra.p[i]); |
} |
g2d.drawImage(bi, 0,0,this); |
} |
} |