Rotation Class に Point を使う

二次元座標を回転する Rotation Object Class に Point 構造体(Class)を使います。
Java では、構造体が使えないので Class を使います。

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

プログラムの作成

  1. メモ帳などでタイプして Rotation2.java の名前で保存して下さい。
    Rotation2.java は二次元座標を回転する独立した Object Class です。
    javac でコンパイルして Rotation2.class を作成して下さい。
    //★ 二次元座標回転 Object Class    前田 稔
    import java.awt.*;
    class Rotation2
    {   Point   center;             //回転軸の中心
        Point   pos= new Point();   //回転後の座標
    
        // Constructor
        Rotation2(Point pnt)
        {   center = pnt;
        }
    
        // 座標回転メソッド
        void Rot(double w, Point pnt)
        {   double px,py;
            px = pnt.x-center.x;
            py = pnt.y-center.y;
            pos.x= (int)(px*Math.cos(w/180*3.14))-(int)(py*Math.sin(w/180*3.14))+center.x;
            pos.y= (int)(px*Math.sin(w/180*3.14))+(int)(py*Math.cos(w/180*3.14))+center.y;
        }
    }
    
  2. Rotation2 Class を使って図形を描くメインプログラムです。
    先にコンパイルした Rotation2.class と組み合わせて図形を描きます。
    //★ Rotation2 Class を使って図形を描く    前田 稔
    import java.awt.*;
    
    public class DrawMain2 extends Frame
    {   public Color  color1,color2;
    
        // Main
        public static void main(String args[])
        {   new DrawMain2();
        }
    
        // Constructor
        public DrawMain2()
        {   super("Dwaw Main");
            color1 = new Color(255,0,0);
            color2 = new Color(0,255,0);
            setSize(500,300);
            setVisible(true);
        }
    
        // Paint Method
        public void paint(Graphics g)
        {   int     i;
            Point   pos;
    
            super.paint(g);
            g.setColor(color1);
            Rotation2 rotation2 = new Rotation2(new Point(150,160));
            pos= new Point(150,60);
            for(i=0; i<7; i++)
            {   rotation2.Rot(360.0/7.0*3.0,pos);
                g.drawLine(pos.x,pos.y,rotation2.pos.x,rotation2.pos.y);
                pos.x= rotation2.pos.x;
                pos.y= rotation2.pos.y;
            }
    
            g.setColor(color2);
            rotation2.center.x= 350;
            rotation2.center.y= 160;
            pos.x= 350;
            pos.y= 60;
            for(i=0; i<8; i++)
            {   rotation2.Rot(360.0*3.0/8.0,pos);
                g.drawLine(pos.x,pos.y,rotation2.pos.x,rotation2.pos.y);
                pos.x= rotation2.pos.x;
                pos.y= rotation2.pos.y;
            }
        }
    }
    
  3. DrawMain2.java をコンパイルして class オブジェクトを実行して下さい。
    ページ先頭の画面が表示されたら完成です。
    プログラムの終了は DOS 画面でタイトルバーの「×」をクリックして下さい。
    「×」をクリックしても終了しない時は、DOS 画面で [Ctrl] キーを押しながら [C] をタイプして下さい。

