-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTriangulos.cpp
137 lines (105 loc) · 3.74 KB
/
Triangulos.cpp
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
126
127
128
129
130
131
132
133
134
135
136
137
/*
Shapes experiment
Needs SFML for compiling
JonSeijo
*/
#include <SFML/Graphics.hpp>
#include <iostream>
#include <vector>
#include <ctime>
using std::vector;
typedef sf::Vector2<double> punto;
typedef sf::Vector2f puntoF;
void debug(vector<punto> vs) {
for (auto v : vs) {
std::cout << "(" << v.x << ", " << v.y << ") ";
}
std::cout << "\n";
}
void dibujarTriangulo(punto p1, punto p2, punto p3, sf::RenderWindow &window, sf::Color fillColor=sf::Color(21, 29, 45)) {
sf::ConvexShape triangulo;
triangulo.setPointCount(3);
triangulo.setPoint(0, puntoF(p1));
triangulo.setPoint(1, puntoF(p2));
triangulo.setPoint(2, puntoF(p3));
triangulo.setFillColor(fillColor);
triangulo.setOutlineColor(sf::Color(255, 255, 255));
triangulo.setOutlineThickness(1);
window.draw(triangulo);
}
// Estilo 1 del dibujo, curvas suaves
void dibujarFigura(vector<vector<punto> > figura,
sf::RenderWindow &window, vector<sf::Color> colorScale=vector<sf::Color>()) {
int n = figura[0].size() - 1;
int colorScaleSize = colorScale.size();
if (colorScaleSize != 0 && colorScaleSize != 3*n) {
std::cerr << "Color Scale does not have the correct size: "
<< colorScaleSize << " n: " << n << "\n";
}
for (int i = 1; i <= n; i++) {
if (colorScaleSize) {
dibujarTriangulo(figura[0][i], figura[0][n], figura[1][i], window, colorScale[i]);
dibujarTriangulo(figura[1][i], figura[1][n], figura[2][i], window, colorScale[i+1]);
dibujarTriangulo(figura[2][i], figura[2][n], figura[0][i], window, colorScale[i+2]);
} else {
dibujarTriangulo(figura[0][i], figura[0][n], figura[1][i], window);
dibujarTriangulo(figura[1][i], figura[1][n], figura[2][i], window);
dibujarTriangulo(figura[2][i], figura[2][n], figura[0][i], window);
}
}
}
vector<punto> crearPunteado(punto inicial, punto final, float intervalos) {
vector<punto> punteado;
punteado.push_back(inicial);
punto director = final - inicial;
director.x /= intervalos;
director.y /= intervalos;
punto secuencial = inicial;
for (int cant = 1; cant < intervalos; cant++) {
secuencial.x += director.x;
secuencial.y += director.y;
punteado.push_back(secuencial);
}
punteado.push_back(final);
return punteado;
}
vector<vector<punto> > crearFigura(punto a0, punto b0, punto c0, float n) {
vector<vector<punto> > figura(3, vector<punto>());
figura[0] = crearPunteado(a0, b0, n);
figura[1] = crearPunteado(b0, c0, n);
figura[2] = crearPunteado(c0, a0, n);
return figura;
}
int main() {
sf::ContextSettings settings;
settings.antialiasingLevel = 8;
sf::RenderWindow window(sf::VideoMode(404, 404), "", sf::Style::Default, settings);
window.setVerticalSyncEnabled(true);
window.setFramerateLimit(20);
sf::Color backgroundColor = sf::Color(21, 29, 45);
punto a0(0, 0);
punto b0(400, 0);
punto c0(0, 400);
punto d0(400, 400);
float n = 35;
vector<vector<punto> > figura1 = crearFigura(a0, b0, c0, n);
vector<vector<punto> > figura2 = crearFigura(b0, d0, c0, n);
// Genero una escala de grises
vector<sf::Color> grayScale;
for (float i = 0; i < 3*n; i++) {
float value = (i*255.0f) / (3*n);
grayScale.push_back(sf::Color(value, value, value));
}
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
}
}
window.clear(backgroundColor);
dibujarFigura(figura1, window, grayScale);
dibujarFigura(figura2, window, grayScale);
window.display();
}
}