Exemple #1
0
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]))
Exemple #2
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)