プログラムの説明

  1. AWT(Abstract Windowing Tools)を使ったプログラムの基本的な説明は AWT を使って、色を設定して線を描く を参照して下さい。
    Point は二次元座標の構造体(Class)です。
    Java では、構造体が使えないので Class を使います。
  2. paint() は描画処理で呼び出されるメソッドです。
    super.paint(g) で Super Class の paint を呼び出して、画面を初期化します。
    g.setColor(color1) で描画色を設定します。
    new Rotation2(new Point(150,160)) で図形の中心座標を指定して Rotation2 をインスタンス化します。
    pos は drawLine() で図形を描く開始座標です。
    rotation2.Rot(360.0/7.0*3.0,pos) で pos を回転した座標を rotation2.pos に求めます。
    g.drawLine() で pos から rotation2.pos に線を描画します。
    pos に rotation2.pos の座標を設定して繰り返します。
    画面左側の図形に続いて、右側の図形を描画します。
        // Paint Method
        public void paint(Graphics g)
        {   int     i;
            Point   pos;
    
            super.paint(g);
            g.setColor(color1);
            Rotation2 rotation2 = new Rotation2(new Point(150,160));
            pos= new Point(150,60);
            for(i=0; i<7; i++)
            {   rotation2.Rot(360.0/7.0*3.0,pos);
                g.drawLine(pos.x,pos.y,rotation2.pos.x,rotation2.pos.y);
                pos.x= rotation2.pos.x;
                pos.y= rotation2.pos.y;
            }
    
            g.setColor(color2);
            rotation2.center.x= 350;
            rotation2.center.y= 160;
            pos.x= 350;
            pos.y= 60;
            for(i=0; i<8; i++)
            {   rotation2.Rot(360.0*3.0/8.0,pos);
                g.drawLine(pos.x,pos.y,rotation2.pos.x,rotation2.pos.y);
                pos.x= rotation2.pos.x;
                pos.y= rotation2.pos.y;
            }
        }
        
  3. Point を使うときは java.awt.* をインポートして下さい。
    「Point center;」で定義した状態は、C言語で言う所の Class のポインタが定義されただけで、その値は null になっています。
    Point center は Constructor で渡された Point pnt(pntと同じポインタの値)を代入するのでインスタンス化する必要はないのですが、 Point pos は参照する前にインスタンス化しなければなりません。
        import java.awt.*;
        class Rotation2
        {   Point   center;             //回転軸の中心
            Point   pos= new Point();   //回転後の座標
        
  4. 回転座標の説明は Windows Guid を参照して下さい。

【NOTE】

  1. ゲームプログラムで使えそうな Java の構造体(Class)には次のようなものがあります。
    Point 構造体(Class)です。
        int x       x 座標です。 
        int y       y 座標です。 
        
    コンストラクタです。
        Point()                 座標空間の原点 (0, 0) に点を構築して初期化します。 
        Point(int x, int y)     座標空間の指定された位置 (x、 y) に点を構築して初期化します。 
        Point(Point p)          点を構築し、指定された Point と同じ位置に初期化します。
        
    使えそうなメソッドです。
        void move(int x, int y) 
            この点を (x、 y) 座標平面上の指定された位置に移動します。 
        void setLocation(Point p) 
            この点の位置を、指定された位置に設定します。 
        public void translate(int dx, int dy)
            (x, y) の位置にあるこの点を、x 軸に沿って dx、y 軸に沿って dy に移動して、点 (x + dx, y + dy) を表すようにします。
        
  2. Point2D.Float 構造体(Class)です。
        import java.awt.geom.Point2D;
    
        float x     この Point2D の X 座標です。 
        float y     この Point2D の Y 座標です。 
        
    コンストラクタです。
        Point2D.Float() 
            座標 (0, 0) で Point2D を構築および初期化します。 
        Point2D.Float(float x, float y) 
            指定された座標で Point2D を構築および初期化します。 
        
    使えそうなメソッドです。
        void setLocation(float x, float y) 
            この Point2D の位置を、指定された float 型の座標に設定します。 
        
  3. Dimension 構造体(Class)です。
        int height  高さを表します。 
        int width   幅を表します。 
        
    コンストラクタです。
        Dimension()             幅と高さがゼロの Dimension のインスタンスを生成します。 
        Dimension(Dimension d)  幅と高さが指定された寸法と一致する Dimension のインスタンスを生成します。 
        Dimension(int width, int height)   Dimension を構築し、指定された幅と高さに初期化します。 
        
    使えそうなメソッドです。
        void setSize(Dimension d) 
            この Dimension オブジェクトのサイズを、指定されたサイズに設定します。 
        void setSize(int width, int height) 
            この Dimension オブジェクトのサイズを、指定された幅と高さに設定します。 
        
  4. Rectangle 構造体(Class)です。
        int height  Rectangle の高さです。 
        int width   Rectangle の幅です。 
        int x       Rectangle の x 座標です。 
        int y       Rectangle の y 座標です。
        
    コンストラクタです。
        Rectangle() 
            左上隅が座標空間の (0, 0) にあり、幅と高さが両方とも 0 の新しい Rectangle を構築します。 
        Rectangle(Dimension d) 
            左上隅が (0, 0) で、幅と高さが Dimension 引数で指定される新しい Rectangle を構築します。 
        Rectangle(int width, int height) 
            左上隅が座標空間の (0, 0) にあり、幅と高さが width 引数および height 引数で指定される新しい Rectangle を構築します。 
        Rectangle(int x, int y, int width, int height) 
            左上隅が (x, y) として指定され、幅と高さが width 引数および height 引数で指定される新しい Rectangle を構築します。 
        Rectangle(Point p) 
            左上隅が指定された Point で、幅と高さが両方とも 0 である新しい Rectangle を構築します。 
        Rectangle(Point p, Dimension d) 
            左上隅が Point 引数で指定され、幅と高さが Dimension 引数で指定される新しい Rectangle を構築します。 
        Rectangle(Rectangle r) 
            指定された Rectangle の値に一致するように初期化された新しい Rectangle を構築します。 
        
    使えそうなメソッドです。
        void setBounds(int x, int y, int width, int height) 
            この Rectangle の境界の Rectangle 領域を、x、y、width、および height で指定された値に設定します。 
        void setLocation(int x, int y) 
            この Rectangle を指定された位置に移動します。 
        void setLocation(Point p) 
            この Rectangle を指定された位置に移動します。 
        void setSize(Dimension d) 
            この Rectangle のサイズを、指定された Dimension に一致するように設定します。 
        void setSize(int width, int height) 
            この Rectangle の大きさを指定された幅と高さに設定します。 
        boolean contains(int x, int y) 
            この Rectangle が、指定された位置 (x, y) にある点を含むかどうかを判定します。 
        boolean contains(Point p) 
            この Rectangle が指定された Point を含むかどうかを判定します。
        void add(int newx, int newy) 
            整数型の引数 newx および newy によって指定される点をこの Rectangle に追加します。 
        void add(Point pt) 
            この Rectangle に、指定された Point を追加します。 
        void add(Rectangle r) 
            Rectangle をこの Rectangle に追加します。 
        

超初心者のプログラム入門(Java2)