Triángulo de Sierpinski usando gráficos

El triángulo de Sierpinski es un conjunto fijo fractal y atractivo con la forma general de un triángulo equilátero. Se subdivide recursivamente en triángulos más pequeños.

Acercarse:

  • En el segmento de códigos dado, se crea un triángulo y luego se dibujan otros tres pequeños triángulos adyacentes hasta que la condición de terminación que comprueba si la altura del triángulo es inferior a 5 píxeles se vuelve verdadera.
  • Solo necesitamos verificar si un triángulo dado es menor de 5 píxeles, ya que más allá de eso, los triángulos comenzarían a converger en puntos fijos.
  • Se define un contador colorVal en respuesta a la necesidad estética del triángulo y, en general, recorre todos los colores disponibles al iterar cada conjunto de triángulos.
  • Con esta metodología, también podemos implementar un zoom fractal e hipotéticamente proporcionar un zoom infinito más adelante.

A continuación se muestra la implementación del enfoque anterior:

// C++ code to implement
// Sierpinski Triangle using Graphics
  
#include <math.h>
#include <stdlib.h>
#include <winbgim.h>
  
#define Y 900
#define X 1600
  
// Defining a function to draw a triangle
// with thickness 'delta'
void triangle(float x, float y,
              float h, int colorVal)
{
    setcolor(colorVal % 15 + 1);
  
    for (float delta = 0; delta > -5; delta -= 1) {
        line(x - (h + delta) / sqrt(3),
             y - (h + delta) / 3,
             x + (h + delta) / sqrt(3),
             y - (h + delta) / 3);
        line(x - (h + delta) / sqrt(3),
             y - (h + delta) / 3,
             x,
             y + 2 * (h + delta) / 3);
        line(x,
             y + 2 * (h + delta) / 3,
             x + (h + delta) / sqrt(3),
             y - (h + delta) / 3);
    }
}
  
// Defining a function to draw
// an inverted triangle
// with thickness 'delta'
void trianglev2(float x, float y,
                float h, int colorVal)
{
    setcolor(colorVal % 15 + 1);
  
    for (float delta = 0; delta > -1 + 5; delta -= 1) {
  
        line(x - (h + delta) / sqrt(3),
             y + (h + delta) / 3,
             x + (h + delta) / sqrt(3),
             y + (h + delta) / 3);
        line(x - (h + delta) / sqrt(3),
             y + (h + delta) / 3,
             x,
             y - 2 * (h + delta) / 3);
        line(x,
             y - 2 * (h + delta) / 3,
             x + (h + delta) / sqrt(3),
             y + (h + delta) / 3);
    }
}
  
// A recursive function to draw out
// three adjacent smaller triangles
// while the height is greater than 5 pixels.
int drawTriangles(float x = X / 2,
                  float y = 2 * Y / 3,
                  float h = Y / 2,
                  int colorVal = 0)
{
  
    if (h < 5) {
        return 0;
    }
  
    if (x > 0 && y > 0 && x < X && y < Y) {
        triangle(x, y, h, colorVal);
    }
  
    drawTriangles(x,
                  y - 2 * h / 3,
                  h / 2,
                  colorVal + 1);
    drawTriangles(x - h / sqrt(3),
                  y + h / 3,
                  h / 2,
                  colorVal + 1);
    drawTriangles(x + h / sqrt(3),
                  y + h / 3,
                  h / 2,
                  colorVal + 1);
  
    return 0;
}
  
// Driver code
int main()
{
    initwindow(X, Y);
    trianglev2(X / 2, 2 * Y / 3, Y, 2);
  
    drawTriangles();
    getch();
    closegraph();
  
    return 0;
}

Producción:

Publicación traducida automáticamente

Artículo escrito por PercyX y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *