Sunteți pe pagina 1din 4

Triunghiul lui Sierpinski

Probabil cel mai cunoscut fractal al tuturor timpurilor este așa numitul triunghi al lui Sierpinski. Modul
de realizare al acestui fractal este foarte simplu:
-la început se desenează un triunghi
-apoi se divizează în patru părți egale
-trei dintre ele(cele din exterior) vor fi și ele divizate(folosind același procedeu
-procesul continuă la infinit pentru toate triunghiurile formate.

Cod sursa c++


#include <vector>

class Sierpinski : public Applet


{
private:
static constexpr long long serialVersionUID = 1LL;
public:
Graphics *g;

int deep = 0;
virtual ~Sierpinski()
{
delete g;
}

virtual void paint();

virtual bool mouseDown(Event *ev, int x, int y);

virtual void paint(Graphics *g);

virtual void paintTriangle(Graphics *g, Point *a, Point *b, Point *c, int lvl);
};

//.cpp file code:

void Sierpinski::paint()
{
Color tempVar(255,255,255);
setBackground(&tempVar);
}

bool Sierpinski::mouseDown(Event *ev, int x, int y)


{
if (!ev->metaDown())
{
deep += 1;
}
else if (deep > 0)
{
deep -= 1;
}
repaint();
return true;
}

void Sierpinski::paint(Graphics *g)


{
// Create triangle
std::vector<int> px = {20, 400, 210};
std::vector<int> py = {400, 400, 20};
g->setColor(Color::black);
g->fillPolygon(px, py, 3);
Point tempVar(20,400);
Point tempVar3(210,20);
Point tempVar2(400,400);
paintTriangle(g, &tempVar,&tempVar2,&tempVar3, deep);
}

void Sierpinski::paintTriangle(Graphics *g, Point *a, Point *b, Point *c, int lvl)
{

Point *a1, *b1, *c1, *a2, *b2, *c2, *a3, *b3, *c3;
if (lvl == 0)
{
return;
}
lvl -= 1;

// In the given triangle, amended to include an upside-down triangle


std::vector<int> px = {c->x, (c->x + b->x) / 2, (a->x + c->x) / 2};
std::vector<int> py = {b->y, (c->y + a->y) / 2, (c->y + a->y) / 2};

g->setColor(Color::white);
g->fillPolygon(px, py, 3);
g->setColor(Color::red);
g->drawPolygon(px, py, 3);

// 3 new triangles
a1 = a;
b1 = new Point(c->x, b->y);
c1 = new Point((a->x + c->x) / 2, (c->y + a->y) / 2);
paintTriangle(g, a1, b1, c1, lvl);

a2 = new Point(c->x, b->y);


b2 = b;
c2 = new Point((c->x + b->x) / 2, (c->y + a->y) / 2);
paintTriangle(g, a2, b2, c2, lvl);

a3 = new Point((a->x + c->x) / 2, (c->y + a->y) / 2);


b3 = new Point((c->x + b->x) / 2, (c->y + a->y) / 2);
c3 = c;
paintTriangle(g, a3, b3, c3, lvl);
}

Sierpinski Triangle Quick Drawing.mp4

Bibliografie
https://www.youtube.com/watch?v=vSIng--9P74
https://teoriahaosului2.wordpress.com/2011/06/09/triunghiul-lui-sierpinski/
http://people.ds.cam.ac.uk/imc31/extra/fractali/Fractali%20in%20Visual%20C++.pdf

S-ar putea să vă placă și