Domanda

ho bisogno di disegnare un poligono di lati "n" dato 2 punti (il centro e 1 del suo vertice) solo che faccio schifo in matematica. Ho letto un sacco e tutto questo è quello che ho potuto capire (non so se è corretto):

Ok, prendo la distanza tra i punti 2 (raggio) con il teorema di Pitagora:

sqrt(pow(abs(x - xc), 2) + pow(abs(y - yc), 2));

E l'angolo tra questi 2 punti con atan2, in questo modo:

atan2(abs(y - yc), abs(x - xc));

Dove xc, yc è il punto centrale e x, y è l'unico vertice so.

E con quei dati faccio:

void polygon(int xc, int yc, int radius, double angle, int sides)
{
    int i;
    double ang = 360/sides; //Every vertex is about "ang" degrees from each other
    radian = 180/M_PI;
    int points_x[7]; //Here i store the calculated vertexs
    int points_y[7]; //Here i store the calculated vertexs

    /*Here i calculate the vertexs of the polygon*/
    for(i=0; i<sides; i++)
    {
        points_x[i] = xc + ceil(radius * cos(angle/radian));
        points_y[i] = yc + ceil(radius * sin(angle/radian));
        angle = angle+ang;
    }

    /*Here i draw the polygon with the know vertexs just calculated*/
    for(i=0; i<sides-1; i++)
        line(points_x[i], points_y[i], points_x[i+1], points_y[i+1]);
    line(points_y[i], points_x[i], points_x[0], points_y[0]);
}

Il problema è che il programma non funzionano correttamente perché disegnare le linee non come un poligono.

Qualcuno come sa abbastanza di matematica per dare una mano? im che lavorano in questo grafiche primitive con C e Turbo C.


Modifica:. Non voglio riempire il poligono, basta disegnarlo

È stato utile?

Soluzione

Considerate ciò che in realtà 360/sides ritorna se sides non è un fattore di 360. (Questo è divisione intera - vedere cosa 360/7 restituisce in realtà)

Non v'è alcuna necessità di utilizzare gradi a tutti -. Utilizzare 2*Math_PI/(double)nsides e lavorare in tutta in radianti

Inoltre è possibile omettere la linea finale, utilizzando la funzione di modulo (nsides modulo).

Se si dispone di più di 7 lati non sarà in grado di memorizzare tutti i punti. Non è necessario per memorizzare tutti i punti se si sta semplicemente disegno del poligono, piuttosto che la memorizzazione esso -. Solo l'ultimo punto e quello attuale

Altri suggerimenti

Si dovrebbe essere utilizzando radianti in tutti i vostri calcoli. Ecco un programma completo che illustra il modo migliore per fare questo:

#include <stdio.h>

#define PI 3.141592653589

static void line (int x1, int y1, int x2, int y2) {
    printf ("Line from (%3d,%3d) - (%3d,%3d)\n", x1, y1, x2, y2);
}

static void polygon (int xc, int yc, int x, int y, int n) {
    int lastx, lasty;
    double r = sqrt ((x - xc) * (x - xc) + (y - yc) * (y - yc));
    double a = atan2 (y - yc, x - xc);
    int i;

    for (i = 1; i <= n; i++) {
        lastx = x; lasty = y;
        a = a + PI * 2 / n;
        x = round ((double)xc + (double)r * cos(a));
        y = round ((double)yc + (double)r * sin(a));
        line (lastx, lasty, x, y);
    }
}

int main(int argc, char* argv[]) {
    polygon (0,0,0,10,4);   // A diamond.
    polygon (0,0,10,10,4);  // A square.
    polygon (0,0,0,10,8);   // An octagon.
    return 0;
}

che le uscite (nessuna fantasia grafica qui, ma si dovrebbe ottenere l'idea):

===
Line from (  0, 10) - (-10,  0)
Line from (-10,  0) - (  0,-10)
Line from (  0,-10) - ( 10,  0)
Line from ( 10,  0) - (  0, 10)
===
Line from ( 10, 10) - (-10, 10)
Line from (-10, 10) - (-10,-10)
Line from (-10,-10) - ( 10,-10)
Line from ( 10,-10) - ( 10, 10)
===
Line from (  0, 10) - ( -7,  7)
Line from ( -7,  7) - (-10,  0)
Line from (-10,  0) - ( -7, -7)
Line from ( -7, -7) - (  0,-10)
Line from (  0,-10) - (  7, -7)
Line from (  7, -7) - ( 10,  0)
Line from ( 10,  0) - (  7,  7)
Line from (  7,  7) - (  0, 10)

ho scritto la funzione polygon secondo la vostra specifica originale, passando in soli due coordinate. Per inciso, non è necessario vogliono quelli abs chiamate nei calcoli per il raggio e l'angolo perché:

  • sono inutili per il raggio (dal -n 2 = n 2 per tutti n).
  • sono un male per l'angolo dal momento che vi costringerà in un quadrante specifico (sbagliata punto di partenza).

Non ho intenzione di solo dare la risposta, ma ho qualche consiglio. In primo luogo, imparare come linea di disegno funziona dentro e fuori. Quando si ha questo giù, provare a scrivere un renderer triangolo pieno. Generalmente, poligoni pieni sono disegnati 1 linea di scansione orizzontale alla volta, dall'alto verso il basso. Sei compito è quello di determinare la coordinata avvio e l'arresto x per ogni linea di scansione. Si noti che il bordo di un poligono segue una linea retta (suggerimento, suggerimento) ...:)

Si sta cercando di disegnare un poli pieno immagino?

Se avete intenzione di provare a disegnare i poligoni utilizzando una linea primitiva, si sta andando ad avere un sacco di dolore venire da voi. dicroce in realtà ti ha dato alcuni molto buoni consigli su questo fronte.

La cosa migliore è quello di trovare un primitivo che riempie per voi e per fornire una lista di coordinate. E 'a voi per determinare le coordinate di dargli.

Credo che il problema principale è:. atan2(abs(y - yc), abs(x - xc)); ti dà radianti, non gradi, solo convertirlo in gradi e cercare

/* all angles in radians */
double ainc = PI*2 / sides;
int x1, y1;
for (i = 0; i <= sides; i++){
    double a = angle + ainc * i;
    int x = xc + radius * cos(a);
    int y = yc + radius * sin(a);
    if (i > 0) line(x1, y1, x, y);
    x1 = x; y1 = y;
}

In alternativa, è possibile salvare i punti in un array e chiamare la routine DrawPoly se hai uno.

Se si desidera un poligono pieno, chiamare FillPoly se hai uno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top