7

私には、ユーザーが星を描くことができるプログラムを作成するタスクがあります。星は、サイズや腕の量が異なる場合があります。私が基本的な星を扱っていたとき、私はGeneralPathとポイントのテーブルでそれをしていました:

     int xPoints[] = { 55, 67, 109, 73, 83, 55, 27, 37, 1, 43 };
     int yPoints[] = { 0, 36, 36, 54, 96, 72, 96, 54, 36, 36 };
     Graphics2D g2d = ( Graphics2D ) g;
     GeneralPath star = new GeneralPath();
     star.moveTo( xPoints[ 0 ], yPoints[ 0 ] );
     for ( int k = 1; k < xPoints.length; k++ )
     star.lineTo( xPoints[ k ], yPoints[ k ] );
     star.closePath();
     g2d.fill( star );

内側と外側の半径が変化し、腕の数が異なる星を描くには、どの方法を選択すればよいですか?これは私が取得する必要があるものです:

代替テキストhttp://img228.imageshack.us/img228/6427/lab6c.jpg

4

3 に答える 3

20

n個のアームがあるということは、最終的に2n個の頂点になり、偶数の頂点が外側の円に、奇数の頂点が内側の円にあることを意味します。中心から見ると、頂点は等間隔の角度になっています(角度は2 * PI / 2 * n = Pi / nです)。単位円(r = 1)では、点i = 0..nのx、y座標はcos(x)、sin(x)です。これらの座標にそれぞれの半径(iが奇数か偶数かによってrOuterまたはrInner)を掛け、そのベクトルを星の中心に追加して、星のパスの各頂点の座標を取得します。

与えられた数の腕、中心座標、外側、内側の半径を持つ星の形を作成する関数は次のとおりです。

public static Shape createStar(int arms, Point center, double rOuter, double rInner) {
    double angle = Math.PI / arms;

    GeneralPath path = new GeneralPath();

    for (int i = 0; i < 2 * arms; i++) {
        double r = (i & 1) == 0 ? rOuter : rInner;
        Point2D.Double p = new Point2D.Double(
            center.x + Math.cos(i * angle) * r, 
            center.y + Math.sin(i * angle) * r);
        if (i == 0) {
            path.moveTo(p.getX(), p.getY());
        }
        else {
            path.lineTo(p.getX(), p.getY());
        }
    }
    path.closePath();
    return path;
}
于 2010-04-25T22:16:57.960 に答える
3

同じクラス (GeneralPath) を使用する必要があると思いますが、ここでは頂点座標の計算方法に焦点を当てる必要があります。

最初に頭に浮かぶのは、(0,0) を中心とする半径 R1 の円に 2N 点を配置することです。次に、そのベクトルに c を掛けて、すべての奇数頂点を「ストレッチ」します。定数 c は R2/R1 (つまり、内半径と外半径の比率) に等しくなければなりません。

しかし、おそらくもっと簡単な解決策があります...

于 2010-04-25T21:43:57.797 に答える
2

これは、円上で等間隔の点を見つけるのに役立つ可能性のあるです。コンストラクターでポイント数nをパラメーターにするだけです。

private int n;
...
public CircleTest(int n) {
    ...
    this.n = n;
}
...
for (int i = 0; i < n; i++) {
    double t = 2 * Math.PI * i / n;
    ...
}
于 2010-04-25T23:54:51.743 に答える