class TestVueMatriceArene(unittest.TestCase): """ Cette classe sert à tester la vue matricielle d'un pavé On crée une vue matricielle d'une arène dans une direction aléatoire, à une position aléatoire On prend pour les tests des distancees entre 1 et 5 mètres """ def setUp(self): self.arene = Arene() # Création aléatoire des variables l = [random.randint(1, 5) * random.choice([1, -1]) for i in range(2)] origine = Point(l[0], l[1], 0) teta = random.random() * random.choice( [1, -1]) * 2 * pi # Angle du vecteur entre l'origine et le pavé v = Vecteur(1, 0, 0).rotate(teta).norm() # True est obligatoire pour que test_vue_dessus affiche le pavé au centre self.view_mat = VueMatriceArene(self.arene, origine.clone(), v.clone(), True) def test_init(self): self.assertIsInstance(self.view_mat.origine, Point) self.assertIsInstance(self.view_mat.arene, Arene) self.assertIsInstance(self.view_mat.ox, Vecteur) self.assertIsInstance(self.view_mat.ajuste, bool) def test_vue_dessus(self): """ On ajoute à l'arène un pavé de dimensions (1,1,1) dans l'axe Ox de la vue, à une distance comprise entre 1 et 5 mètres S'assure qu'on a bien une matrice carrée, de la bonne taille contenant des entiers, et qu'elle a bien détecté un pavé dans la zone """ teta2 = random.random() * random.choice( [1, -1]) * 2 * pi # Angle de rotation du pavé self.dist = random.randint( 1, 5) # Distance qu'on va mettre entre l'origine et le centre du pavé self.p = Pave(1, 1, 1, self.view_mat.origine + self.view_mat.ox * self.dist) self.p.rotate(teta2) self.arene.add(self.p) print("Evaluatin view of:\n", self.p, "\n") dx = self.dist + max( self.p.width, self.p.length) # On s'assure d'englober tout le pavé m = self.view_mat.vueDessus(dx) self.assertEqual(len(m), int(dx * VueMatriceArene.res)) if self.view_mat is not None: print(repr(self.view_mat)) for i in range(len(m)): for j in range(len(m[0])): self.assertIsInstance(m[i][j], int) self.assertEqual(len(m), len(m[0]))
class Vue2DPave(Vue2D): """ Représentation en 2 dimensions d'un pavé pour tkinter """ def __init__(self, pave, canevas): """ Crée une copie du pavé en argument à la bonne échelle pour l'affichage 2D, puis le convertis en lignes tkinter Il est supposé que les sommets du pave sont rangés dans le bon ordre (anti-horaire) et que les 4 premiers sont les plus hauts :param pave: Pavé à représenter :type pave: Pave :param canevas: Canevas sur lequel dessiner :type canevas: Canvas """ Vue2D.__init__(self) self.pave = Pave(width=pave.width * PIX_PAR_M_2D, length=pave.length * PIX_PAR_M_2D, height=pave.height * PIX_PAR_M_2D, centre=pave.centre * PIX_PAR_M_2D) self.pave.rotate( (pave.vertices[1] - pave.vertices[0]).to_vect().get_angle()) self.cotes = list() for i in range(0, 3): self.cotes.append( canevas.create_line(pave.vertices[i].x, pave.vertices[i].y, pave.vertices[i + 1].x, pave.vertices[i + 1].y)) self.cotes.append( canevas.create_line(pave.vertices[3].x, pave.vertices[3].y, pave.vertices[0].x, pave.vertices[0].y)) def afficher(self, canevas): """ Met à jour les coordonnées des points """ if self.pave and canevas: #sommets: [Point] sommets = self.pave.vertices for i in range(0, 3): canevas.coords(self.cotes[i], sommets[i].x, sommets[i].y, sommets[i + 1].x, sommets[i + 1].y) canevas.coords(self.cotes[3], sommets[3].x, sommets[3].y, sommets[0].x, sommets[0].y)