5角形に色を設定して描画

Applet で5角形に色を設定して描画します。

Java Applet の実行は、次のリンクをクリックして下さい。
アプレットを実行しようとするとセキュリティの警告画面が表示されますが、解除して下さい。
5角形に色を設定して描画

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして applet_pentagon.java の名前で保存して下さい。
    //★ Applet で5角形に色を設定して描画する    前田 稔
    import java.applet.Applet;
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.applet.MainFrame;
    
    public class applet_pentagon extends Applet
    {   private SimpleUniverse universe = null;
    
        // main Method
        public static void main(String[] args)
        {   new MainFrame(new applet_pentagon(), 300, 300);  }
    
        // Constructor
        public applet_pentagon() {  }
    
        // Applet 初期化
        public void init()
        {   setLayout(new BorderLayout());
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(config);
            add("Center", canvas);
    
            // SimpleUniverseを生成
            universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // Scene を生成
            universe.addBranchGraph(createSceneGraph());
        }
    
        // 5角形を生成
        public BranchGroup createSceneGraph()
        {   int i;
    
            BranchGroup objRoot = new BranchGroup();
            Point3d[] vect = new Point3d[7];
            for(i=0; i<7; i++)  vect[i] = new Point3d();
            for(i=1; i<6; i++)  Rot(72.0f*i, 0.5f, vect[i]);
            Rot(72.0f, 0.5f, vect[6]);
    
            int[] stripVertexCounts = { 7 };
            TriangleFanArray geometry =
              new TriangleFanArray(vect.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3, stripVertexCounts);
            geometry.setCoordinates(0, vect);
    
            Color3f[] colors = new Color3f[7];
            colors[0] = new Color3f(1.0f, 1.0f, 1.0f);
            for(i=1; i<7; i++)  colors[i] = new Color3f((float)Math.random(), (float)Math.random(), (float)Math.random());
            geometry.setColors(0, colors);
    
            PolygonAttributes pattr = new PolygonAttributes();
            pattr.setCullFace(PolygonAttributes.CULL_FRONT); //表面をカリング
            Appearance aleft = new Appearance();
            aleft.setPolygonAttributes(pattr);
            Shape3D shape = new Shape3D(geometry, aleft);
            objRoot.addChild(shape);
            return objRoot;
        }
    
        //★ 回転計算(rt=度)、中心(0,0)、半径(len)
        public void Rot(float rt, float len, Point3d vect)
        {   vect.x = (float)(Math.sin(rt / 180 * Math.PI)) * len;
            vect.y = (float)(Math.cos(rt / 180 * Math.PI)) * len;
            vect.z = 0;
        }
    
        // 終了処理
        public void destroy()
        {   universe.cleanup();  }
    }
    
  2. Java Applet を起動する HTMLファイルです。
    <html>
    <body>
    <h3>5角形に色を設定して描画</h3>
      <applet code="applet_pentagon" width="300" height="300">
      </applet>
    </body>
    </html>
    
  3. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    Java Applet を使ったプログラムですが、コマンドラインから普通の Java と同様に実行することが出来ます。
    アプレットの実行は HTMLファイルをダブルクリックして起動して下さい。
    アプレットを実行しようとするとセキュリティの警告画面が表示されますが、解除して下さい。
    乱数で色を設定しているので、実行の度に色が変わるので試してみて下さい。

プログラムの説明

  1. このプログラムは createSceneGraph() メソッド以外は「ColorCube を自動的に回転する」と同じ要領です。
    基本的な説明は ColorCube を自動的に回転する を参照して下さい。
    Java では、ガベージコレクションが領域を自動的に解放してくれるので destroy() メソッドは必要無いかも知れません。
    しかし Sun Java3D のサンプルでは destroy() を定義しているので、これを尊重することにします。
  2. 5角形の頂点に乱数で色を設定したシーンを生成する createSceneGraph() メソッドです。
    5角形の描画には、中心座標と扇型に広がる座標を指定する TriangleFanArray を使っています。
    座標の設定は vect[0] が中心座標で、vect[1]〜vect[5] に5角形の頂点座標を設定します。
    さらに vect[6] には元の座標に戻るために vect[1] と同じ値を設定します。
    座標は三次元座標で定義するのですが、現在の所Z座標はゼロに設定しています。
    Window の座標系と三次元座標系では、向きが異なります。
    このプログラムで作成したポリゴンは、裏向きになっています。
    そこで setCullFace を CULL_FRONT に設定します。
    カリングと座標系の説明は Windows Guid を参照して下さい。
    頂点に色を設定するので TriangleArray() に GeometryArray.COORDINATES | GeometryArray.COLOR_3 を指定します。
        // 5角形を生成
        public BranchGroup createSceneGraph()
        {   int i;
    
            BranchGroup objRoot = new BranchGroup();
            Point3d[] vect = new Point3d[7];
            for(i=0; i<7; i++)  vect[i] = new Point3d();
            for(i=1; i<6; i++)  Rot(72.0f*i, 0.5f, vect[i]);
            Rot(72.0f, 0.5f, vect[6]);
    
            int[] stripVertexCounts = { 7 };
            TriangleFanArray geometry =
            //  new TriangleFanArray(vect.length, GeometryArray.COORDINATES, stripVertexCounts);
              new TriangleFanArray(vect.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3, stripVertexCounts);
            geometry.setCoordinates(0, vect);
    
            Color3f[] colors = new Color3f[7];
            colors[0] = new Color3f(1.0f, 1.0f, 1.0f);
            for(i=1; i<7; i++)  colors[i] = new Color3f((float)Math.random(), (float)Math.random(), (float)Math.random());
            geometry.setColors(0, colors);
    
            PolygonAttributes pattr = new PolygonAttributes();
            pattr.setCullFace(PolygonAttributes.CULL_FRONT); //表面をカリング
            //pattr.setCullFace(PolygonAttributes.CULL_BACK); //裏面をカリング
            Appearance aleft = new Appearance();
            aleft.setPolygonAttributes(pattr);
            Shape3D shape = new Shape3D(geometry, aleft);
            objRoot.addChild(shape);
            return objRoot;
        }
        
  3. 回転座標を計算する Rot() メソッドです。
    回転の中心座標を 0,0 に、半径を len として、rt(度)回転した座標を vect に格納します。
        //★ 回転計算(rt=度)、中心(0,0)、半径(len)
        public void Rot(float rt, float len, Point3d vect)
        {   vect.x = (float)(Math.sin(rt / 180 * Math.PI)) * len;
            vect.y = (float)(Math.cos(rt / 180 * Math.PI)) * len;
            vect.z = 0;
        }
        

Java Game Program