miércoles, 10 de enero de 2018

Fractal de Koch




El siguiente código contendrá el fractal de Koch, tendremos una estructura llamada "punto", que será para poder utilizar los valores de x,y.
También, tendremos una función que sólo imprime los puntos que le mandemos a dicha función.



//
//  main.c

//
//  Created by Andrés Peña on 16/11/17.
//  Copyright © 2017 Andrés Peña. All rights reserved.
//  Universidad Autónoma Metropolitana
//  Unidad Cuajimalpa


----------------------------------------------------------------

#include <math.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
----------------------------------------------------------------

typedef struct
{
    double x, y;
    
} PUNTO;

----------------------------------------------------------------

void segmento(PUNTO *p1, PUNTO *p2)
{
    printf("%lf %lf\n", p1->x, p1->y);
    printf("%lf %lf\n\n", p2->x, p2->y);
    return;
}

----------------------------------------------------------------

void Fractal_Koch(PUNTO *pi,PUNTO *pf,int level){
    
    PUNTO pnew1, pnew2,pnew3;
    double tercio = (pf->x - pi->x) / 3.0;
    if (level==0) {
        segmento(pi, pf);
        return;
    }else if (level > 0)
        pnew1.x = pi->x + tercio;
    pnew1.y = pi->y + (pf->y - pi->y) / 3.0;
    pnew3.x = pf->x  - tercio;
    pnew3.y = pf->y - (pf->y - pi->y) / 3.0;
    pnew2.x = (pnew1.x+pnew3.x) * cos( 3.141592/3) - (pnew3.y - pnew1.y) * sin(3.141592/3);
    pnew2.y = (pnew1.y+pnew3.y) * cos( 3.141592/3) + (pnew3.x - pnew1.x) * sin(3.141592/3);
    
    Fractal_Koch(pi, &pnew1, level - 1);
    
    Fractal_Koch(&pnew1, &pnew2, level -1);
    
    Fractal_Koch(&pnew2, &pnew3, level - 1);
    
    Fractal_Koch(&pnew3,pf, level -1);
    
    return;
    
}
----------------------------------------------------------------

// Dicha función del frantal de koch sólo genera una linea con los triángulos correspondientes al fractal, si se desea hacer el copo de koch completo, tendríamos que llamar a la siguiente función:

----------------------------------------------------------------

void copo(int level,int lado){
    PUNTO pv1,pv2,pv3;
    pv1.x = 0;
    pv1.y = 0;
    pv2.x = lado * cos(2 * 3.141592 / 3.0);
    pv2.y = lado * sin(2 * 3.141592 / 3.0);
    pv3.x = lado * cos(3.141592 / 3.0);
    pv3.y = lado * sin(3.141592 / 3.0);
    Fractal_Koch(&pv1, &pv2 , level);
    Fractal_Koch(&pv2, &pv3 , level);
    Fractal_Koch(&pv3, &pv1 , level);
    
    return;
  }

----------------------------------------------------------------

// Dicha función completa el copo de koch 

// En la función Main, sólo tendríamos que llamar a la función "copo" de la siguiente manera.

// NO ES IMPORTANTE llamar a la estructura "punto" en el Main.

----------------------------------------------------------------


int main(){

    copo(4,4);


}
----------------------------------------------------------------

// Si se desea probar el fractal, se sugiere utilizar Gnuplot.

// Y al momento de compilar y correr  se recomienda guardar los puntos en un archivo de la siguiente manera.

//gcc main.c (main.c es en mi caso, en su caso es el nombre del archivo como lo guardaron).

//./a.out > temporal.txt






La siguiente imagen es el Copo de Koch en Gnuplot:







Fractal de Sierpinski-Triángulo

Este Fractal, es llamado el fractal de Sierpinski-Triángulo. El siguiente vínculo explica que es dicho fractal: http://www.dmae.upm.es/c...