AWTの高度な機能:Graphics2D

  1. 目的

    ここでは、AWTのより進んだ機能であるgraphics2Dの機能を紹介します。線幅や線種を設定するstroke機能、図形内部にグラデーションやテクスチャで塗りつぶすpaint機能、領域のAND,OR演算を行うarea機能の三種です。

  2. stroke機能

    1. Graphics2Dクラスの利用
      Graphics2Dクラスのオブジェクトは、Graphicsクラスから生成できます。ここでは、modeを切り替えて三種の機能を用いた表示を行います。
        public void paint(Graphics g){
          Graphics2D g2 = (Graphics2D)g;
          if(mode==Stroke) drawStroke(g2);
          if(mode==Paint) drawPaint(g2);
          if(mode==AreaMd) drawArea(g2);
        }

    2. Stroke機能
      次のように、setStroke()で、線幅を設定できます。

       g2.setStroke(new BasicStroke(5.0F));
      5.0Fが線幅になります。Fはfloat型の定数を指定します。これで、

       g2.drawLine(10,20,200,20);
      等で、5画素幅の線が表示できます。さらに、

        g2.setStroke(new BasicStroke(9.0F,
         BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));

      のように、最初のCAP_ROUNDで、太い線の終端形状を指定できます。CAP_ROUNDは円形の丸い終端を指定します。二つ目のJOIN_ROUNDは、折れ線の折れ線などの曲り角の形状を指定します。JOIN_BEVELの場合、交点を直線で切断します。JOIN_MITERは二つの線分を延長したアウトラインになります。この場合、JOIN_MITERの次の引数で、指定角度より小さい場合、JOIN_BEVELで表示します。波線の場合、さらに、引数を追加します。

        g2.setStroke(new BasicStroke(3.0F,
         BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,10.0F,dashPattern,0.0F));

      この例は、JOIN_MITERを指定し、dashPattern で点線のパターンを配列で指定します。以下は10.0の長さ表示し2.0の長さを空白区間とします。この配列の要素は繰返し利用されます。2点鎖線の場合は、dashPattern[]配列の要素を追加します。
       float[] dashPattern={10.0F,2.0F};

      表示例
        

  3. 領域処理

    1. 領域と共通領域
      領域を定義し、そこに、領域を追加します。このとき、図形演算が指定できます。次は、重複する楕円でAreaを定義します。次に、空のAreaを定義し、area1を追加し、area2をAND演算します。二つの領域が重複した部分が、areaAとなり、これを表示します。
          Area area1=new Area(new Ellipse2D.Double(50,100,150,100));
          Area area2=new Area(new Ellipse2D.Double(150,50,150,100));
          Area area3=new Area(new Ellipse2D.Double(200,100,150,100));
      
          Area areaA=new Area();
          areaA.add(area1);
          areaA.intersect(area2);
          g2.draw(areaA);

      表示例
       中央と左下の楕円の共通部分を赤線で表示した例です。
       

    2. 領域の和集合
      areaBに二つの領域の和集合を生成します。和集合はadd()で領域を追加します。g2.drawの替わりに、g2.fillを行うと、領域を塗りつぶします。
          Area areaB=new Area();
          areaB.add(area2);
          areaB.add(area3);
          g2.setColor(Color.green);
          g2.draw(areaB);
      上の緑の線が、二つの楕円領域の和集合のアウトラインになります。他に。subtract(引き算)、exclusiveor の演算が利用できます。

  4. 塗りつぶし

    1. 機能
      2点とその色を指定して、グラデーションによる塗りつぶしを行うことができます。グラデーションは2点を結ぶ直線と直角方向が同じ色になります。
       同様に、画像を読み込んでおくと、指定した図形の内部に画像を表示します。

    2. グラデーション
      グラデーションによる塗りつぶしが指定できます。2点とその色を指定して GradientPaint()を生成し、setPaint()で塗りつぶしのスタイルを指定します。
       Point p1=new Point(80,80);
       Point p2=new Point(110,160);
       g2.setPaint(new GradientPaint(p1,Color.red,p2,Color.blue));
      Ellipse2Dの図形を定義し、g2.fill() で塗りつぶしを行います。
       Ellipse2D circle=new Ellipse2D.Float(20.0F,20.0F,160.0F,160.0F);
       g2.fill(circle);

       

    3. テクスチャマッピング
      まず、画像を読み込みます。
       private BufferedImage buffImage;
       buffImage=ImageIO.read(new File("flower.gif"));
      画像を表示する矩形を定義し、読み込んだ画像と矩形でテクスチャマッピンッグを設定します。
      Rectangle2D anchor=new Rectangle2D.Double(200,20,160,160);
       g2.setPaint(new TexturePaint(buffImage,anchor));
      circle2を作成し、塗りつぶしを指定します。
       Ellipse2D circle2=new Ellipse2D.Float(200.0F,20.0F,160.0F,160.0F);
       g2.fill(circle2);



  5. クリッピング機能
    1. パス
      直線、円、ベジェ曲線、を接続してパス(GeneralPath)を定義することができます。以下は楕円のパスを定義しています。
      GeneralPath clipPath=new GeneralPath();
       Ellipse2D elp=new Ellipse2D.Double(20,50,200,180);
       clipPath.append(elp,false);
      このパスを、クリップ領域に指定することができます。
       g2.setClip(clipPath);
      以後、描画を行うと、クリップ領域の内部のみ表示されます。以下は、(0,0)から、垂直方向から水平方向に50本の直線を描画した例です。クリップ領域でクリップされています。
      Point2D p=new Point2D.Double(0,0);
       for(int i=0;i<50;i++){
        double x=(2*getWidth()*i)/50;
        double y=(2*getHeight()*(50-1-i))/50;
        Point2D q=new Point2D.Double(x,y);
        g2.draw(new Line2D.Double(p,q));
       }

       

  6. プロジェクト

    上記の機能を確認するアプレットプログラムを紹介します。各ボタンを押すと、ここで紹介した機能を実行できます。



  7. プロジェクト

    このプロジェクトをダウンロードできます。次の行をクリックして、advawt.exeファイルを適当なフォルダに保存します。
    ダウンロード開始
    このファイルは自己解凍型の圧縮ファイルです。このファイルを実行すると指定したフォルダに必要なファイルが生成されます。