2010-04-25 13 views
6

Ho il compito di scrivere il programma che consente agli utenti di disegnare stelle, che possono differire per dimensioni e quantità di braccia. Quando avevo a che fare con le stelle di base che stavo facendo con GeneralPath e tabelle di punti:Disegno di forme a stella con parametri variabili

 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); 

Quale metodo devo scegliere per disegnare stelle con raggio interno ed esterno variabile, così come diverse quantità di armi? Questo è ciò che dovrei ottenere:

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

risposta

19

Avere n braccia significa che si finisce con i vertici 2n, quelli pari sono sul cerchio esterno, e quelli dispari sul cerchio interno. Visto dal centro, i vertici sono ad angoli equidistanti (l'angolo è 2 * PI/2 * n = Pi/n). Su un cerchio unitario (r = 1), le coordinate x, y dei punti i = 0..n sono cos (x), sin (x). Moltiplicate quelle coordinate con il rispettivo raggio (rOuter o rInner, a seconda che i sia pari o dispari) e aggiungete quel vettore al centro della stella per ottenere le coordinate per ogni vertice nel percorso stellare.

Ecco la funzione di creare una forma a stella con dato numero di bracci, coordinata centro ed esterno, raggio interno:

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; 
} 
3

Penso che si dovrebbe utilizzare le stesse classi (GeneralPath), ma qui si dovrebbe concentrarsi su come calcolare le coordinate del vertice.

La prima cosa che mi viene in mente è posizionare 2N punti su un cerchio di raggio R1, centrato a (0,0). Quindi, "allunga" ogni vertice dispari moltiplicando il suo vettore per c. La costante c dovrebbe essere uguale a R2/R1 (cioè la proporzione di raggi interni ed esterni).

Ma forse c'è una soluzione più semplice ...

2

Ecco un example di trovare punti equidistanti su una circle che può aiutare. Basta fare il numero di punti, n, un parametro nel costruttore.

private int n; 
... 
public CircleTest(int n) { 
    ... 
    this.n = n; 
} 
... 
for (int i = 0; i < n; i++) { 
    double t = 2 * Math.PI * i/n; 
    ... 
} 
Problemi correlati