• title: GeneralPathなどで星型図形を作成する tags: [GeneralPath, Path2D, Polygon, Icon, AffineTransform] author: aterai pubdate: 2009-02-09T18:26:33+09:00 description: GeneralPathなどを使って星型の図形をパネルに描画したり、アイコンを作成します。

概要

GeneralPathなどを使って星型の図形をパネルに描画したり、アイコンを作成します。

サンプルコード

class StarPanel1 extends JPanel{
  @Override public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    int w = getWidth();
    int h = getHeight();
    //<blockquote cite="%JAVA_HOME%/demo/jfc/Java2D/src/java2d/demos/Lines/Joins.java">
    GeneralPath p = new GeneralPath();
    p.moveTo(- w / 4.0f, - h / 12.0f);
    p.lineTo(+ w / 4.0f, - h / 12.0f);
    p.lineTo(- w / 6.0f, + h / 4.0f);
    p.lineTo(+     0.0f, - h / 4.0f);
    p.lineTo(+ w / 6.0f, + h / 4.0f);
    p.closePath();
    //</blockquote>
    g2.translate(w/2, h/2);
    g2.setColor(Color.YELLOW);
    g2.fill(p);
    g2.setColor(Color.BLACK);
    g2.draw(p);
  }
}
View in GitHub: Java, Kotlin
class StarIcon2 implements Icon{
  private static final int R1 = 20;
  private static final int R2 = 40;
  //double R1 = R2*Math.sin(Math.PI/10.0)/Math.cos(Math.PI/5.0); //=15.0;
  private static final int VC = 5; //16;
  private final AffineTransform at;
  private final Shape star;
  public StarIcon2() {
    double agl = 0.0;
    double add = 2*Math.PI/(VC*2);
    Path2D.Double p = new Path2D.Double();
    p.moveTo(R2*1, R2*0);
    for(int i=0;i<VC*2-1;i++) {
      agl+=add;
      if(i%2==0) p.lineTo(R1*Math.cos(agl), R1*Math.sin(agl));
      else       p.lineTo(R2*Math.cos(agl), R2*Math.sin(agl));
    }
    p.closePath();
    at = AffineTransform.getRotateInstance(-Math.PI/2,R2,0);
    star = new Path2D.Double(p, at);
  }
  @Override public int getIconWidth() {
    return 2*R2;
  }
  @Override public int getIconHeight() {
    return 2*R2;
  }
  @Override public void paintIcon(Component c, Graphics g, int x, int y) {
    Graphics2D g2d = (Graphics2D) g;
    g2d.translate(x, y);
    g2d.setPaint(Color.YELLOW);
    g2d.fill(star);
    g2d.setPaint(Color.BLACK);
    g2d.draw(star);
    g2d.translate(-x, -y);
  }
}

解説

  • 上段、左
    • GeneralPath(=Path2D.Float)を使用して星型図形を作成
    • %JAVA_HOME%/demo/jfc/Java2D/src/java2d/demos/Lines/Joins.javaを参考
  • 上段、中
    • Polygonを使用して星型図形を作成
  • 上段、右
    • フォントから星型(★="\u2605")のアウトラインを取得して描画
  • 下段、中
    • Path2D.Doubleで、星型図形を作成しアイコンを作成
    • 外側の円の半径は、40px
  • 下段、右
    • Path2D.Doubleで、星型図形を作成しアイコンを作成
    • 外側の円の半径は、40px、内側の円の半径は、20px

参考リンク

コメント