Wuerfel
Pyramide
Oktaeder
Tetraeder

myJava.rwp

Oktaeder
 javadoc

Quellcode von Oktaeder.java

import javax.swing.*;

import java.awt.*;

import java.awt.image.*;

/*

 * Oktaeder.java

 *

 * Created on 26. Oktober 2004, 09:22

 */

 

/**

 * {@link Matrix}

 * {@link NewPolygon}

 * {@link Polyeder}

 * Erzeugt ein Object der Klasse Polyeder in Form eines Oktaeders 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 Oktaeder extends JApplet implements Runnable {

 

   /** Halbe Hoehe des Oktaeders */

    private double h = Math.sqrt(0.5);

    private double[][] koord = {{ -0.5, -0.5, 0.5,  0.5, 0, 0 },

                                {    0, 0, 0, 0, h, -h },

                                { -0.5,  0.5, 0.5, -0.5, 0, 0 },

                                {    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, 4, 3, 20, 20, 200 },    //blau

                                  { 1, 4, 0, 110, 110, 200 },  //hellblau

                                  { 2, 4, 1, 20, 20, 200 },    //blau

                                  { 3, 4, 2, 110, 110, 200 },  //hellblau

                                  { 0, 3, 5, 110, 110, 200},   //hellblau

                                  { 1, 0, 5, 20, 20, 200},     //blau

                                  { 2, 1, 5, 110, 110, 200},   //hellblau

                                  { 3, 2, 5, 20, 20, 200}};    //blau

                                 

    /** 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 okta;

    /** Instanz vom Datentyp Matrix */

    Matrix m = new Matrix();

    /** Strichstaerke und Format */

        BasicStroke stroke = new BasicStroke(1.0f, BasicStroke.CAP_BUTT,

                                                BasicStroke.JOIN_ROUND);

 

    /** neue Instanz startet den Thread */

    public Oktaeder() {

        myThread.start();

    }

   

    /**

     *  Oktaeder 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() {

        okta = new Polyeder(koord, poly_param,320, 200, 20);

        m.scale(11,11,11);

        m.translate(0,0,19);

        okta.update(m);

        m.clear();

       

        m.translate(-okta.wpos[wx], -okta.wpos[wy], -okta.wpos[wz]);

        m.rotate(-0.007, 0.004, 0.002);

        m.translate(okta.wpos[wx], okta.wpos[wy], okta.wpos[wz]);

       

        while(zeigen) {

            okta.update(m);          

            try {

                Thread.sleep(10);

            } 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 < okta.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(okta.sichtbar(okta.p[i])) {

                big.fillPolygon(okta.p[i]);

                big.setColor(Color.black);

                big.setStroke(stroke);

                big.drawPolygon(okta.p[i]);

            }

        }

        g2d.drawImage(bi, 0,0,this);

    }

}