Programacion de un fractal: Triangulo Sierpinsky

Iniciado por karolina.s, 6 Mayo 2014, 22:06 PM

0 Miembros y 1 Visitante están viendo este tema.

karolina.s

Hola a todos! Necesito ayuda con un programa que he escrito para generar el triangulo de Sierpinsky. El caso es que el ordenador lee solo el segundo subtriangulo (abajo der) y el primero (abajo izq.) y completamente ignora el tercero (arriba), aunque tenga un indice diferente. Como puedo arreglar este problema? Otro problema que tengo es que necesito que la division del triangulo en tres se aplique a TODOS los nuevos triangulos formados ... por lo que estoy viendo ahora tengo la sensacion que solo se me esta dividiendo el de abajo izq.!ARGGGGG!
Muchas gracias de antemano!


#include <stdio.h>

#define NTRIANGULOS 3


struct Triangulo
{
    float xA,yA;
    float xB,yB;
    float xC,yC;
};

int main(int argc, char *argv[])
{
    struct Triangulo triangulo[NTRIANGULOS];
    int n,m,p,ntriangulos;

    FILE*fout;
    fout=fopen("triangulo.txt","w");

    triangulo[0].xA = 0.0;
    triangulo[0].yA = 0.0;
    triangulo[0].xB = 1.0;
    triangulo[0].yB = 0.0;
    triangulo[0].xC = 0.5;
    triangulo[0].yC = 1.0;
    ntriangulos=1.0;

do{

    for(n=ntriangulos-1; n>=0&&ntriangulos<NTRIANGULOS; n--)
    {
m=ntriangulos;
        /* segundo triangulo */
        triangulo[m].xA=triangulo[n].xA + (triangulo[n].xB - triangulo[n].xA)/2.0 ;
        triangulo[m].yA=triangulo[n].yA;

        triangulo[m].xB=triangulo[n].xB;
        triangulo[m].yB=triangulo[n].yB;

        triangulo[m].xC=triangulo[n].xA + 3.0*(triangulo[n].xB - triangulo[n].xA)/4.0;
        triangulo[m].yC=triangulo[n].yA + (triangulo[n].yC- triangulo[n].yA)/2.0 ;

p=ntriangulos;
        /* tercer triangulo */
        triangulo[p].xA=triangulo[n].xA + (triangulo[n].xB - triangulo[n].xA)/4.0;
        triangulo[p].yA=triangulo[n].yA + (triangulo[n].yC - triangulo[n].yA)/2.0;

        triangulo[p].xB=triangulo[n].xA + 3*(triangulo[n].xB -triangulo[n].xA)/4.0;
        triangulo[p].yB=triangulo[n].yA + (triangulo[n].yC -triangulo[n].yB)/2.0;

        triangulo[p].xC= triangulo[n].xC;
        triangulo[p].yC= triangulo[n].yC;


        /* primer triangulo - inicial */

        triangulo[n].xC=triangulo[n].xA + (triangulo[n].xB - triangulo[n].xA)/4.0;
        triangulo[n].yC=triangulo[n].xA +(triangulo[n].yC - triangulo[n].yA)/2.0;

        triangulo[n].xB=triangulo[n].xA + (triangulo[n].xB - triangulo[n].xA)/2.0;
        triangulo[n].yB=triangulo[n].yB;

        triangulo[n].xA=triangulo[n].xA;
        triangulo[n].yA=triangulo[n].yA;

        ntriangulos++;

    }

} while(ntriangulos<NTRIANGULOS);


for(n=0;n<ntriangulos;n++)
{
    fprintf(fout,"%g\t%g\n%g\t%g\n%g\t%g\n",triangulo[n].xA,  triangulo[n].yA, triangulo[n].xB, triangulo[n].yB, triangulo[n].xC, triangulo[n].yC);
}

    fclose(fout);
    return(0);
}


Code:Blocks, lenguaje C

eferion

int ntriangulos;
// ...
ntriangulos=1.0;


Es una pijotada, pero si la variable es de tipo entero... no le pases floats... y qué pasa si te da por poner 1.5?? funcionará como te esperas?? seguramente no.

m=ntriangulos;
//...
p=ntriangulos;


Esto para que?? si el valor de "p" no cambia después... usa ntriangulos directamente... tener variables duplicadas no tiene sentido y, como norma general, dificulta la legibilidad del código.

Es más, si te das cuenta, m y n tienen el mismo valor en cada iteración del bucle, luego "triangulo[m].loquesea" se pierde cuando llegas a "triangulo[p].loquesea".


do{

    for(n=ntriangulos-1; n>=0&&ntriangulos<NTRIANGULOS; n--)
    {
        // ....
        ntriangulos++;
    }

} while(ntriangulos<NTRIANGULOS);


¿Ese "ntriangulos" debería estar ahi?? si es así, sería más lógico ponerlo al lado de "n--" para que quede más claro el código.

Es más, si tenemos en cuenta que...


    ntriangulos=1.0;

do{

    for(n=ntriangulos-1; n>=0&&ntriangulos<NTRIANGULOS; n--)


entonces, el bucle for solo se ejecuta una vez... qué sentido tiene eso?

Tu código es bastante confuso y trabado... ah si, y también te recomiendo empezar a practicar con el depurador de código.