-
Notifications
You must be signed in to change notification settings - Fork 0
/
SierpinskiTriangle.h
125 lines (91 loc) · 3.62 KB
/
SierpinskiTriangle.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#pragma once
#include "Fractal.h"
/**
* @class [SierpinskiTriangle]
* @brief klasa reprezentujaca trojkat Sierpinskiego - dziedziczy po klasie Fractal
*/
class SierpinskiTriangle : public Fractal{
public:
/**
* @fn [SierpinskiTriangle]
* @brief konstruktor, ktory alokuje pamiec na wszystkie punkty fraktala, inicjalizuje rozmiary okna
* \ oraz ustawia poczatkowy kolor punktow,
* @param [const float] XWINDOW - szerokosc okna,
* @param [const float] YWINDOW - wysokosc okna.
*/
SierpinskiTriangle(const float XWINDOW, const float YWINDOW);
/**
* @fn [CalculatePoints]
* @brief wirtualna metoda override, ktora przelicza punkty fraktala na podstawie
* \ wylosowanego prawdopodobienstwa - wola ona metode @CalculatePoints oraz @MapAllPoints.
*/
void CalculatePoints()override;
/**
* @fn [CalcProbability]
* @brief czysto wirtualna metoda override, ktora wylicza prawdopodobienstwo, na podstawie ktorego
* \ wolana jest odpowiednia metoda skladowa klasy przypisujaca wspolrzedne punktu do tablicy.
*/
void CalcProbability()override;
/**
* @fn [MapPointX]
* @brief czysto wirtualna metoda override, ktora mapuje wspolrzedna x punktu fraktala,
* @param [float] x - wspolrzedna x punktu,
* @return [float] odpowiednio zmapowana nowa wspolrzedna x.
*/
float MapPointX(float x)override;
/**
* @fn [MapPointY]
* @brief czysto wirtualna metoda override, ktora mapuje wspolrzedna y punktu fraktala,
* @param [float] y - wspolrzedna y punktu,
* @return [float] odpowiednio zmapowana nowa wspolrzedna y.
*/
float MapPointY(float y)override;
/**
* @fn [Func_1-3]
* @brief zestaw metod, na podstawie ktorych przeliczane sa punkty w specyficzny dla danej metody sposob,
*
* @param [int] iter - numer obecnej iteracji, a takze indeks dla danej pary punktow.
*/
void Func_1(int iter);
void Func_2(int iter);
void Func_3(int iter);
};
SierpinskiTriangle::SierpinskiTriangle(const float XWINDOW, const float YWINDOW)
:Fractal(XWINDOW, YWINDOW)
{
CalculatePoints();
MapAllPoints();
}
void SierpinskiTriangle::CalcProbability(){
m_probability = rand()% 3 + 1;
}
void SierpinskiTriangle::Func_1(int iter){
m_xy[iter].first = (m_xy[iter-1].first) / 2.0f;
m_xy[iter].second = (m_xy[iter-1].second) / 2.0f;
}
void SierpinskiTriangle::Func_2(int iter){
m_xy[iter].first = (m_xy[iter-1].first) / 2.0f + 0.5f;
m_xy[iter].second = (m_xy[iter-1].second) / 2.0f;
}
void SierpinskiTriangle::Func_3(int iter){
m_xy[iter].first = (m_xy[iter-1].first) / 2.0f + 0.25f;
m_xy[iter].second = (m_xy[iter-1].second) / 2.0f + (std::sqrt(3.0f) / 2.0f);
}
float SierpinskiTriangle::MapPointX(float x){
return x * m_xwindow * 0.85f + m_xwindow / 13.0f;
}
float SierpinskiTriangle::MapPointY(float y){
return 1.1f * y * m_ywindow / 2.0f + 20.0f;
}
void SierpinskiTriangle::CalculatePoints(){
srand(time(NULL));
for(int i = 1; i < ITERATION_MAX; ++i){
CalcProbability();
if(m_probability == 1)
Func_1(i);
else if(m_probability == 2)
Func_2(i);
else if(m_probability == 3)
Func_3(i);
}
}