Quellcode von Cube.java |
import javax.swing.*; |
import java.awt.*; |
import java.awt.image.*; |
/* |
* Cube.java |
* |
* Created on 14. Oktober 2004, 17:07 |
*/ |
|
/** |
* {@link Matrix} |
* {@link NewPolygon} |
* {@link Polyeder} |
* Erzeugt ein Object der Klasse Polyeder in Form eines Wuerfels und visuali- |
* siert ihn ueber die paint Methode in der Mitte des Applets. Die Steuerung
|
* der Rotationen, Translationen etc. geschieht ueber eine Instanz der Klasse |
* Matrix. |
* |
* @author Rüdiger Witte-Petersen |
*/ |
public class Cube extends JApplet implements Runnable { |
|
private double[][] koord = {{ -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5 }, |
{ -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5 },
|
{ -.5, -.5, -.5, -.5, .5, .5, .5, .5 },
|
{ 1, 1, 1, 1, 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, 3, 255, 0, 0 }, //rot |
{ 7, 6, 5, 4, 0, 255, 0 }, //gruen
|
{ 1, 4, 5, 2, 0, 0, 255 }, //blau
|
{ 0, 3, 6, 7, 255, 0, 255 }, //magenta
|
{ 3, 2, 5, 6, 255, 255, 0 }, //gelb
|
{ 0, 7, 4, 1, 0, 255, 255 }}; //cyan
|
/** 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 von Thing */ |
Polyeder cube; |
/** Instanz vom Datentyp Matrix */ |
Matrix m = new Matrix(); |
|
/** Creates a new instance of Cube */ |
public Cube() { |
myThread.start(); |
} |
|
/** |
* Wuerfel 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() { |
cube = new Polyeder(koord, poly_param, 320, 200,6); |
m.scale(5,5,5); |
m.translate(0,0,10); |
cube.update(m); |
m.clear(); |
|
m.translate(-cube.wpos[wx], -cube.wpos[wy], -cube.wpos[wz]); |
m.rotate(0.003, -0.004, 0.001); |
m.translate(cube.wpos[wx], cube.wpos[wy], cube.wpos[wz]); |
|
while(zeigen) { |
cube.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.setColor(new Color(255,255,200)); |
big.fillRect(0,0, this.getWidth(), this.getHeight()); |
for(int i = 0; i < cube.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(cube.sichtbar(cube.p[i])) |
big.fillPolygon(cube.p[i]); |
} |
g2d.drawImage(bi, 0,0,this); |
} |
} |