This repository has been archived by the owner on Oct 14, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGraphic.cpp
114 lines (101 loc) · 3.5 KB
/
Graphic.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
/**
Graphic.cpp
Louis Grange (50%) et Daniel Ataide (50%)
Version 1.3
**/
#include "Graphic.h"
#include <cmath>
static const Cairo::RefPtr<Cairo::Context>* ptcr(nullptr);
void graphic_set_context(const Cairo::RefPtr<Cairo::Context>& cr) {
ptcr = &cr;
}
void draw_cercle(double x, double y, double rayon, Couleurs couleur) {
rgb color(decode_couleur(couleur));
(*ptcr)->set_source_rgb(color.r, color.g, color.b);
(*ptcr)->set_line_width(0.9);
(*ptcr)->arc(x, y, rayon, 0.0, 2*M_PI);
(*ptcr)->stroke();
}
void fill_cercle(double x, double y, double rayon, Couleurs couleur) {
rgb color(decode_couleur(couleur));
(*ptcr)->set_source_rgb(color.r, color.g, color.b);
(*ptcr)->arc(x, y, rayon, 0.0, 2*M_PI);
(*ptcr)->fill();
}
void draw_carre(double x, double y, double cote, Couleurs couleur) {
rgb color(decode_couleur(couleur));
(*ptcr)->set_source_rgb(color.r, color.g, color.b);
(*ptcr)->set_line_width(0.9);
(*ptcr)->rectangle(x, y, cote, cote);
(*ptcr)->stroke();
}
void fill_carre(double x, double y, double cote, Couleurs couleur) {
rgb color(decode_couleur(couleur));
(*ptcr)->set_source_rgb(color.r, color.g, color.b);
(*ptcr)->rectangle(x, y, cote, cote);
(*ptcr)->fill();
}
void draw_line(double x_start, double y_start, double x_stop, double y_stop,
Couleurs couleur) {
rgb color(decode_couleur(couleur));
(*ptcr)->set_source_rgb(color.r, color.g, color.b);
(*ptcr)->set_line_width(0.9);
(*ptcr)->move_to(x_start, y_start);
(*ptcr)->line_to(x_stop, y_stop);
(*ptcr)->stroke();
}
rgb decode_couleur(Couleurs couleur) {
switch(couleur) {
case BLANC:
return {1,1,1};
case GRIS:
return {0.808, 0.808, 0.808};
case ROUGE:
return {1, 0, 0};
case BLEU_CLAIR:
return {0.3137, 0.686, 0.918};
case BLEU_FONCE:
return {0.196, 0.45, 0.706};
case NOIR:
return {0, 0, 0};
case VIOLET:
return {0.5, 0, 0.5};
case ORANGE:
return {1, 0.65, 0};
case VERT:
return {0.31, 0.68, 0.36};
default:
return {0, 0, 0};
}
}
rgb::rgb(double r, double g, double b) : r(r), g(g), b(b) {};
void orthographic_projection(const Cairo::RefPtr<Cairo::Context>& cr,
const Frame& frame) {
// déplace l'origine au centre du carré le plus grand possible
double centre_carre(std::min(frame.width, frame.height)/2.0);
cr->translate(centre_carre, centre_carre);
// normalise la largeur et hauteur selon default frame
// ET inverse la direction de l'axe Y
double axe_min_diff(0.); //donne xMax-xMin ou yMax-yMin
double axe_min_sum(0.); // xMin+xMax ou yMin+yMin
if (frame.xMax > frame.yMax) {
axe_min_diff = frame.yMax - frame.yMin;
axe_min_sum =frame.yMin + frame.yMax;
}else{
axe_min_diff = frame.xMax - frame.xMin;
axe_min_sum = frame.xMin + frame.xMax;
}
cr->scale((double)frame.width/axe_min_diff,
(double)-frame.height/axe_min_diff);
// décalage vers centre du cadrage
cr->translate(-(axe_min_sum)/2, -(axe_min_sum)/2);
}
void draw_frame(const Cairo::RefPtr<Cairo::Context>& cr, Frame frame) {
cr->set_line_width(2.0);
cr->set_source_rgb(1, 1, 1);
cr->rectangle(0,0, frame.width, frame.height);
cr->fill();
cr->rectangle(0,0, frame.width, frame.height);
cr->set_source_rgb(0.847, 0.8314, 0.8157);
cr->stroke();
}