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)。将这些坐标乘以各自的半径(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;
}
于 2010-04-25T22:16:57.960 回答
3

我认为您应该使用相同的类(GeneralPath),但在这里您应该关注如何计算顶点坐标。

我首先想到的是在半径为 R1 的圆上定位 2N 个点,以 (0,0) 为中心。然后,通过将其向量乘以 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 回答