📜  使用图形的Sierpinski三角形

📅  最后修改于: 2021-04-16 06:22:45             🧑  作者: Mango

Sierpinski三角形是具有等边三角形整体形状的分形和有吸引力的固定集。它递归地细分为较小的三角形。

方法:

  • 在给定的代码段中,创建一个三角形,然后绘制出三个其他相邻的小三角形,直到终止条件检查该三角形的高度是否小于5个像素,然后返回真。
  • 我们只需要验证给定的三角形是否小于5个像素,因为超出该范围三角形将开始在固定点收敛。
  • 定义了计数器colorVal以响应三角形的美学需要,并且总而言之,它通过迭代每个三角形集来循环遍历所有可用的颜色。
  • 使用这种方法,我们还可以进一步实现分形缩放,并假设以后提供无限缩放。

下面是上述方法的实现:

// C++ code to implement
// Sierpinski Triangle using Graphics
  
#include 
#include 
#include 
  
#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;
}

输出: