使用可变参数绘制星形

owc*_*wca 7 java swing shapes

我的任务是编写允许用户绘制星星的程序,这些星星的大小和武器数量可能不同.当我处理基本的星星时,我使用的是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 );
Run Code Online (Sandbox Code Playgroud)

我应该选择哪种方法来绘制具有可变内径和外径以及不同臂数的恒星?这是我应该得到的:

alt text http://img228.imageshack.us/img228/6427/lab6c.jpg

Pet*_*ser 20

拥有n个臂意味着你最终得到2n个顶点,偶数个位于外圆上,而奇数个位于内圆上.从中心看,顶点处于均匀间隔的角度(角度为2*PI/2*n = Pi/n).在单位圆(r = 1)上,点i = 0..n的x,y坐标是cos(x),sin(x).将这些坐标乘以相应的半径(rOuter或rInner,取决于i是奇数还是偶数),并将该向量添加到星的中心,以获得星形路径中每个顶点的坐标.

这是创建具有给定臂数,中心坐标和外半径的星形的功能:

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;
}
Run Code Online (Sandbox Code Playgroud)