プログラマメモ2 - programmer no memo2

[java]扇形っぽいのを描く 2009/12/28
2009/12/31

Javaです。ふと扇形っぽいのを描きたくなりました。



java.awt.geom.GeneralPathを使用してます。
あとArc2Dを使っています。パスを閉じる場合に起点と終点を意識しないといけないので、この辺で頭をひねりました。。。


package ggg;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Arc2D;
import java.awt.geom.GeneralPath;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestA1 {

/**
* 中心座標から、指定された半径の円を描くx, y, w, hを求める。
*/
static Rectangle a(int cx, int cy, int r) {

int x = cx - r;
int y = cy - r;
int w = r + r;
int h = r + r;

return new Rectangle(x, y, w, h);
}

static GeneralPath b(int r, int degree) {
// Rectangle rec1 = a(0 + r, 0 + r, r);
Rectangle rec2 = a(0 + r, 0 + r, (int) (r * 0.5));
int x = 0, y = 0, w = r + r, h = w;

int x2 = rec2.x, y2 = rec2.y;
int w2 = rec2.width, h2 = rec2.height;

Arc2D.Double arc1 = new Arc2D.Double(x, y, w, h, 0, degree, Arc2D.OPEN);
Arc2D.Double arc2 = new Arc2D.Double(x2, y2, w2, h2, degree, degree
* -1, Arc2D.OPEN);

GeneralPath path = new GeneralPath();

path.append(arc1, true);
path.lineTo(arc2.getStartPoint().getX(), arc2.getStartPoint().getY());
path.append(arc2, true);
path.lineTo(arc1.getStartPoint().getX(), arc1.getStartPoint().getY());

return path;
}

static class MyFrame extends JFrame {
{
getContentPane().add(new JPanel() {

public void paint(Graphics g) {

Graphics2D g2d = (Graphics2D) g;

GeneralPath path = b(/* 半径 */100, /* 角度 */120);

g2d.fill(path);
g2d.setColor(Color.RED);
g2d.draw(path);

}

});
}

}

public static void main(String[] args) {

MyFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 400);
frame.setLocation(300, 700);
frame.setVisible(true);

}

}

: