Frage

i müssen ein Polygon von „n“ Seiten 2 Punkte gegeben ziehen (das Zentrum und 1 von seinem Scheitelpunkt) nur, dass ich in math saugen. Ich habe gelesen, viel und all das ist, was ich in der Lage gewesen, um einen Reim (ich weiß nicht, ob es richtig ist):

Ok, nehme ich den Abstand zwischen den Punkten 2 (Radius) mit dem Satz von Pythagoras:

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

Und der Winkel zwischen diesen zwei Punkten mit atan2, wie diese:

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

Wo xc, yc ist der Mittelpunkt und x, y die einzige Ecke kennen.

Und damit Daten i tun:

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

Das Problem ist, dass das Programm arbeitet nicht richtig, weil es die Linien nicht wie ein Polygon zeichnen.

Jemand wie genug von Mathematik kennt eine Hand zu geben? im Arbeits in dieser Grafik-Primitiven mit C und Turbo C.


Edit:. Ich möchte nicht das Polygon füllen, ist es nur ziehen

War es hilfreich?

Lösung

Überlegen Sie, was 360/sides tatsächlich zurückkehrt, wenn sides kein Faktor von 360 ist. (Diese Integer-Division ist - was 360/7 tatsächlich zurückkehrt)

Es besteht keine Notwendigkeit zu verwenden Grad bei allen -. Verwendung 2*Math_PI/(double)nsides und Arbeit während in Radian

Auch können Sie die letzte Zeile auslassen durch die Modul-Funktion (Modul nsides).

Wenn Sie mehr als 7 Seiten haben, werden Sie nicht in der Lage sein, alle Punkte zu speichern. Sie haben nicht alle die Punkte speichern müssen, wenn Sie einfach das Polygon zeichnen, anstatt es zu speichern -. Gerade den letzten Punkt und die aktuellen

Andere Tipps

Sie sollten Radiant in allen Berechnungen werden. Hier ist ein komplettes Programm, das zeigt, wie man am besten, dies zu tun:

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

die Ausgänge (keine Lust Grafiken hier, aber man sollte auf die Idee kommen):

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

Ich habe die polygon Funktion wie pro Ihre ursprüngliche Spezifikation geschrieben, vorbei in nur zwei Koordinaten. Als beiseite, nicht wahr wollen diese abs Anrufe in Ihren Berechnungen für Radius und Winkel, weil:

  • Sie sind nutzlos für Radius (seit -n 2 = n 2 für alle n).
  • Sie sind schlecht für Winkel da, dass Sie in einen bestimmten Quadranten zwingen wird (falschen Ausgangspunkt).

Ich werde nicht nur Ihnen die Antwort geben, aber ich habe ein paar Ratschläge. Zuerst lernen, wie Strichzeichnung von innen und außen wirkt. Wenn Sie diese nach unten haben, versuchen Sie ein gefülltes Dreieck Renderer zu schreiben. Im Allgemeinen wird 1 gefüllt Polygone horizontale Abtastzeile zu einem Zeitpunkt, von oben nach unten gezogen wird. Sie sind Job ist das Starten und Stoppen x-Koordinate für jede Scan-Linie zu bestimmen. Beachten Sie, dass die Kante eines Polygons einer geraden Linie folgt (hint, hint) ...:)

Sie versuchen, ein Poly gefüllt zu zeichnen ich denke?

Wenn Sie vorhaben, zu versuchen, die Polys ziehen Sie eine Linie primitive verwenden, wirst du eine Menge Schmerzen haben, kommen zu Ihnen. dicroce gab man tatsächlich einige sehr gute Ratschläge an dieser Front.

Ihre beste Wette ist eine primitive, dass Füllungen für Sie und liefern sie eine Koordinatenliste zu finden. Es ist an Ihnen, die Koordinaten zu bestimmen, es zu geben.

ich glaube, das Hauptproblem ist. atan2(abs(y - yc), abs(x - xc)); geben Sie Radianten nicht Grad, nur wandelt es in Grad und versuchen

/* 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;
}

Oder Sie die Punkte in einem Array speichern kann und die DrawPoly Routine aufrufen, wenn Sie eine haben.

Wenn Sie ein gefülltes Polygon möchten, rufen FillPoly, wenn Sie eine haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top