Wuerfel
Pyramide
Oktaeder
Tetraeder

myJava.rwp

Wuerfel
 javadoc

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);

    }

}