-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrille.py
149 lines (126 loc) · 4.88 KB
/
grille.py
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
138
139
140
141
142
143
144
145
146
147
148
149
"""
Projet 2 : Ricosheep
Amal ABDALLAH
Nicolas SEBAN
Adam SOUIOU
"""
from typing import List
from dataclasses import dataclass
import cfg
import fltk
@dataclass
class Case:
ax: int
ay: int
bx: int
by: int
centre_x: int
centre_y: int
class Grille:
view_ax: float; view_ay: float
view_bx: float; view_by: float
marge_largeur: float; marge_hauteur: float
nb_colonne: int ; nb_ligne: int
largeur_case: float; hauteur_case: float
carre: bool
cases: List[List[Case]]
__slots__ = tuple(__annotations__)
def __init__(self, nb_colonne: int, nb_ligne: int,
marge_largeur=0.95, marge_hauteur=0.95,
grille_base=None,
grille_pos=(0, 0, cfg.largeur_fenetre, cfg.hauteur_fenetre),
carre=True):
"""
Objet Grille, permettant de dessiner... une grille.
:param float marge_largeur: Proportion en largeur de la grille
dans la box définie par ``grille_pos``
:param float marge_hauteur: Proportion en hauteur de la grille
dans la box définie par ``grille_pos``
:param Grille grille_base: Si une grille est reçue,
elle sera utilisée pour définir la position absolue de la nouvelle
grille par rapport à celle-ci et les coordonnées données
par ``grille_pos``..
:param tuple grille_pos: Position absolue (par rapport à la fenêtre)
si ``grille_base`` vaut ``None``, sinon position par rapport
aux coordonnées des cases de ``grille_base``.
:param bool carre: Si ``True`` adapte la taille de la grille,
de sorte que les cases restent carrées.
"""
if grille_base is not None:
self.view_ax, self.view_ay = grille_base.getAbsoluteCoordsTL(
grille_pos[0], grille_pos[1]
)
self.view_bx, self.view_by = grille_base.getAbsoluteCoordsBR(
grille_pos[2], grille_pos[3]
)
else:
self.view_ax, self.view_ay = grille_pos[0], grille_pos[1]
self.view_bx, self.view_by = grille_pos[2], grille_pos[3]
self.marge_largeur = marge_largeur
self.marge_hauteur = marge_hauteur
self.nb_colonne = nb_colonne
self.nb_ligne = nb_ligne
self.carre = carre
self.genererCases()
def genererCases(self):
"""
Initialise une liste d'objets ``Cases``, dont les coordonnées
ont été adaptées à la taille de la fenêtre.
:return: Tuple composé d'une liste de ``Cases`` et la taille
(carré) en pixels des cases générées.
"""
largeur_interieur = (self.view_bx - self.view_ax)*self.marge_largeur
hauteur_interieur = (self.view_by - self.view_ay)*self.marge_hauteur
self.cases = []
self.largeur_case, self.hauteur_case = (
largeur_interieur/self.nb_colonne,
hauteur_interieur/self.nb_ligne
)
if self.carre:
m = min(self.largeur_case, self.hauteur_case)
self.largeur_case, self.hauteur_case = m, m
self.view_ax += ((self.view_bx - self.view_ax)
- self.largeur_case*self.nb_colonne) / 2
self.view_ay += ((self.view_by - self.view_ay)
- self.hauteur_case*self.nb_ligne) / 2
for j in range(self.nb_ligne):
ligne = []
for i in range(self.nb_colonne):
ax = self.view_ax + (i * self.largeur_case)
ay = self.view_ay + (j * self.hauteur_case)
ligne.append(
Case(
ax=ax,
ay=ay,
bx=ax + self.largeur_case,
by=ay + self.hauteur_case,
centre_x=ax + self.largeur_case / 2,
centre_y=ay + self.hauteur_case / 2,
)
)
self.cases.append(ligne)
def draw(self, callback=None):
"""
Dessine les cases
"""
for y, ligne in enumerate(self.cases):
for x, case in enumerate(ligne):
fltk.rectangle(
case.ax, case.ay,
case.bx, case.by,
'white'
)
if callback is not None:
callback(case, x, y)
def getAbsoluteCoordsTL(self, x_case: int, y_case: int):
"""
Récupère les coordonnées pixels du coin supérieur gauche de la case.
"""
return (self.cases[y_case][x_case].ax,
self.cases[y_case][x_case].ay)
def getAbsoluteCoordsBR(self, x_case: int, y_case: int):
"""
Récupère les coordonnées pixels du coin inférieur droit de la case.
"""
return (self.cases[y_case][x_case].bx,
self.cases[y_case][x_case].by)