JOIN_MITERの時の接合制限値の設定

広告

線の結合方式としてJOIN_MITERを設定した場合、線の結合角度が小さい場合に結合部分の突起の箇所が非常に長くなってしまう場合があります。そこであまり長くなってしまう場合にはJOIN_MITERの代わりにJOIN_BEVELが利用されるように設定する事ができます。 設定は線の太さの何倍までの長さなら突起をJOIN_MITERとして表示するという設定になります。次のコンストラクタを使用します。

指定された属性を持つ実線の BasicStroke を構築します。

パラメータ:
  width - BasicStroke の幅
  cap - BasicStroke の両端の装飾
  join - 輪郭線セグメントの接合部の装飾
  miterlimit - 接合トリミングの制限値 
例外: 
  IllegalArgumentException - width が負の値の場合 
  IllegalArgumentException - cap が CAP_BUTT、CAP_ROUND、または
    CAP_SQUARE のどれでもない場合 
  IllegalArgumentException - miterlimit が 1 より小さく、 join が
    JOIN_MITER の場合 
  IllegalArgumentException - join が JOIN_ROUND、JOIN_BEVEL、または
    JOIN_MITER のどれでもない場合

1番目の引数に線の太さを表すfloat型の値を指定します。

2番目の引数に線の両端の形状を表すint型の値を指定します。

3番目の引数に線の結合方式を表すint型の値を指定します。今回はJOIN_MITERを指定します。

4番目の引数に線の太さの何倍までであれば突起部分を表示するかを表すfloat型の値を指定します。デフォルトは10.0倍となっており倍率は1.0よりも少ない数値は指定できません。

具体的には次のように記述します。

public void paintComponent(Graphics g){
  Graphics2D g2 = (Graphics2D)g;

  BasicStroke wideStroke = new BasicStroke(4.0f, 
                                           BasicStroke.CAP_BUTT, 
                                           BasicStroke.JOIN_MITER, 10.0f);
  g2.setStroke(wideStroke);

  g2.draw(new Line2D.Double(50, 50, 160, 180));
}

サンプルプログラム

簡単なサンプルを一度試してみます。

StrokeTest4.java

import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.*;
import java.awt.BasicStroke;

public class StrokeTest4 extends JPanel{

  public static void main(String[] args){
    JFrame frame = new JFrame();

    StrokeTest4 app = new StrokeTest4();
    frame.getContentPane().add(app);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D)g;

    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                        RenderingHints.VALUE_ANTIALIAS_ON);

    BasicStroke miterStroke1 = new BasicStroke(20.0f, 
                                               BasicStroke.CAP_BUTT, 
                                               BasicStroke.JOIN_MITER, 
                                               3.0f);
    g2.setStroke(miterStroke1);

    GeneralPath polygon = new GeneralPath();
    polygon.moveTo(20, 150);
    polygon.lineTo(40, 50);
    polygon.lineTo(60, 150);
    g2.draw(polygon);

    polygon.reset();

    BasicStroke miterStroke2 = new BasicStroke(20.0f, 
                                               BasicStroke.CAP_BUTT, 
                                               BasicStroke.JOIN_MITER, 
                                               5.0f);
    g2.setStroke(miterStroke2);

    polygon.moveTo(120, 150);
    polygon.lineTo(140, 50);
    polygon.lineTo(160, 150);
    g2.draw(polygon);

    polygon.reset();

    BasicStroke miterStroke3 = new BasicStroke(20.0f, 
                                               BasicStroke.CAP_BUTT, 
                                               BasicStroke.JOIN_MITER, 
                                               10.0f);
    g2.setStroke(miterStroke3);

    polygon.moveTo(220, 150);
    polygon.lineTo(240, 50);
    polygon.lineTo(260, 150);
    g2.draw(polygon);
  }
}

上記をコンパイルした後で実行すると次のように表示されます。

線の結合方式を設定する

左の2つは制限値を超えているので突起部分は表示されていません。(JOIN_BEVELとして表示されます)。

( Written by Tatsuo Ikura )