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)
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)
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