Pregunta

i necesidad de elaborar un polígono de "n" lados dan 2 puntos (el centro y 1 de su vértice) sólo que chupan en matemáticas. He estado leyendo mucho y todo esto es lo que he sido capaz de resolverlo (no sé si es correcto):

Ok, i toma la distancia entre los 2 puntos (radio) con el teorema de Pitágoras:

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

Y el ángulo entre estos 2 puntos con atan2, como esto:

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

Donde xc, yc es el punto central y x, y es el único vértice saben.

Y con que los datos que hago:

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

El problema es que el trabajo no haga el programa correctamente, ya que dibujar las líneas no como un polígono.

Alguien sabe cómo lo suficiente de las matemáticas para darle una mano? im que trabajan en este primitivas gráficas con C y Turbo C.


Editar:. No quiero llenar el polígono, simplemente dibujarlo

¿Fue útil?

Solución

Considere lo que en realidad 360/sides devoluciones si sides no es un factor de 360. (Esto es entero división - ver lo que en realidad vuelve 360/7)

No hay necesidad de utilizar grados en absoluto -. 2*Math_PI/(double)nsides uso y trabajo a lo largo en radianes

También se puede omitir la línea final mediante el uso de la función de módulo (módulo nsides).

Si usted tiene más de 7 lados que no será capaz de almacenar todos los puntos. No es necesario para almacenar todos los puntos si simplemente dibujar el polígono en lugar de almacenarla -. Sólo el último punto y el actual

Otros consejos

Usted debe estar utilizando radianes en todos sus cálculos. Aquí es un programa completo que ilustra la mejor manera de hacer esto:

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

qué salidas (no hay gráficos de lujo aquí, pero usted debe conseguir la 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)

He escrito la función polygon según su especificación original, que pasa sólo en las dos coordenadas. Dicho sea de paso, no lo hace desea esas llamadas abs en sus cálculos para la radio y el ángulo, ya que:

  • son inútiles para el radio (desde -n 2 = n 2 para todos n).
  • que son malos para el ángulo desde el que se obligará en un cuadrante específico (punto de partida equivocado).

No voy a sólo le dará la respuesta, pero tengo un consejo. En primer lugar, aprender dibujo lineal funciona dentro y por fuera. Cuando usted tiene esta abajo, tratar de escribir un procesador de triángulo relleno. Generalmente, los polígonos rellenos se dibujan 1 línea de exploración horizontal a la vez, de arriba a abajo. Usted es el trabajo es determinar la x de arranque y parada de coordenadas para cada línea de exploración. Tenga en cuenta que el borde de un polígono sigue una línea recta (pista, pista) ...:)

Usted está tratando de dibujar una poli llenaron supongo?

Si usted va a tratar de sacar los polígonos utilizando una línea primitiva, vas a tener una gran cantidad de dolor que viene a usted. DiCroce en realidad le dio muy buenos consejos en ese frente.

Su mejor apuesta es encontrar una primitiva que llena para usted y suministro de una lista de coordenadas. Depende de usted para determinar las coordenadas para darle.

Creo que el problema principal es:. atan2(abs(y - yc), abs(x - xc)); te da radianes, no en grados, simplemente convertirlo en grados y vuelva a

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

O, usted podría ahorrar los puntos en una matriz y llamar a la rutina DrawPoly si usted tiene uno.

Si quieres un polígono relleno, llame FillPoly si usted tiene uno.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top