Beispiel #1
0
 def triangle_angle_cotes_adjacents(self, a, b, gamma):
     c = math.sqrt(a ** 2 + b ** 2 - 2 * a * b * math.cos(radians(gamma)))
     alpha = 90. - gamma / 2 + degres(math.atan((((a - b) * 1.) / (a + b)) / 
             math.tan(radians(gamma / 2))))
     beta = 90. - gamma / 2 - degres(math.atan((a - b) * 1. / (a + b) / 
             math.tan(radians(gamma / 2))))
     return (c, beta, alpha)
Beispiel #2
0
 def triangle_angle_cotes_adjacents(self, a, b, gamma):
     c = math.sqrt(a ** 2 + b ** 2 - 2 * a * b * math.cos(radians(gamma)))
     alpha = 90. - gamma / 2 + degres(math.atan((((a - b) * 1.) / (a + b)) / 
             math.tan(radians(gamma / 2))))
     beta = 90. - gamma / 2 - degres(math.atan((a - b) * 1. / (a + b) / 
             math.tan(radians(gamma / 2))))
     return (c, beta, alpha)
Beispiel #3
0
 def triangle_angle_cote_adjacent_cote_oppose(self, b, c, beta):
     if b <= c * math.sin((beta * math.pi) / 180):
         alpha = gamma = a = 0  # Pas possible de résoudre
     else:
         gamma = degres(math.asin(((c * math.sin((beta * math.pi) / 180)) / 
                  b) * 1.))
         alpha = (180 - beta) - gamma
         a = math.sqrt(b ** 2 - c ** 2 * math.sin((beta * math.pi) / 
                       180) ** 2) + c * math.cos((beta * math.pi) / 
                 180)
     return (a, alpha, gamma)
Beispiel #4
0
 def triangle_angle_cote_adjacent_cote_oppose(self, b, c, beta):
     if b <= c * math.sin((beta * math.pi) / 180):
         alpha = gamma = a = 0  # Pas possible de résoudre
     else:
         gamma = degres(math.asin(((c * math.sin((beta * math.pi) / 180)) / 
                  b) * 1.))
         alpha = (180 - beta) - gamma
         a = math.sqrt(b ** 2 - c ** 2 * math.sin((beta * math.pi) / 
                       180) ** 2) + c * math.cos((beta * math.pi) / 
                 180)
     return (a, alpha, gamma)
