Question

je dois dessiner un polygone de côtés « n » étant donné 2 points (le centre et 1 de son sommet) juste que j'allaiteront en mathématiques. Je lis beaucoup et tout ce que j'ai pu comprendre (je ne sais pas si elle est correcte):

Ok, je prends la distance entre les 2 points (rayon) avec le théorème de Pythagore:

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

Et l'angle entre ces 2 points avec atan2, comme ceci:

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

Où xc, YC le point central et x, y est le seul sommet savoir.

Et avec ces données que je fais:

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

Le problème est que le programme fonctionne correctement parce DonT il dessiner les lignes pas comme un polygone.

Quelqu'un sait comment assez de mathématiques pour donner un coup de main? im travaillant dans ce primitives graphiques avec C et turbo C.


Modifier. Je ne veux pas remplir le polygone, dessiner juste

Était-ce utile?

La solution

Pensez à ce que 360/sides retourne en fait, si sides est pas un facteur de 360. (Ce qui est division entière - voir ce que 360/7 retourne en fait)

Il n'y a pas besoin d'utiliser des degrés du tout -. Utiliser 2*Math_PI/(double)nsides et le travail tout au long de radians

vous pouvez également omettre la dernière ligne en utilisant la fonction de module (module de nsides).

Si vous avez plus de 7 côtés vous ne serez pas en mesure de stocker tous les points. Vous n'avez pas besoin de stocker tous les points si vous dessinez simplement le polygone plutôt que de le stocker -. Juste le dernier point et l'actuel

Autres conseils

Vous devez utiliser radians dans tous vos calculs. Voici un programme complet qui illustre la meilleure façon de faire ceci:

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

qui fournit en sortie (ni fantaisie, mais vous devriez obtenir l'idée):

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

J'ai écrit la fonction polygon selon vos spécifications d'origine, en passant en seulement deux coordonnées. En aparté, vous ne le faites pas veulent les abs appelle dans vos calculs pour le rayon et l'angle parce que:

  • ils ne servent à rien pour le rayon (depuis -n 2 = n 2 pour tous n).
  • ils sont mauvais pour l'angle puisque cela vous force dans un quadrant spécifique (mauvais point de départ).

Je ne vais pas vous donner la réponse, mais j'ai quelques conseils. Tout d'abord, apprendre comment fonctionne la ligne de dessin à fond. Lorsque vous avez ce bas, essayez d'écrire un triangle rempli renderer. En général, les polygones pleins sont dessinés une ligne de balayage horizontal à la fois, de haut en bas. Vous êtes travail est de déterminer le démarrage et l'arrêt coordonnée x pour chaque ligne de balayage. On notera que le bord d'un polygone suit une ligne droite (indice, indice) ...:)

Vous essayez de dessiner un poly rempli, je suppose?

Si vous allez essayer d'en tirer les polys en utilisant une ligne primitive, vous allez avoir beaucoup de douleur à venir à vous. DiCroce réellement vous a donné de très bons conseils sur ce front.

Votre meilleur pari est de trouver une primitive qui remplit pour vous et fournir une liste de coordonnées. Il est à vous de déterminer les coordonnées pour lui donner.

Je pense que le principal problème est:. atan2(abs(y - yc), abs(x - xc)); vous donne radians, pas de degrés, juste le convertir en degrés et essayer

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

Ou, vous pouvez enregistrer les points dans un tableau et appeler la routine DrawPoly si vous avez un.

Si vous voulez un polygone rempli, appelez FillPoly si vous avez un.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top