Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: karolina.s en 6 Mayo 2014, 22:06 pm



Título: Programacion de un fractal: Triangulo Sierpinsky
Publicado por: karolina.s en 6 Mayo 2014, 22:06 pm
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!

Código
  1. #include <stdio.h>
  2.  
  3. #define NTRIANGULOS 3
  4.  
  5.  
  6. struct Triangulo
  7. {
  8.    float xA,yA;
  9.    float xB,yB;
  10.    float xC,yC;
  11. };
  12.  
  13. int main(int argc, char *argv[])
  14. {
  15.    struct Triangulo triangulo[NTRIANGULOS];
  16.    int n,m,p,ntriangulos;
  17.  
  18.    FILE*fout;
  19.    fout=fopen("triangulo.txt","w");
  20.  
  21.    triangulo[0].xA = 0.0;
  22.    triangulo[0].yA = 0.0;
  23.    triangulo[0].xB = 1.0;
  24.    triangulo[0].yB = 0.0;
  25.    triangulo[0].xC = 0.5;
  26.    triangulo[0].yC = 1.0;
  27.    ntriangulos=1.0;
  28.  
  29. do{
  30.  
  31.    for(n=ntriangulos-1; n>=0&&ntriangulos<NTRIANGULOS; n--)
  32.    {
  33. m=ntriangulos;
  34.        /* segundo triangulo */
  35.        triangulo[m].xA=triangulo[n].xA + (triangulo[n].xB - triangulo[n].xA)/2.0 ;
  36.        triangulo[m].yA=triangulo[n].yA;
  37.  
  38.        triangulo[m].xB=triangulo[n].xB;
  39.        triangulo[m].yB=triangulo[n].yB;
  40.  
  41.        triangulo[m].xC=triangulo[n].xA + 3.0*(triangulo[n].xB - triangulo[n].xA)/4.0;
  42.        triangulo[m].yC=triangulo[n].yA + (triangulo[n].yC- triangulo[n].yA)/2.0 ;
  43.  
  44. p=ntriangulos;
  45.        /* tercer triangulo */
  46.        triangulo[p].xA=triangulo[n].xA + (triangulo[n].xB - triangulo[n].xA)/4.0;
  47.        triangulo[p].yA=triangulo[n].yA + (triangulo[n].yC - triangulo[n].yA)/2.0;
  48.  
  49.        triangulo[p].xB=triangulo[n].xA + 3*(triangulo[n].xB -triangulo[n].xA)/4.0;
  50.        triangulo[p].yB=triangulo[n].yA + (triangulo[n].yC -triangulo[n].yB)/2.0;
  51.  
  52.        triangulo[p].xC= triangulo[n].xC;
  53.        triangulo[p].yC= triangulo[n].yC;
  54.  
  55.  
  56.        /* primer triangulo - inicial */
  57.  
  58.        triangulo[n].xC=triangulo[n].xA + (triangulo[n].xB - triangulo[n].xA)/4.0;
  59.        triangulo[n].yC=triangulo[n].xA +(triangulo[n].yC - triangulo[n].yA)/2.0;
  60.  
  61.        triangulo[n].xB=triangulo[n].xA + (triangulo[n].xB - triangulo[n].xA)/2.0;
  62.        triangulo[n].yB=triangulo[n].yB;
  63.  
  64.        triangulo[n].xA=triangulo[n].xA;
  65.        triangulo[n].yA=triangulo[n].yA;
  66.  
  67.        ntriangulos++;
  68.  
  69.    }
  70.  
  71. } while(ntriangulos<NTRIANGULOS);
  72.  
  73.  
  74. for(n=0;n<ntriangulos;n++)
  75. {
  76.    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);
  77. }
  78.  
  79.    fclose(fout);
  80.    return(0);
  81. }
  82.  

Code:Blocks, lenguaje C


Título: Re: Programacion de un fractal: Triangulo Sierpinsky
Publicado por: eferion en 6 Mayo 2014, 22:53 pm
Código
  1. int ntriangulos;
  2. // ...
  3. 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.

Código
  1. m=ntriangulos;
  2. //...
  3. 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".

Código
  1. do{
  2.  
  3.    for(n=ntriangulos-1; n>=0&&ntriangulos<NTRIANGULOS; n--)
  4.    {
  5.        // ....
  6.        ntriangulos++;
  7.    }
  8.  
  9. } 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...

Código
  1.    ntriangulos=1.0;
  2.  
  3. do{
  4.  
  5.    for(n=ntriangulos-1; n>=0&&ntriangulos<NTRIANGULOS; n--)
  6.  

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.