Wuerfel
Pyramide
Oktaeder
Tetraeder

myJava.rwp

Tetraeder
 javadoc

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

    }

}