Beispiel #5
0
    def triangle(
        self,
        A,
        B,
        C,
        a=0,
        b=0,
        c=0,
        alpha=0,
        beta=0,
        gamma=0,
        rotation=0,
        angledroit=0,
        ):
        """Construit un triangle en metapost quelles que soient les données.
        La base est le côté [AB] de longueur c.

        @param A, b, C : nom des trois sommets (obligatoire)
        @param a, b, c : longueurs des trois côtés opposés au sommet de même nom
        @param alpha, beta, gamma : mesure des 3 angles de sommets A, B et C
        @param rotation: mesure en degrés de l'angle de la rotation de centre A
                         appliquée au triangle
        @param angledroit: doit-on afficher l'angle droit ?
        """

        self.text.append("beginfig(%s);\n" % self.num)
        self.text.append("u:=1cm;\n")
        self.text.append("pair %s, %s, %s, m[];\n" % (A, B, C))
        self.text.append("picture $;\n")
        self.text.append("  %s=origin;\n" % A)
        if angledroit:
            marques = [0, 0, 0, "%s \degres" % alpha, "%s \degres" % beta, "%s \degres" % gamma]
            if a: marques[0] = "%s cm" % a
            if b: marques[1] = "%s cm" % b
            if c: marques[2] = "%s cm" % c
            points = [A, B, C]
        # on donne les trois longueurs des 3 côtés

        if a and b and c:
            alpha = degres(math.acos(((b ** 2 + c ** 2) - a ** 2 * 1.) / ((2 * 
                     b) * c)))
            beta = degres(math.acos(((c ** 2 + a ** 2) - b ** 2 * 1.) / ((2 * 
                    c) * a)))
        elif a and b and gamma:

        # Un angle et les deux côtés adjacents

            (c, beta, alpha) = self.triangle_angle_cotes_adjacents(a, b,
                    gamma)
        elif b and c and alpha:
            (a, gamma, beta) = self.triangle_angle_cotes_adjacents(b, c,
                    alpha)
        elif c and a and beta:
            (b, alpha, gamma) = self.triangle_angle_cotes_adjacents(c, a,
                    beta)
        elif b and c and beta:

        # Un angle, le côté opposé et un côté adjacent

            (a, alpha, gamma) = self.triangle_angle_cote_adjacent_cote_oppose(b,
                    c, beta)
        elif b and a and beta:
            (c, gamma, alpha) = self.triangle_angle_cote_adjacent_cote_oppose(b,
                    a, beta)
        elif a and b and alpha:
            (c, gamma, beta) = self.triangle_angle_cote_adjacent_cote_oppose(a,
                    b, alpha)
        elif a and c and alpha:
            (b, beta, gamma) = self.triangle_angle_cote_adjacent_cote_oppose(a,
                    c, alpha)
        elif c and a and gamma:
            (b, beta, alpha) = self.triangle_angle_cote_adjacent_cote_oppose(c,
                    a, gamma)
        elif c and b and gamma:
            (a, alpha, beta) = self.triangle_angle_cote_adjacent_cote_oppose(c,
                    b, gamma)
        elif alpha and beta and c:

        # Deux angles et le côté commun

            pass  # on sait faire
        elif beta and gamma and a:
            c = (a * math.sin((gamma * math.pi) / 180)) / math.sin(((beta + 
                    gamma) * math.pi) / 180)
            alpha = (180 - beta) - gamma
        elif alpha and gamma and b:
            c = (b * math.sin((gamma * math.pi) / 180)) / math.sin(((alpha + 
                    gamma) * math.pi) / 180)
            beta = (180 - alpha) - gamma
        elif a and alpha and beta:

        # Deux angles et un côté non commun

            c = (a * math.sin(((alpha + beta) * math.pi) / 180)) / math.sin((alpha * 
                    math.pi) / 180)
        elif a and alpha and gamma:
            c = (a * math.sin((gamma * math.pi) / 180)) / math.sin((alpha * 
                    math.pi) / 180)
            beta = (180 - alpha) - gamma
        elif b and beta and alpha:
            c = (b * math.sin(((alpha + beta) * math.pi) / 180)) / math.sin((beta * 
                    math.pi) / 180)
        elif b and beta and gamma:
            c = (b * math.sin((gamma * math.pi) / 180)) / math.sin((beta * 
                    math.pi) / 180)
            alpha = (180 - beta) - gamma
        elif c and alpha and gamma:
            beta = (180 - alpha) - gamma
        elif c and beta and gamma:
            alpha = (180 - beta) - gamma
        alpha = alpha + rotation
        beta = beta - rotation


        self.text.append("  %s= (%s*u, 0) rotated %s;\n" % (B, c, rotation))
        self.text.append("  %s = %s + whatever*dir(%s);\n" % (C, A, alpha))
        self.text.append("  %s = %s + whatever*dir(180-%s);\n" % (C, B, beta))
        self.text.append("  draw %s -- %s -- %s -- cycle;\n" % (A, B, C))

        # Codage de l'angle droit s'il y en a un.

        if angledroit:
            if alpha - rotation == 90:
                self.text.append("  draw (%s+5*unitvector(%s-%s))--(%s+5*unitvector(%s-%s)+\n" % (A, B, A, A, B, A))
                self.text.append("      5*unitvector(%s-%s))--(%s+5*unitvector(%s-%s));\n" % (C, A, A, C, A))
            elif beta + rotation == 90:
                self.text.append("  draw (%s+5*unitvector(%s-%s))--(%s+5*unitvector(%s-%s)+\n" % (B, A, B, B, A, B))
                self.text.append("      5*unitvector(%s-%s))--(%s+5*unitvector(%s-%s));\n" % (C, B, B, C, B))
            elif gamma == 90:
                self.text.append("  draw (%s+5*unitvector(%s-%s))--(%s+5*unitvector(%s-%s)+\n" % (C, A, C, C, A, C))
                self.text.append("      5*unitvector(%s-%s))--(%s+5*unitvector(%s-%s));\n" % (B, C, C, B, C))
            for i in range(3):
                if marques[i]:
                    self.text.append("  m3:=unitvector(%s-%s) rotated 90;\n" % (points[(i + 1) % 3], points[(i + 2) % 3]))
                    self.text.append("  $:=image(\n")
                    self.text.append("    label(btex %s etex rotated angle(%s-%s),(%s+%s)/2+2mm*m3);\n" % (marques[i], points[(i + 1) % 3], points[(i + 2) % 3], points[(i + 1) % 3], points[(i + 2) % 3]))
                    self.text.append("    );\n  draw $;\n")
        self.text.append("  label.llft(btex $%s$ etex, %s);\n" % (A, A))
        self.text.append("  label.lrt(btex $%s$ etex, %s);\n" % (B, B))
        self.text.append("  label.top(btex $%s$ etex, %s);\n" % (C, C))
        self.text.append("""endfig;

""")
        self.num = self.num + 1
        return self
