martes, 20 de mayo de 2014

TRIÁNGULO DE SIERPINSKI


Prácticamente es un FRACTAL viene de "dimensión fraccional" – en inglés, fraccional dimensión. La definición de un fractal es un objeto o cantidad que muestra auto-semejanza para todas las escalas. El objeto no tiene por qué demostrar la misma estructura en todas las escalas, pero sí el mismo tipo de estructura. Para que los lectores se hagan una idea, piensen que la longitud de un fractal es la longitud del borde (o la "costa") medida con reglas de diferentes longitudes. Cuanto más corta sea la regla, más grande es la longitud medida. Esta conclusión es conocida como la paradoja de la costa.
 Este triángulo también se basa en un método recursivo. Que comienza con  un triángulo equilátero, como muestra la imagen de la Figura 1.

En cada pasada, se divide  el triángulo en tres triángulos más pequeños. Los lados de cada "sub-triángulo" equilátero tienen la mitad de longitud que los del triángulo original, el cual se dividió. Con la mitad de longitud, el área de cada subtriángulo es un cuarto del original. Por lo tanto, se puede  rellenar el triángulo original con cuatro triángulos pequeños. En el fractal de Sierpinski, sólo lo representaremos con  tres subtriángulos, por lo que el triángulo invertido en el centro es realmente un "agujero". Esto se observa más claramente en la Figura 2.





Con la tercera pasada, se divide cada subtriángulo como si fuera el original. De nuevo se obtienen  tres triángulos más pequeños y un agujero en el centro. El total será de nueve triángulos y cuatro agujeros. Esto se percibe más claramente en la Figura 3.


Nuevamente, podemos observar el elemento recursivo en este fractal, para generar el triángulo de Sierpinski. Comenzamos con tres puntos (A, B, y C) formando las coordenadas de los vértices del triángulo original. Luego, la función recursiva averiguará la mitad de cada lado (AB, BC, y CA) usando los vértices. El orden para subdividir cada triángulo es irrelevante: el izquierdo, el derecho, y luego el superior, o cualquier orden que se quiera seguir.

ALGORITMO


El algoritmo para dibujar el triángulo de Sierpinski se puede separar en dos partes principales. La primera parte, Iniciar_Sierpinski(), es sencillamente la invocación a la función recursiva, Dibujar_Sierpinski(). La segunda parte es el algoritmo de la función recursiva en sí, Dibujar_Sierpinski().
Para Iniciar_Sierpinski(), el algoritmo es:


A, B, y C son los vértices del triángulo original.
Para Dibujar_Sierpinski(), el algoritmo es:


A, B, y C son los vértices del triángulo o subtriángulo.
N es el número de iteraciones.
Para Mitad(), el algoritmo es:



En el algoritmo, no dibujamos nada hasta llegar al triángulo más pequeño; o sea, N = 0. En los otros niveles de profundidad, N > 0, sólo dividimos cada lado en tres triángulos más pequeños y calculamos las dimensiones de cada subtriángulo.
La función Dibujar_Triángulo_Relleno() hace referencia a una función de la biblioteca o API gráfica para dibujar un triángulo según las vértices dadas en orden. Esto es, se trazan las líneas del primer vértice al segundo (A→B), del segundo al tercero (B→C), y del tercero al primero (C→A). El triángulo es dibujado y rellenado con los colores previamente establecidos.



Código en C#:
using System; using System.Drawing;
namespace Sierpinsky
 {
unsafe class Sierpinski
 { public Graphics Draw(Graphics g, int ancho, int alto)
 { Graphics g0 = g; Point* esq = stackalloc Point[3]; esq[0].X = 50; esq[0].Y = alto - 10; esq[1].X = ancho - 10; esq[1].Y = alto - 10; esq[2].X = ancho / 2; esq[2].Y = 10; Sierp(g0, esq, 0); g = g0; return g; }
 private void Sierp(Graphics g0, Point* p, int n)
 { Pen pen = new Pen(Color.Black, 1); g0.DrawLine(pen, p[0], p[1]); g0.DrawLine(pen, p[1], p[2]); g0.DrawLine(pen, p[2], p[0]); Point* p2 = stackalloc Point[3]; if (n<7)
{
p2[0].X = (p[0].X + p[1].X) / 2 + (p[1].X - p[2].X) / 2; p2[0].Y = (p[0].Y + p[1].Y) / 2 + (p[1].Y - p[2].Y) / 2; p2[1].X = (p[0].X + p[1].X) / 2 + (p[0].X - p[2].X) / 2; p2[1].Y = (p[0].Y + p[1].Y) / 2 + (p[0].Y - p[2].Y) / 2; p2[2].X = (p[0].X + p[1].X) / 2; p2[2].Y = (p[0].Y + p[1].Y) / 2;
Sierp(g0, p2, n+1); p2[0].X = (p[1].X + p[2].X) / 2 + (p[1].X - p[0].X) / 2; p2[0].Y = (p[1].Y + p[2].Y) / 2 + (p[1].Y - p[0].Y) / 2; p2[1].X = (p[1].X + p[2].X) / 2 + (p[2].X - p[0].X) / 2; p2[1].Y = (p[1].Y + p[2].Y) / 2 + (p[2].Y - p[0].Y) / 2; p2[2].X = (p[1].X + p[2].X) / 2; p2[2].Y = (p[1].Y + p[2].Y) / 2;
 Sierp(g0, p2, n+1); p2[0].X = (p[0].X + p[2].X) / 2 + (p[2].X - p[1].X) / 2; p2[0].Y = (p[0].Y + p[2].Y) / 2 + (p[2].Y - p[1].Y) / 2; p2[1].X = (p[0].X + p[2].X) / 2 + (p[0].X - p[1].X) / 2; p2[1].Y = (p[0].Y + p[2].Y) / 2 + (p[0].Y - p[1].Y) / 2; p2[2].X = (p[0].X + p[2].X) / 2; p2[2].Y = (p[0].Y + p[2].Y) / 2;
Sierp(g0, p2, n + 1);
       }
     }
   }
 }

REPRODUCCION:





























 (Davidson, Steven R. Curso de Gráficos. 2004-06-07

Sitio Web: http://graficos.conclase.net/curso/?cap=003c#)

No hay comentarios:

Publicar un comentario