Beispiel #6
0
    def triangle(
        self,
        A,
        B,
        C,
        a=0,
        b=0,
        c=0,
        alpha=0,
        beta=0,
        gamma=0,
        rotation=0,
        angledroit=0,
        ):
        """Construit un triangle en metapost quelles que soient les données.
        La base est le côté [AB] de longueur c.

        @param A, b, C : nom des trois sommets (obligatoire)
        @param a, b, c : longueurs des trois côtés opposés au sommet de même nom
        @param alpha, beta, gamma : mesure des 3 angles de sommets A, B et C
        @param rotation: mesure en degrés de l'angle de la rotation de centre A
                         appliquée au triangle
        @param angledroit: doit-on afficher l'angle droit ?
        """

        self.text.append("beginfig(%s);\n" % self.num)
        self.text.append("u:=1cm;\n")
        self.text.append("pair %s, %s, %s, m[];\n" % (A, B, C))
        self.text.append("picture $;\n")
        self.text.append("  %s=origin;\n" % A)
        if angledroit:
            marques = [0, 0, 0, "%s \degres" % alpha, "%s \degres" % beta, "%s \degres" % gamma]
            if a: marques[0] = "%s cm" % a
            if b: marques[1] = "%s cm" % b
            if c: marques[2] = "%s cm" % c
            points = [A, B, C]
        # on donne les trois longueurs des 3 côtés

        if a and b and c:
            alpha = degres(math.acos(((b ** 2 + c ** 2) - a ** 2 * 1.) / ((2 * 
                     b) * c)))
            beta = degres(math.acos(((c ** 2 + a ** 2) - b ** 2 * 1.) / ((2 * 
                    c) * a)))
        elif a and b and gamma:

        # Un angle et les deux côtés adjacents

            (c, beta, alpha) = self.triangle_angle_cotes_adjacents(a, b,
                    gamma)
        elif b and c and alpha:
            (a, gamma, beta) = self.triangle_angle_cotes_adjacents(b, c,
                    alpha)
        elif c and a and beta:
            (b, alpha, gamma) = self.triangle_angle_cotes_adjacents(c, a,
                    beta)
        elif b and c and beta:

        # Un angle, le côté opposé et un côté adjacent

            (a, alpha, gamma) = self.triangle_angle_cote_adjacent_cote_oppose(b,
                    c, beta)
        elif b and a and beta:
            (c, gamma, alpha) = self.triangle_angle_cote_adjacent_cote_oppose(b,
                    a, beta)
        elif a and b and alpha:
            (c, gamma, beta) = self.triangle_angle_cote_adjacent_cote_oppose(a,
                    b, alpha)
        elif a and c and alpha:
            (b, beta, gamma) = self.triangle_angle_cote_adjacent_cote_oppose(a,
                    c, alpha)
        elif c and a and gamma:
            (b, beta, alpha) = self.triangle_angle_cote_adjacent_cote_oppose(c,
                    a, gamma)
        elif c and b and gamma:
            (a, alpha, beta) = self.triangle_angle_cote_adjacent_cote_oppose(c,
                    b, gamma)
        elif alpha and beta and c:

        # Deux angles et le côté commun

            pass  # on sait faire
        elif beta and gamma and a:
            c = (a * math.sin((gamma * math.pi) / 180)) / math.sin(((beta + 
                    gamma) * math.pi) / 180)
            alpha = (180 - beta) - gamma
        elif alpha and gamma and b:
            c = (b * math.sin((gamma * math.pi) / 180)) / math.sin(((alpha + 
                    gamma) * math.pi) / 180)
            beta = (180 - alpha) - gamma
        elif a and alpha and beta:

        # Deux angles et un côté non commun

            c = (a * math.sin(((alpha + beta) * math.pi) / 180)) / math.sin((alpha * 
                    math.pi) / 180)
        elif a and alpha and gamma:
            c = (a * math.sin((gamma * math.pi) / 180)) / math.sin((alpha * 
                    math.pi) / 180)
            beta = (180 - alpha) - gamma
        elif b and beta and alpha:
            c = (b * math.sin(((alpha + beta) * math.pi) / 180)) / math.sin((beta * 
                    math.pi) / 180)
        elif b and beta and gamma:
            c = (b * math.sin((gamma * math.pi) / 180)) / math.sin((beta * 
                    math.pi) / 180)
            alpha = (180 - beta) - gamma
        elif c and alpha and gamma:
            beta = (180 - alpha) - gamma
        elif c and beta and gamma:
            alpha = (180 - beta) - gamma
        alpha = alpha + rotation
        beta = beta - rotation


        self.text.append("  %s= (%s*u, 0) rotated %s;\n" % (B, c, rotation))
        self.text.append("  %s = %s + whatever*dir(%s);\n" % (C, A, alpha))
        self.text.append("  %s = %s + whatever*dir(180-%s);\n" % (C, B, beta))
        self.text.append("  draw %s -- %s -- %s -- cycle;\n" % (A, B, C))

        # Codage de l'angle droit s'il y en a un.

        if angledroit:
            if alpha - rotation == 90:
                self.text.append("  draw (%s+5*unitvector(%s-%s))--(%s+5*unitvector(%s-%s)+\n" % (A, B, A, A, B, A))
                self.text.append("      5*unitvector(%s-%s))--(%s+5*unitvector(%s-%s));\n" % (C, A, A, C, A))
            elif beta + rotation == 90:
                self.text.append("  draw (%s+5*unitvector(%s-%s))--(%s+5*unitvector(%s-%s)+\n" % (B, A, B, B, A, B))
                self.text.append("      5*unitvector(%s-%s))--(%s+5*unitvector(%s-%s));\n" % (C, B, B, C, B))
            elif gamma == 90:
                self.text.append("  draw (%s+5*unitvector(%s-%s))--(%s+5*unitvector(%s-%s)+\n" % (C, A, C, C, A, C))
                self.text.append("      5*unitvector(%s-%s))--(%s+5*unitvector(%s-%s));\n" % (B, C, C, B, C))
            for i in range(3):
                if marques[i]:
                    self.text.append("  m3:=unitvector(%s-%s) rotated 90;\n" % (points[(i + 1) % 3], points[(i + 2) % 3]))
                    self.text.append("  $:=image(\n")
                    self.text.append("    label(btex %s etex rotated angle(%s-%s),(%s+%s)/2+2mm*m3);\n" % (marques[i], points[(i + 1) % 3], points[(i + 2) % 3], points[(i + 1) % 3], points[(i + 2) % 3]))
                    self.text.append("    );\n  draw $;\n")
        self.text.append("  label.llft(btex $%s$ etex, %s);\n" % (A, A))
        self.text.append("  label.lrt(btex $%s$ etex, %s);\n" % (B, B))
        self.text.append("  label.top(btex $%s$ etex, %s);\n" % (C, C))
        self.text.append("""endfig;

""")
        self.num = self.num + 1
        return self