source: pyromaths/trunk/fuentes/src/pyromaths/ex/cinquiemes/construction.py @ 423

Last change on this file since 423 was 423, checked in by mabarracus, 4 years ago

add sources from pyromaths 15.10

File size: 55.1 KB
Line 
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3#
4# Pyromaths
5# Un programme en Python qui permet de créer des fiches d'exercices types de
6# mathématiques niveau collège ainsi que leur corrigé en LaTeX.
7# Copyright (C) 2006 -- Jérôme Ortais (jerome.ortais@pyromaths.org)
8#
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22#
23from pyromaths.outils import Geometrie as geo
24import random, math
25from pyromaths.outils.Affichage import decimaux
26from pyromaths.outils.Geometrie import cotation, cotation_h
27
28# trigo en degré
29tan = lambda z:math.tan(math.radians(z))
30cos = lambda z:math.cos(math.radians(z))
31sin = lambda z:math.sin(math.radians(z))
32def shuffle_nom(polygone):
33    """renvoie un nom aléatoire du polygone"""
34    n = len(polygone)
35    polygone = polygone + polygone + polygone
36    debut = n + random.randrange(n)
37    sens = [-1, 1][random.randrange(2)]
38    nom = ""
39    for i in range(debut, debut + n * sens, sens):
40        nom += polygone[i]
41    return nom
42
43def exo_triangle(test=False):
44    questions = [quest_equilateral,
45           quest_LAL,
46           quest_ALA,
47           quest_AAL,
48           quest_isocele_angbase,
49           quest_isocele_angprincipal,
50           quest_rectangle_hypo_cote,
51           quest_rectangle_hypo_angle,
52           ]
53    exo = ["\\exercice",
54         "\\begin{enumerate}"]
55    cor = ["\\exercice*",
56         "\\begin{enumerate}"]
57    cor.append("\\definecolor{enonce}{rgb}{0.11,0.56,0.98}")
58    cor.append("\\definecolor{calcul}{rgb}{0.13,0.54,0.13}")
59    cor.append(u"\\psset{MarkAngleRadius=0.6,PointSymbol=none}")
60    if test:  # toutes les constructions en test
61        for quest in questions:
62            quest(exo, cor)
63    else:  # Construction choisies au hasard
64        random.shuffle(questions)
65        for i in range(4):
66            questions[i](exo, cor)
67
68    exo.append("\\end{enumerate}")
69    cor.append("\\end{enumerate}")
70    return exo, cor
71
72exo_triangle.description = _(u'Construction de triangles')
73
74
75def quest_equilateral(exo, cor):
76    A, B, C = geo.choix_points(3)
77    nom = shuffle_nom([A, B, C])
78    c = 0.1 * random.randint(40, 70)  # longueur AB
79    angBAC = angABC = 60
80    exo.append(_(u"\\item Trace un triangle $%s$ équilatéral de côté $\\unit[%s]{cm}$.\\par") % (nom, decimaux(c)))
81    cor.append(_(u"\\item Trace un triangle $%s$ équilatéral de côté $\\unit[%s]{cm}$.\\par") % (nom, decimaux(c)))
82    x_C = (c * tan(angABC)) / (tan(angABC) + tan(angBAC))
83    y_C = x_C * tan(angBAC)
84    cor.append(u"\\begin{pspicture}(-1,-1)(%.3f,%.3f)" % (c + 1, y_C + 1))
85    cor.append(u"\\pstTriangle(0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}" % (A, c, B, x_C, y_C, C))
86    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (C, A))
87    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (B, C))
88    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (A, B))
89    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[C_1]" % (A, C))
90    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[C_2]" % (A, C))
91    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{C_2}{C_1}" % (A))
92    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[C_3]" % (B, C))
93    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[C_4]" % (B, C))
94    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{C_4}{C_3}" % (B))
95    cor.append(cotation((0, 0), (c, 0), decimaux(c), couleur="enonce"))
96    cor.append(u"\\end{pspicture}")
97
98def quest_LAL(exo, cor):
99    """on donne un angle et les longueurs de ses deux côtés"""
100    """            angBAC et      AB=c et AC=b"""
101    A, B, C = geo.choix_points(3)
102    nom = shuffle_nom([A, B, C])
103    c = 0.1 * random.randint(40, 70)  # longueur AB
104    b = 0.1 * random.randint(20, 100)  # longueur BC
105    angBAC = 3 * random.randint(7, 50)  # BAC mesure entre 21° et 150°
106
107    exo.append(_(u"\\item Trace un triangle $%s$ tel que $%s%s=\\unit[%s]{cm}$, $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$")
108               % (nom, A, B, decimaux(c), A, C, decimaux(b), B, A, C, angBAC))
109    cor.append(_(u"\\item Trace un triangle $%s$ tel que $%s%s=\\unit[%s]{cm}$, $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
110               % (nom, A, B, decimaux(c), A, C, decimaux(b), B, A, C, angBAC))
111    cor.append(u"\\begin{pspicture}(%.3f,%.3f)(%.3f,%.3f)" % (min(0, b * cos(angBAC)) - 0.4, -1, max(b, b * cos(angBAC)) + 0.4, b * sin(angBAC) + 1))
112    cor.append(u"\\pstTriangle(0,0){%s}(%.3f;%.3f){%s}(%.3f,0){%s}" % (A, b, angBAC, C, c, B))
113    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (B, A, C, angBAC))
114    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}" % (A, C))
115    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[C_1]" % (A, C))
116    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[C_2]" % (A, C))
117    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{C_2}{C_1}" % (A))
118    cor.append(cotation((0, 0), (c, 0), decimaux(c), couleur="enonce"))
119    if angBAC < 111:
120        x_C, y_C = b * cos(angBAC), b * sin(angBAC)
121        cor.append(cotation_h((0, 0), (x_C, y_C), decimaux(b), couleur="enonce"))
122    else:
123        x_C, y_C = b * cos(angBAC), b * sin(angBAC)
124        cor.append(cotation((x_C, y_C), (0, 0), decimaux(b), couleur="enonce"))
125    cor.append(u"\\end{pspicture}")
126
127def quest_ALA(exo, cor):
128    """on donne deux angles et la longueur du côté commun"""
129    """ angBAC et angABC et AB=c"""
130    A, B, C = geo.choix_points(3)
131    nom = shuffle_nom([A, B, C])
132    c = 0.1 * random.randint(40, 70)  # longueur AB
133    angBAC = 5 * random.randint(4, 12)
134    angABC = 5 * random.randint(4, 12)
135    exo.append(_(u"\\item Trace un triangle $%s$ tel que $%s%s=\\unit[%s]{cm}$,  $\\widehat{%s%s%s}=%s\\degres$ et $\\widehat{%s%s%s}=%s\\degres$")
136               % (nom, A, B, decimaux(c), B, A, C, angBAC, A, B, C, angABC))
137    cor.append(_(u"\\item Trace un triangle $%s$ tel que $%s%s=\\unit[%s]{cm}$,  $\\widehat{%s%s%s}=%s\\degres$ et $\\widehat{%s%s%s}=%s\\degres$\\par")
138               % (nom, A, B, decimaux(c), B, A, C, angBAC, A, B, C, angABC))
139    x_C = (c * tan(angABC)) / (tan(angABC) + tan(angBAC))
140    y_C = x_C * tan(angBAC)
141    cor.append(u"\\begin{pspicture}(-0.4,-1)(%.3f,%.3f)" % (c + 1, y_C + 1))
142    cor.append(u"\\pstTriangle(0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}" % (A, c, B, x_C, y_C, C))
143    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}\\pstLineAB[nodesepB=-1]{%s}{%s}" % (A, C, B, C))
144    cor.append(cotation((0, 0), (c, 0), decimaux(c), couleur="enonce"))
145    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (B, A, C, angBAC))
146    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (C, B, A, angABC))
147    cor.append(u"\\end{pspicture}")
148
149def quest_AAL(exo, cor):
150    """on donne deux angles et la longueur d'un côté non commun aux deux angles"""
151    """ angBAC et angACB et AB=c"""
152    A, B, C = geo.choix_points(3)
153    nom = shuffle_nom([A, B, C])
154    angBAC = 3 * random.randint(10, 24)  # entre 30° et 72°
155    angACB = 3 * random.randint(10, 24)  # entre 30° et 72°
156    angABC = 180 - angBAC - angACB
157    ABmax = int(35 * (tan(angABC) + tan(angBAC)) / (tan(angBAC) * tan(angABC)))  # donne une hauteur inférieur à 35*0.2=7 cm
158    c = 0.2 * random.randint(20, max(20, ABmax))  # longueur AB
159
160    exo.append(_(u"\\item Trace un triangle $%s$ tel que $%s%s=\\unit[%s]{cm}$,  $\\widehat{%s%s%s}=%s\\degres$ et $\\widehat{%s%s%s}=%s\\degres$")
161               % (nom, A, B, decimaux(c), B, A, C, angBAC, A, C, B, angACB))
162    cor.append(_(u"\\item Trace un triangle $%s$ tel que $%s%s=\\unit[%s]{cm}$,  $\\widehat{%s%s%s}=%s\\degres$ et $\\widehat{%s%s%s}=%s\\degres$\\par")
163               % (nom, A, B, decimaux(c), B, A, C, angBAC, A, C, B, angACB))
164    cor.append(_(u"On doit d'abord calculer la mesure de $\\widehat{%s%s%s}$.\\\\")
165               % (A, B, C))
166    cor.append(_(u"Or la somme des trois angles d'un triangle est égale à 180\\degres donc $\\widehat{%s%s%s}=180\\degres-%s\\degres-%s\\degres=%s\\degres$.\\par")
167               % (A, B, C, angBAC, angACB, angABC))
168    x_C = (c * tan(angABC)) / (tan(angABC) + tan(angBAC))
169    y_C = x_C * tan(angBAC)
170    cor.append(u"\\begin{pspicture}(-1,-1)(%.3f,%.3f)" % (c + 1, y_C + 1))
171    cor.append(u"\\pstTriangle(0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}" % (A, c, B, x_C, y_C, C))
172    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}\\pstLineAB[nodesepB=-1]{%s}{%s}" % (A, C, B, C))
173    cor.append(u"\\pstMarkAngle[linecolor=calcul]{%s}{%s}{%s}{\\color{calcul}%s\\degres}" % (C, B, A, angABC))
174    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (A, C, B, angACB))
175    cor.append(cotation((0, 0), (c, 0), decimaux(c), couleur="enonce"))
176    cor.append(u"\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (B, A, C, angBAC))
177    cor.append(u"\\end{pspicture}")
178
179def quest_isocele_angbase(exo, cor):
180    """on donne ABC isocele en C, AB=c et angBAC"""
181    A, B, C = geo.choix_points(3)
182    nom = shuffle_nom([A, B, C])
183    angABC = angBAC = random.randint(20, 70)
184    maxc = max(20, int(35 / tan(angBAC)))  # longueur c maximale pour que la hauteur soit 7 cm =0.2*35
185    minc = min(20, int(35 / tan(angBAC)))
186    c = 0.2 * random.randint(minc, min(maxc, 50))  # longueur AB
187    # Calcul pour tracer
188    x_C = c / 2
189    y_C = x_C * tan(angBAC)
190
191    exo.append(_(u"\\item Trace un triangle $%s$ isocèle en $%s$ tel que $%s%s=\\unit[%s]{cm}$,  $\\widehat{%s%s%s}=%s\\degres$.")
192               % (nom, C, A, B, decimaux(c), B, A, C, angBAC))
193    cor.append(_(u"\\item Trace un triangle $%s$ isocèle en $%s$ tel que $%s%s=\\unit[%s]{cm}$,  $\\widehat{%s%s%s}=%s\\degres$. \\par")
194               % (nom, C, A, B, decimaux(c), B, A, C, angBAC))
195    cor.append(_(u"Comme $%s%s%s$ est un triangle isocèle en $%s$, je sais que les angles adjacents à la base sont de même mesure \
196donc $\\widehat{%s%s%s}=\\widehat{%s%s%s}=%s\\degres$.\\par") % (A, B, C, C, A, B, C, B, A, C, angBAC))
197    cor.append(u"\\begin{pspicture}(-1,-1)(%.3f,%.3f)" % (c + 1, y_C + 1))
198    cor.append(u"\\pstTriangle(0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}" % (A, c, B, x_C, y_C, C))
199    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}" % (A, C))
200    cor.append("\\pstLineAB[linestyle=none]{%s}{%s} \\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (A, C))
201    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}" % (B, C))
202    cor.append(u"\\pstLineAB[linestyle=none]{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (B, C))
203    cor.append(cotation((0, 0), (c, 0), decimaux(c), couleur="enonce"))
204    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (B, A, C, angBAC))
205    cor.append(u"\\color{calcul}\\pstMarkAngle[linecolor=calcul]{%s}{%s}{%s}{%s\\degres}" % (C, B, A, angABC))
206    cor.append(u"\\end{pspicture}")
207
208def quest_isocele_angprincipal(exo, cor):
209    """on donne ABC isocele en C, AB=c et angACB"""
210    A, B, C = geo.choix_points(3)
211    nom = shuffle_nom([A, B, C])
212    angACB = 2 * random.randint(20, 60)  # ACB est pair entre 40° et 120°
213    angBAC = angABC = (180 - angACB) / 2
214    maxc = max(20, int(35 / tan(angBAC)))  # longueur c maximale pour que la hauteur soit 7 cm =0.2*35
215    c = 0.2 * random.randint(20, min(maxc, 35))  # longueur AB
216    # Calcul pour tracer
217    x_C = c / 2
218    y_C = x_C * tan(angBAC)
219
220    exo.append(_(u"\\item Trace un triangle $%s$ isocèle en $%s$ tel que $%s%s=\\unit[%s]{cm}$,  $\\widehat{%s%s%s}=%s\\degres$.")
221               % (nom, C, A, B, decimaux(c), A, C, B, angACB))
222    cor.append(_(u"\\item Trace un triangle $%s$ isocèle en $%s$ tel que $%s%s=\\unit[%s]{cm}$,  $\\widehat{%s%s%s}=%s\\degres$.\\par")
223               % (nom, C, A, B, decimaux(c), A, C, B, angACB))
224    cor.append(_(u"Comme $%s%s%s$ est un triangle isocèle en $%s$, je sais que les angles adjacents à la base sont de même mesure \
225donc $\\widehat{%s%s%s}=\\widehat{%s%s%s}$.\\par") % (A, B, C, C, A, B, C, B, A, C))
226    cor.append(_(u"De plus, je sais que la somme des mesures des trois angles d'un triangle est égale à 180\\degres \\\\ \
227donc $\\widehat{%s%s%s}=\\widehat{%s%s%s}=(180\\degres-%s\\degres)\\div 2=%s\\degres$. \\par")
228               % (B, A, C, A, B, C, angACB, angBAC))
229    cor.append(u"\\begin{pspicture}(-1,-1)(%.3f,%.3f)" % (c + 1, y_C + 1))
230    cor.append(u"\\pstTriangle(0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}" % (A, c, B, x_C, y_C, C))
231    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}" % (A, C))
232    cor.append("\\pstLineAB[linestyle=none]{%s}{%s} \\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (A, C))
233    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}" % (B, C))
234    cor.append("\\pstLineAB[linestyle=none]{%s}{%s} \\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (B, C))
235    cor.append(cotation((0, 0), (c, 0), decimaux(c), couleur="enonce"))
236    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce,Mark=MarkHash]{%s}{%s}{%s}{%s\\degres}" % (A, C, B, angACB))
237    cor.append(u"\\color{calcul}\\pstMarkAngle[linecolor=calcul]{%s}{%s}{%s}{%s\\degres}" % (B, A, C, angBAC))
238    cor.append(u"\\pstMarkAngle[linecolor=calcul]{%s}{%s}{%s}{%s\\degres}" % (C, B, A, angABC))
239    cor.append(u"\\end{pspicture}")
240
241def quest_rectangle_hypo_angle(exo, cor):
242    """on donne un triangle ABC rectangle en C et l'hypotenuse AB et l'angle BAC"""
243    A, B, C = geo.choix_points(3)
244    nom = shuffle_nom([A, B, C])
245    c = 0.2 * random.randint(20, 35)  # longueur AB
246    angBAC = 3 * random.randint(7, 23)  # un angle mesurant entre 21° et 69°
247    angABC = 90 - angBAC
248    # angACB=90
249    # Calcul pour tracer
250    x_C = (c * tan(angABC)) / (tan(angABC) + tan(angBAC))
251    y_C = x_C * tan(angBAC)
252
253    exo.append(_(u"\\item Trace un triangle $%s$ rectangle en $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
254               % (nom, C, A, B, decimaux(c), B, A, C, angBAC))
255    cor.append(_(u"\\item Trace un triangle $%s$ rectangle en $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
256               % (nom, C, A, B, decimaux(c), B, A, C, angBAC))
257# #    cor.append("\\begin{multicols}{2}")
258    cor.append(_(u"Je sais que dans un triangle rectangle, les deux angles aigus sont complémentaires \\\\ \
259donc $\widehat{%s%s%s}=90\\degres-%s\\degres=%s\\degres$.\\par") % (B, A, C, angBAC, angABC))
260
261    cor.append("\\figureadroite{")
262    cor.append(u"\\begin{pspicture}(-0.4,-1)(%.3f,%.3f)" % (c + 0.4, y_C + 1))
263    cor.append(u"\\pstTriangle(0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}" % (A, c, B, x_C, y_C, C))
264    cor.append(u"\\color{enonce}\\pstRightAngle[linecolor=enonce]{%s}{%s}{%s}" % (A, C, B))
265    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}\\pstLineAB[nodesepB=-1]{%s}{%s}" % (A, C, B, C))
266    cor.append(cotation((0, 0), (c, 0), decimaux(c), couleur="enonce"))
267    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (B, A, C, angBAC))
268    cor.append(u"\\color{calcul}\\pstMarkAngle[linecolor=calcul]{%s}{%s}{%s}{%s\\degres}" % (C, B, A, angABC))
269    cor.append(u"\\end{pspicture}}{")
270    cor.append("\\begin{enumerate}")
271    cor.append(_(u"\\item Je trace le segment $[%s%s]$ mesurant $\\unit[%s]{cm}$ ;") % (A, B, decimaux(c)))
272    cor.append(_(u"\\item puis la demi-droite $[%s%s)$ en traçant l'angle~$\widehat{%s%s%s}$ ;") % (A, C, B, A, C))
273    cor.append(_(u"\\item puis la demi-droite $[%s%s)$ en traçant l'angle~$\widehat{%s%s%s}$ ;") % (B, C, A, B, C))
274# #    cor.append(u"\\item enfin je vérifie les trois {\\color{enonce}conditions de l'énoncé}.")
275    cor.append("\\end{enumerate}\n")
276# #    cor.append("\\end{multicols}")
277    cor.append("}")
278
279def quest_rectangle_hypo_cote(exo, cor):
280    """on donne un triangle ABC rectangle en B et l'hypotenuse AC et le coté AB"""
281    A, B, C = geo.choix_points(3)
282    nom = shuffle_nom([A, B, C])
283    c = 0.2 * random.randint(20, 35)  # longueur AB
284    b = 0.1 * random.randint(int(10 * (c)) + 1, 100)  # longueur AC
285    angABC = 90
286    # calcul pour tracer
287    angBAC = math.degrees(math.acos(float(c) / float(b)))
288    x_C = (c * tan(angABC)) / (tan(angABC) + tan(angBAC))
289    y_C = x_C * tan(angBAC)
290
291    exo.append(_(u"\\item Trace un triangle $%s$ rectangle en $%s$ tel que $%s%s=\\unit[%s]{cm}$,  $%s%s=\\unit[%s]{cm}$.\\par")
292               % (nom, B, A, B, decimaux(c), A, C, decimaux(b)))
293    cor.append(_(u"\\item Trace un triangle $%s$ rectangle en $%s$ tel que $%s%s=\\unit[%s]{cm}$, $%s%s=\\unit[%s]{cm}$.\\par")
294               % (nom, B, A, B, decimaux(c), A, C, decimaux(b)))
295# #    cor.append("\\begin{multicols}{2}")
296    cor.append("\\figureadroite{")
297    cor.append(u"\\begin{pspicture}(-0.4,-1)(%.3f,%.3f)" % (c + 0.4, y_C + 1))
298    cor.append(u"\\pstTriangle(0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}" % (A, c, B, x_C, y_C, C))
299    cor.append(u"\\color{enonce}\\pstRightAngle[linecolor=enonce]{%s}{%s}{%s}" % (C, B, A))
300    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[C_1]" % (A, C))
301    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[C_2]" % (A, C))
302    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{C_2}{C_1}" % (A))
303    cor.append(u"\\pstLineAB{%s}{%s}\\pstLineAB[nodesepB=-1]{%s}{%s}" % (A, B, B, C))
304    cor.append(cotation((0, 0), (c, 0), decimaux(c), couleur="enonce"))
305    cor.append(cotation_h((0, 0), (x_C, y_C), decimaux(b), couleur="enonce"))
306    cor.append(u"\\end{pspicture}}{")
307    cor.append(u"\\begin{enumerate}")
308    cor.append(_(u"\\item Je trace le segment $[%s%s]$ mesurant $\\unit[%s]{cm}$ ;") % (A, B, decimaux(c)))
309    cor.append(_(u"\\item puis je trace l'angle droit $\\widehat{%s%s%s}$ ;") % (A, B, C))
310    cor.append(_(u"\\item enfin, je reporte au compas la longueur \\mbox{$%s%s=\\unit[%s]{cm}$} à partir de $%s$.")
311                % (A, C, decimaux(b), A))
312    cor.append("\\end{enumerate}}")
313# #    cor.append("\\end{multicols}")
314
315
316#################################################################################################
317#   Les construction sont faites avec [AB] horizontale (ou avec la diagonale [AC] horizontale)
318#       D-------C
319#      /       /
320#     /       /
321#    A-------B
322#   A est toujours l'origine : A(0,0)
323#
324#   AB est la longueur AB : type(float) en cm
325#   angBAC est la mesure de l'angle BAC : type(int) en degrés
326#   x_C,y_C sont les coordonnées cartésiennes du point C
327#  les coordonnées polaires sont notées (5 ; 60)
328#
329###################################################################################################
330
331def exo_quadrilatere(test=False):
332
333    exo = ["\\exercice",
334         "\\begin{enumerate}"]
335    cor = ["\\exercice*",
336         "\\begin{enumerate}"]
337    cor.append("\\definecolor{enonce}{rgb}{0.11,0.56,0.98}")
338    # couleur pour reporter les informations de la consigne
339    cor.append("\\definecolor{calcul}{rgb}{0.13,0.54,0.13}")
340    # couleur pour reporter des informations déduites par raisonnement ou calcul
341    cor.append(u"\\psset{MarkAngleRadius=0.7,PointSymbol=none,dotscale=2}")
342    # MarkAngleRadius = rayon de l'arc marquant les angles
343    # PointSymbol=none les points ne sont pas tracés
344    # dotscale=2, grossit la  croix si PointSymbol=x
345
346    # liste des questions possibles
347    questions = [quest_rectangle_diag,
348           quest_rectangle_angle,
349           quest_rectangle_angle_diag,
350           quest_rectangle_diag_angle,
351           quest_parallelogramme_CCA,
352           quest_parallelogramme_CDA,
353           quest_parallelogramme_DDA,
354           quest_losange_DD,
355           quest_losange_CD,
356           quest_losange_CDbis,
357           quest_losange_CC,
358           carre_diag]
359
360    if test:  # toutes les constructions en test
361        for quest in questions:
362            quest(exo, cor)
363    else:
364        # on choisit un parallélogramme, un losange et un rectangle
365        questions[random.randrange(4)](exo, cor)
366        questions[random.randrange(4, 7)](exo, cor)
367        questions[random.randrange(7, 11)](exo, cor)
368        # questions[11], le carré n'est jamais proposé
369    exo.append("\\end{enumerate}")
370    cor.append("\\end{enumerate}")
371    return exo, cor
372
373exo_quadrilatere.description = _(u'Construction de parallélogrammes')
374
375################################################################
376
377####### RECTANGLES #############
378
379def quest_rectangle_diag(exo, cor):
380    """on donne un rectangle ABCD avec un côté AB et une diagonale AC"""
381    A, B, C, D = geo.choix_points(4)
382    nom = shuffle_nom([A, B, C, D])
383    L = random.randint(40, 60)  # AB mesure entre 4cm et 7cm, tracé horizontalement
384    Diag = 0.1 * random.randint(L + 10, 70)  # +1.1 pour éviter les problèmes d'arrondi
385    L = 0.1 * L
386    # Calcul pour tracer
387    angBAC = math.degrees(math.acos(float(L) / float(Diag)))
388    x_C = L
389    y_C = x_C * tan(angBAC)
390
391    exo.append(_(u"\\item Trace un rectangle $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $%s%s=\\unit[%s]{cm}$.\\par")
392               % (nom, A, B, decimaux(L), A, C, decimaux(Diag)))
393    cor.append(_(u"\\item Trace un rectangle $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $%s%s=\\unit[%s]{cm}$.\\par")
394               % (nom, A, B, decimaux(L), A, C, decimaux(Diag)))
395    # figure
396    cor.append("\\figureadroite{")
397    cor.append(u"\\begin{pspicture}(-0.4,-1)(%.3f,%.3f)" % (L + 0.4, y_C + 1))
398    cor.append(u"\\pstTriangle(0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}" % (A, L, B, x_C, y_C, C))
399    cor.append(u"\\pstGeonode[PosAngle=135](0,%.3f){%s}" % (y_C, D))
400    # codage
401    cor.append(u"\\color{enonce}\\pstRightAngle[linecolor=enonce]{%s}{%s}{%s}" % (D, C, B))
402    cor.append(u"\\color{enonce}\\pstRightAngle[linecolor=enonce]{%s}{%s}{%s}" % (B, A, D))
403    cor.append(u"\\color{enonce}\\pstRightAngle[linecolor=enonce]{%s}{%s}{%s}" % (C, B, A))
404    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[C_1]" % (A, C))
405    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[C_2]" % (A, C))
406    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{C_2}{C_1}" % (A))
407    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}\\pstLineAB[nodesepB=-1]{%s}{%s}\\pstLineAB{%s}{%s}\\pstLineAB[nodesepB=-1]{%s}{%s}" % (A, D, C, D, A, B, B, C))
408    cor.append(cotation((0, 0), (L, 0), decimaux(L), couleur="enonce"))
409    cor.append(cotation_h((0, 0), (x_C, y_C), decimaux(Diag), couleur="enonce"))
410    cor.append(u"\\end{pspicture}}{")
411    # Programme de construction
412    cor.append(u"\\begin{enumerate}")
413    cor.append(_(u"\\item Je trace le segment $[%s%s]$ mesurant $\\unit[%s]{cm}$ ;") % (A, B, decimaux(L)))
414    cor.append(_(u"\\item puis je trace l'angle droit $\\widehat{%s%s%s}$ ;") % (A, B, C))
415    cor.append(_(u"\\item je reporte au compas la longueur $%s%s=\\unit[%s]{cm}$ à partir de $%s$ ;") % (A, C, decimaux(Diag), A))
416    cor.append(_(u"\\item je trace enfin les angles droits en $%s$ et en $%s$ pour placer le point $%s$.") % (A, C, D))
417    cor.append("\\end{enumerate}}")
418
419
420def quest_rectangle_angle(exo, cor):
421    """On donne un rectangle ABCD avec le côté AB et l'angle BAC"""
422    A, B, C, D = geo.choix_points(4)
423    nom = shuffle_nom([A, B, C, D])
424    L = random.randint(40, 60)  # AB mesure entre 4cm et 7cm, tracé horizontalement
425    angBAC = random.randint(25, 65)
426    L = 0.1 * L
427    # Calcul pour tracer
428    x_C = L
429    y_C = x_C * tan(angBAC)
430
431    exo.append(_(u"\\item Trace un rectangle $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
432               % (nom, A, B, decimaux(L), B, A, C, angBAC))
433    cor.append(_(u"\\item Trace un rectangle $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
434               % (nom, A, B, decimaux(L), B, A, C, angBAC))
435
436    cor.append("\\figureadroite{")
437    cor.append(u"\\begin{pspicture}(-0.4,-1)(%.3f,%.3f)" % (L + 0.4, y_C + 1))
438    cor.append(u"\\pstTriangle(0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}" % (A, L, B, x_C, y_C, C))
439    cor.append(u"\\pstGeonode[PosAngle=135](0,%.3f){%s}" % (y_C, D))
440    cor.append(u"\\color{enonce}\\pstRightAngle[linecolor=enonce]{%s}{%s}{%s}" % (D, C, B))
441    cor.append(u"\\color{enonce}\\pstRightAngle[linecolor=enonce]{%s}{%s}{%s}" % (B, A, D))
442    cor.append(u"\\color{enonce}\\pstRightAngle[linecolor=enonce]{%s}{%s}{%s}" % (C, B, A))
443    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}\\pstLineAB[nodesepB=-1]{%s}{%s}\\pstLineAB{%s}{%s}\\pstLineAB[nodesepB=-1]{%s}{%s}\\pstLineAB[nodesepB=-1]{%s}{%s}"
444               % (A, D, C, D, A, B, B, C, A, C))
445    cor.append(cotation((0, 0), (L, 0), decimaux(L), couleur="enonce"))
446    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (B, A, C, angBAC))
447    cor.append(u"\\end{pspicture}}{")
448    # Programme de construction
449    cor.append(u"\\begin{enumerate}")
450    cor.append(_(u"\\item Je trace le segment $[%s%s]$ mesurant $\\unit[%s]{cm}$ ;") % (A, B, decimaux(L)))
451    cor.append(_(u"\\item puis je trace l'angle droit $\\widehat{%s%s%s}$ ;") % (A, B, C))
452    cor.append(_(u"\\item la demi-droite $[%s%s)$ en mesurant $\\widehat{%s%s%s}=%s\\degres$.") % (A, C, B, A, C, angBAC))
453    cor.append(_(u"\\item je trace enfin les angles droit en $%s$ et en $%s$ pour placer le point $%s$.") % (A, C, D))
454    cor.append("\\end{enumerate}}")
455
456def quest_rectangle_angle_diag(exo, cor):
457    """On donne un rectangle ABCD de centre E, la diagonale AC et l'angle AEB"""
458    A, B, C, D, E = geo.choix_points(5)
459    nom = shuffle_nom([A, B, C, D])
460    angAEB = 2 * random.randint(20, 70)
461    Diag = 0.2 * random.randint(25, 45)
462    # calcul pour tracer
463    angBAC = (180 - angAEB) / 2
464    L = Diag * cos(angBAC)
465    x_C = L
466    y_C = x_C * tan(angBAC)
467
468    exo.append(_(u"\\item Trace un rectangle $%s$ de centre $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
469               % (nom, E, A, C, decimaux(Diag), A, E, B, angAEB))
470    cor.append(_(u"\\item Trace un rectangle $%s$ de centre $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
471               % (nom, E, A, C, decimaux(Diag), A, E, B, angAEB))
472# #    cor.append("\\begin{multicols}{2}")
473    # Programme de construction
474    cor.append("\\figureadroite{")
475# #    cor.append("\columnbreak")
476    cor.append(u"\\begin{pspicture}(-0.4,-1)(%.3f,%.3f)" % (L + 0.4, y_C + 1))
477    cor.append(u"\\pstTriangle(0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}" % (A, L, B, x_C, y_C, C))
478    cor.append(u"\\pstGeonode[PosAngle={135,0}](0,%.3f){%s}(%.3f,%.3f){%s}" % (y_C, D, x_C / 2.0, y_C / 2.0, E))
479    cor.append(u"\\pstLineAB{%s}{%s}" % (C, D))
480    cor.append(u"\\pstLineAB{%s}{%s}" % (A, D))
481    cor.append(u"\\pstLineAB[nodesep=-1]{%s}{%s}" % (B, D))
482    # codage
483    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHashh}" % (E, A))
484    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHashh}" % (E, B))
485    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHashh}" % (E, C))
486    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHashh}" % (E, D))
487    cor.append(u"\\psarc[linecolor=calcul](%.3f,%.3f){%s}{%s}{%s} " % (x_C / 2.0, y_C / 2.0, Diag / 2, angBAC - 7, angBAC + 7))
488    cor.append(u"\\psarc[linecolor=calcul](%.3f,%.3f){%s}{%s}{%s} " % (x_C / 2.0, y_C / 2.0, Diag / 2, 180 - angBAC - 7, 180 - angBAC + 7))
489    cor.append(u"\\psarc[linecolor=calcul](%.3f,%.3f){%s}{%s}{%s} " % (x_C / 2.0, y_C / 2.0, Diag / 2, -angBAC - 7, -angBAC + 7))
490    cor.append(u"\\psarc[linecolor=calcul](%.3f,%.3f){%s}{%s}{%s} " % (x_C / 2.0, y_C / 2.0, Diag / 2, 180 + angBAC - 7, 180 + angBAC + 7))
491    cor.append("\\pcline[linestyle=none](0,0)(%.3f,%.3f)\\aput*{:U}{\\color{enonce}\\unit[%s]{cm}}" % (L, y_C, decimaux(Diag)))
492    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (A, E, B, angAEB))
493    cor.append(u"\\end{pspicture}}{")
494    cor.append(u"\\begin{enumerate}")
495    cor.append(_(u"\\item Je trace le segment $[%s%s]$ mesurant $\\unit[%s]{cm}$ ;") % (A, C, decimaux(Diag)))
496    cor.append(_(u"\\item le centre du rectangle est le milieu des diagonales donc $%s$ est le milieu de $[%s%s]$ ;") % (E, A, C))
497    cor.append(_(u"\\item je trace la diagonale $(%s%s)$ passant par $%s$ en mesurant \\mbox{$\\widehat{%s%s%s}=%s\\degres$} ;")
498               % (B, D, E, A, E, B, angAEB))
499    cor.append(_(u"\\item Comme les diagonales du rectangle sont de même longueur, je reporte les longueurs $%s%s=%s%s=\\unit[%s]{cm}$.")
500               % (E, D, E, B, decimaux(Diag / 2)))
501# #    cor.append(_(u"\\item je trace enfin les angles droits en $%s$ et en $%s$ pour palcer le point $%s$.")%(A,C,D))
502    cor.append("\\end{enumerate}}")
503# #    cor.append("\\end{multicols}")
504
505def quest_rectangle_diag_angle(exo, cor):
506    """On donne un rectangle ABCD la diagonale AC et l'angle BAC"""
507    A, B, C, D = geo.choix_points(4)
508    nom = shuffle_nom([A, B, C, D])
509    angBAC = random.randint(25, 65)
510    Diag = 0.1 * random.randint(50, 80)
511    # Calcul
512    L = Diag * cos(angBAC)
513    x_C = L
514    y_C = x_C * tan(angBAC)
515
516    exo.append(_(u"\\item Trace un rectangle $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
517               % (nom, A, C, decimaux(Diag), B, A, C, angBAC))
518    cor.append(_(u"\\item Trace un rectangle $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
519               % (nom, A, C, decimaux(Diag), B, A, C, angBAC))
520
521# #    cor.append("\\begin{multicols}{2}")
522    cor.append("\\figureadroite{")
523# #    cor.append("\columnbreak")
524    # figure
525    cor.append(u"\\begin{pspicture}(-0.4,-1)(%.3f,%.3f)" % (L + 0.4, y_C + 1))
526    cor.append(u"\\pstTriangle(0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}" % (A, L, B, x_C, y_C, C))
527    cor.append(u"\\pstGeonode[PosAngle=135](0,%.3f){%s}" % (y_C, D))
528    # codage
529    cor.append(u"\\color{enonce}\\pstRightAngle[linecolor=enonce]{%s}{%s}{%s}" % (D, C, B))
530    cor.append(u"\\color{enonce}\\pstRightAngle[linecolor=enonce]{%s}{%s}{%s}" % (B, A, D))
531    cor.append(u"\\color{enonce}\\pstRightAngle[linecolor=enonce]{%s}{%s}{%s}" % (C, B, A))
532    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}\\pstLineAB[nodesepB=-1]{%s}{%s}\\pstLineAB[nodesepB=-1]{%s}{%s}\\pstLineAB[nodesep=-1]{%s}{%s}"
533               % (A, D, C, D, A, B, B, C))
534    cor.append(cotation_h((0, 0), (L, y_C), decimaux(Diag), couleur="enonce"))
535    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (B, A, C, angBAC))
536    cor.append(u"\\end{pspicture}}{")
537    # Programme de construction
538    cor.append(u"\\begin{enumerate}")
539    cor.append(_(u"\\item Je trace le segment $[%s%s]$ mesurant $\\unit[%s]{cm}$ ;") % (A, C, decimaux(Diag)))
540    cor.append(_(u"\\item la demi-droite $[%s%s)$ en mesurant \\mbox{$\\widehat{%s%s%s}=%s\\degres$} ;") % (A, B, B, A, C, angBAC))
541    cor.append(_(u"\\item puis la perpendiculaire à $[%s%s)$ passant par~$%s$ ;") % (A, B, C))
542    cor.append(_(u"\\item je trace enfin les angles droits en $%s$ et en $%s$ pour placer le point~$%s$.") % (A, C, D))
543    cor.append("\\end{enumerate}}")
544# #    cor.append("\\end{multicols}")
545
546################## PARALLÉLOGRAMMES QUELCONQUES ###########################
547
548def quest_parallelogramme_CCA(exo, cor):
549    """On donne un parallélogramme avec la longueur de deux côtés et un angle."""
550    # 3 choix d'angle : CC ou un autre angle CC ou un angle Côté Diagonale
551    A, B, C, D = geo.choix_points(4)
552    nom = shuffle_nom([A, B, C, D])
553    AB = 0.1 * random.randint(40, 60)  # AB mesure entre 4cm et 7cm, tracé horizontalement
554    AD = 0.1 * random.randint(40, 60)  # AD mesure entre 4cm et 7cm, tracé horizontalement
555    angBAD = random.randint(25, 65)
556    # Pour tracer
557    x_C = AB + AD * cos(angBAD)
558    y_C = AD * sin(angBAD)
559
560    exo.append(_(u"\\item Trace un parallélogramme $%s$ tel que $%s%s=\\unit[%s]{cm}$, $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
561               % (nom, A, B, decimaux(AB), D, A, decimaux(AD), B, A, D, angBAD))
562    cor.append(_(u"\\item Trace un parallélogramme $%s$ tel que $%s%s=\\unit[%s]{cm}$, $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
563               % (nom, A, B, decimaux(AB), D, A, decimaux(AD), B, A, D, angBAD))
564    cor.append(u"\\begin{enumerate}")
565    cor.append(_(u"\\item Je trace le segment $[%s%s]$ mesurant $\\unit[%s]{cm}$ ;") % (A, B, decimaux(AB)))
566    cor.append(_(u"\\item je mesure l'angle  $\\widehat{%s%s%s}=%s\\degres$ puis je place le point~$%s$ ;") % (B, A, D, angBAD, D))
567    cor.append(_(u"\\item enfin je reporte les longueurs $%s%s=%s%s$ et $%s%s=%s%s$ pour place le point~$%s$.")
568               % (D, C, A, B, B, C, A, D, C))
569    cor.append("\\end{enumerate}\n")
570    cor.append(u"\\begin{pspicture}(-0.4,-1)(%.3f,%.3f)" % (max(AB, x_C) + 0.4, y_C + 1))
571    cor.append(u"\\pstGeonode[PosAngle={-135,-45,45,135}](0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}(%.3f;%.3f){%s}" % (A, AB, B, x_C, y_C, C, AD, angBAD, D))
572    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}\\pstLineAB{%s}{%s}\\pstLineAB{%s}{%s}\\pstLineAB{%s}{%s}"
573               % (A, D, C, D, A, B, B, C))
574    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[C_1]" % (D, C))
575    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[C_2]" % (D, C))
576    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{C_2}{C_1}" % (D))
577    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[D_1]" % (A, D))
578    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[D_2]" % (A, D))
579    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{D_2}{D_1}" % (A))
580    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[C_3]" % (B, C))
581    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[C_4]" % (B, C))
582    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{C_4}{C_3}" % (B))
583    cor.append(cotation_h((0, 0), (x_C - AB, y_C), decimaux(AD), couleur="enonce"))
584    cor.append(cotation((0, 0), (AB, 0), decimaux(AB), couleur="enonce"))
585    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (B, A, D, angBAD))
586    cor.append(u"\\pstLineAB[linestyle=none]{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHashh}" % (A, D))
587    cor.append(u"\\pstLineAB[linestyle=none]{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHashh}" % (B, C))
588    cor.append(u"\\pstLineAB[linestyle=none]{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHash}" % (A, B))
589    cor.append(u"\\pstLineAB[linestyle=none]{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHash}" % (D, C))
590    cor.append(u"\\end{pspicture}")
591
592def quest_parallelogramme_CDA(exo, cor):
593    """On donne un parallélogramme avec la longueur d'un côté et une diagonale et l'angle entre ces deux segments"""
594
595    A, B, C, D = geo.choix_points(4)
596    nom = shuffle_nom([A, B, C, D])
597    AB = 0.1 * random.randint(40, 60)  # AB mesure entre 4cm et 7cm, tracé horizontalement
598    AC = 0.1 * random.randint(40, 70)  # AC mesure entre 4cm et 7cm, tracé horizontalement
599    angBAC = random.randint(25, 65)
600    # Calcul pour tracer
601    x_C = round(AC * cos(angBAC), 4)  # round() évite une écriture scientifique si x_D=2.4e-15, non reconnue par PSTricks
602    y_D = y_C = AC * sin(angBAC)
603    x_D = round(x_C - AB, 4)
604
605    exo.append(_(u"\\item Trace un parallélogramme $%s$ tel que $%s%s=\\unit[%s]{cm}$, $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
606               % (nom, A, B, decimaux(AB), C, A, decimaux(AC), B, A, C, angBAC))
607    cor.append(_(u"\\item Trace un parallélogramme $%s$ tel que $%s%s=\\unit[%s]{cm}$, $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
608               % (nom, A, B, decimaux(AB), C, A, decimaux(AC), B, A, C, angBAC))
609    # Programme de construction
610    cor.append(u"\\begin{enumerate}")
611    cor.append(_(u"\\item Je trace le segment $[%s%s]$ mesurant $\\unit[%s]{cm}$ ;") % (A, B, decimaux(AB)))
612    cor.append(_(u"\\item je trace la demi-droite $[%s%s)$ en mesurant $\\widehat{%s%s%s}=%s\\degres$ ;") % (A, C, B, A, C, angBAC))
613    cor.append(_(u"\\item je place le point $%s$ en mesurant $%s%s=\\unit[%s]{cm}$ ;") % (C, A, C, decimaux(AC)))
614    cor.append(_(u"\\item je construis le point $%s$ en reportant au compas $%s%s=%s%s$ et $%s%s=%s%s$.")
615               % (D, C, D, B, A, A, D, B, C))
616    cor.append("\\end{enumerate}\n")
617    # Figure
618    cor.append(u"\\begin{pspicture}(%.3f,-1)(%.3f,%.3f)" % (min(0, x_C - AB) - 0.4, max(AB, x_C) + 0.4, y_C + 1))
619    cor.append(u"\\pstGeonode[PosAngle={-135,-45,45,135}](0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}(%.3f,%.3f){%s}" % (A, AB, B, x_C, y_C, C, x_D, y_D, D))
620    cor.append(u"\\pstLineAB{%s}{%s}\\pstLineAB{%s}{%s}\\pstLineAB{%s}{%s}\\pstLineAB{%s}{%s}\\pstLineAB[nodesepB=-1]{%s}{%s}"
621               % (A, D, C, D, A, B, B, C, A, C))
622    # Construction
623    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[C_1]" % (A, C))
624    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[C_2]" % (A, C))
625    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{C_2}{C_1}" % (A))
626    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[D_1]" % (A, D))
627    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[D_2]" % (A, D))
628    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{D_2}{D_1}" % (A))
629    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[D_3]" % (C, D))
630    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[D_4]" % (C, D))
631    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{D_4}{D_3}" % (C))
632    # Codage
633    cor.append(cotation_h((0, 0), (x_C, y_C), decimaux(AC), couleur="enonce"))
634    cor.append(cotation((0, 0), (AB, 0), decimaux(AB), couleur="enonce"))
635    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (B, A, C, angBAC))
636    cor.append(u"\\pstLineAB[linestyle=none]{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHashh}" % (A, D))
637    cor.append(u"\\pstLineAB[linestyle=none]{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHashh}" % (B, C))
638    cor.append(u"\\pstLineAB[linestyle=none]{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHash}" % (A, B))
639    cor.append(u"\\pstLineAB[linestyle=none]{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHash}" % (D, C))
640    cor.append(u"\\end{pspicture}")
641
642def quest_parallelogramme_DDA(exo, cor):
643    """On donne un parallélogramme avec la longueur des deux diagonales et l'angle entre les diagonales"""
644    # choix d'angle : on pourrait donner l'angle BAC
645    # diagonale ou demi-diagonale
646    A, B, C, D, E = geo.choix_points(5)
647    nom = shuffle_nom([A, B, C, D])
648    BD = 0.2 * random.randint(20, 40)  # AB mesure entre 4cm et 8cm, tracé horizontalement
649    AC = 0.2 * random.randint(20, 40)  # AC mesure entre 4cm et 8cm, tracé horizontalement
650    angAEB = random.randint(35, 145)
651    AE = AC / 2
652    BE = BD / 2
653
654    # calcul pour tracer
655    AB = math.sqrt(AE ** 2 + BE ** 2 - 2 * AE * BE * cos(angAEB))
656    angBAC = math.degrees(math.asin(BE * sin(angAEB) / AB))
657    x_C = AC * cos(angBAC)
658    y_D = y_C = round(AC * sin(angBAC), 4)
659    x_D = round(x_C - AB, 4)
660
661    exo.append(_(u"\\item Trace un parallélogramme $%s$ de centre $%s$ tel que $%s%s=\\unit[%s]{cm}$, $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
662               % (nom, E, A, C, decimaux(AC), B, D, decimaux(BD), A, E, B, angAEB))
663    cor.append(_(u"\\item Trace un parallélogramme $%s$ de centre $%s$ tel que $%s%s=\\unit[%s]{cm}$, $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
664               % (nom, E, A, C, decimaux(AC), B, D, decimaux(BD), A, E, B, angAEB))
665    cor.append(u"\\begin{enumerate}")
666    cor.append(_(u"\\item Je trace le segment $[%s%s]$ mesurant $\\unit[%s]{cm}$ ;") % (A, C, decimaux(AC)))
667    cor.append(_(u"\\item Dans un parallélogramme les diagonales se coupent en leur milieu donc $%s%s=%s%s=\\unit[%s]{cm}$ et $%s%s=%s%s=\\unit[%s]{cm}$ ;")
668               % (A, E, C, E, decimaux(AC / 2), B, E, E, D, decimaux(BD / 2)))
669    cor.append("\\end{enumerate}\n")
670    cor.append(u"\\begin{pspicture}(%.3f,-1)(%.3f,%.3f)" % (min(0, x_D) - 0.4, max(AB, x_C) + 0.4, y_C + 1))
671    cor.append(u"\\pstGeonode[PosAngle={-135,-45,45,135,%s}](0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}(%.3f,%.3f){%s}(%.3f,%.3f){%s}"
672               % ([round(angBAC - (180 - angAEB) / 2), round(angBAC + (angAEB) / 2)][angAEB > 90], A, AB, B, x_C, y_C, C, x_D, y_D, D, x_C / 2, y_C / 2, E))
673    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHashh}" % (A, E))
674    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkHashh}" % (C, E))
675    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkCros}" % (B, E))
676    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkCros}" % (D, E))
677    cor.append(u"\\pstLineAB{%s}{%s}\\pstLineAB{%s}{%s}\\pstLineAB{%s}{%s}\\pstLineAB{%s}{%s}"
678               % (A, D, C, D, A, B, B, C))
679    cor.append(cotation_h((0, 0), (x_C / 2, y_C / 2), decimaux(AC / 2), couleur="enonce"))
680    cor.append(cotation_h((x_C / 2, y_C / 2), (AB, 0), decimaux(BD / 2), couleur="enonce"))
681    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (A, E, B, angAEB))
682    cor.append(u"\\end{pspicture}")
683
684###################### LOSANGES ########################
685
686def quest_losange_DD(exo, cor):
687    """On donne un losange avec la longueur des deux diagonales"""
688    # diagonale ou demi-diagonale
689    A, B, C, D, E = geo.choix_points(5)
690    nom = shuffle_nom([A, B, C, D])
691    BD = 0.2 * random.randint(15, 25)  # AB mesure entre 4cm et 8cm, tracé horizontalement
692    AC = 0.2 * random.randint(20, 40)  # AC mesure entre 4cm et 8cm, tracé horizontalement
693
694    exo.append(_(u"\\item Trace un losange $%s$  tel que $%s%s=\\unit[%s]{cm}$ et $%s%s=\\unit[%s]{cm}$.\\par")
695               % (nom, A, C, decimaux(AC), B, D, decimaux(BD)))
696    cor.append(_(u"\\item Trace un losange $%s$  tel que $%s%s=\\unit[%s]{cm}$ et $%s%s=\\unit[%s]{cm}$.\\par")
697               % (nom, A, C, decimaux(AC), B, D, decimaux(BD)))
698
699    cor.append(_(u"Je note $%s$ le centre du losange.\\par") % E)
700
701    cor.append("\\figureadroite{")
702    cor.append(u"\\begin{pspicture}(%.3f,%.3f)(%.3f,%.3f)" % (-BD / 2 - 0.7, -AC / 2 - 0.4, BD / 2 + 0.4, AC / 2 + 0.4))
703    cor.append(u"\\pstGeonode[PosAngle={-90,0,90,180}](0,%.3f){%s}(%.3f,0){%s}(0,%.3f){%s}(%.3f,0){%s}"
704               % (-AC / 2, A, BD / 2, B, AC / 2, C, -BD / 2, D))
705    cor.append("\\pstGeonode[PosAngle=-45](0,0){%s}" % E)
706
707    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkCross}" % (A, E))
708    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkCross}" % (C, E))
709    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkCros}" % (B, E))
710    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkCros}" % (D, E))
711    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (A, B))
712    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (C, D))
713    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (B, C))
714    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (D, A))
715    cor.append("\\pstRightAngle[linecolor=calcul]{%s}{%s}{%s}" % (B, E, C))
716    cor.append(cotation_h((-BD / 2, 0), (0, 0), decimaux(BD / 2), couleur="enonce"))
717    cor.append(cotation_h((0, -AC / 2), (0, 0), decimaux(AC / 2), couleur="enonce"))
718    cor.append(u"\\end{pspicture}}{")
719    cor.append(_(u"Les diagonales du losange se coupent perpendiculairement en leur milieu~$%s$ ;  on a donc :") % E)
720    cor.append(u"\\begin{enumerate}")
721    cor.append(u"\\item $%s%s=%s%s=\\unit[%s]{cm}$ \\item $%s%s=%s%s=\\unit[%s]{cm}$ ;"
722               % (A, E, C, E, decimaux(AC / 2), B, E, E, D, decimaux(BD / 2)))
723    cor.append(u"\\item $(%s%s)\\perp(%s%s)$." % (A, C, B, D))
724    cor.append("\\end{enumerate}}\n")
725
726def quest_losange_CC(exo, cor):
727    """On donne un losange avec la longueur d'un côté et un angle entre côtés"""
728    # diagonale ou demi-diagonale
729    A, B, C, D = geo.choix_points(4)
730    nom = shuffle_nom([A, B, C, D])
731    AB = 0.2 * random.randint(15, 25)  # AB mesure entre 4cm et 8cm, tracé horizontalement
732    angBAD = random.randint(30, 150)
733    # Calcul pour tracer
734    x_D = AB * cos(angBAD)
735    y_D = y_C = AB * sin(angBAD)
736    x_C = x_D + AB
737
738    exo.append(_(u"\\item Trace un losange $%s$  tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
739               % (nom, A, B, decimaux(AB), B, A, D, angBAD))
740    cor.append(_(u"\\item Trace un losange $%s$  tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
741               % (nom, A, B, decimaux(AB), B, A, D, angBAD))
742
743    cor.append(_(u"Les quatre côtés du losange sont de même longueur donc $%s%s=%s%s=%s%s=%s%s=\\unit[%s]{cm}$ ;") % (A, B, B, C, C, D, D, A, decimaux(AB)))
744    cor.append(u"\\begin{enumerate}")
745    cor.append(_(u"\\item On trace le côté $[%s%s]$ puis on mesure l'angle $\\widehat{%s%s%s}=%s\\degres$ ;") % (A, B, B, A, D, angBAD))
746    cor.append(_(u"\\item ensuite on reporte au compas les longueurs $%s%s$ et $%s%s$ pour construire le point $%s$.") % (C, D, B, C, C))
747    cor.append("\\end{enumerate}\n")
748    cor.append(u"\\begin{pspicture}(%.3f,%.3f)(%.3f,%.3f)" % (min(0, x_D) - 0.4, 0 - 0.4, max(AB, x_C), y_D + 0.4))
749    cor.append(u"\\pstGeonode[PosAngle={%s,%s,%s,%s}](0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}(%.3f,%.3f){%s}"
750               % (angBAD / 2 - 180, angBAD / 2 - 90, angBAD / 2, angBAD / 2 + 90, A, AB, B, x_C, y_C, C, x_D, y_D, D))
751
752    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (A, B))
753    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (C, D))
754    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (B, C))
755    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (D, A))
756
757    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[C_1]" % (D, C))
758    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[C_2]" % (D, C))
759    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{C_2}{C_1}" % (D))
760    cor.append(u"\\pstRotation[RotAngle=7,PointSymbol=none,PointName=none]{%s}{%s}[C_3]" % (B, C))
761    cor.append(u"\\pstRotation[RotAngle=-7,PointSymbol=none,PointName=none]{%s}{%s}[C_4]" % (B, C))
762    cor.append(u"\\pstArcOAB[linecolor=calcul]{%s}{C_4}{C_3}" % (B))
763    cor.append(cotation((0, 0), (AB, 0), decimaux(AB), couleur="enonce"))
764    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (B, A, D, angBAD))
765    cor.append(u"\\end{pspicture}")
766
767def quest_losange_CD(exo, cor):
768    """On donne un losange avec la longueur d'un côté et la mesure d'un angle entre un côté et une diagonale"""
769
770    A, B, C, D = geo.choix_points(4)
771    nom = shuffle_nom([A, B, C, D])
772    AC = 0.1 * random.randint(40, 60)  # AB mesure entre 4cm et 7cm, tracé horizontalement
773    angBAC = random.randint(25, 75)
774    # Calcul pour tracer
775    x_D = AC / 2
776    y_D = AC / 2 * tan(angBAC)
777
778    exo.append(_(u"\\item Trace un losange $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
779               % (nom, A, C, decimaux(AC), B, A, C, angBAC))
780    cor.append(_(u"\\item Trace un losange $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
781               % (nom, A, C, decimaux(AC), B, A, C, angBAC))
782    # Rédaction
783    cor.append(_(u" Comme $%s$ est un losange, je sais que $\\widehat{%s%s%s}=\\widehat{%s%s%s}=\\widehat{%s%s%s}=\\widehat{%s%s%s}=%s\\degres$.")
784               % (nom, B, A, C, A, C, B, A, C, D, C, A, D, angBAC))
785    # Programme de construction
786    cor.append(u"\\begin{enumerate}")
787    cor.append(_(u"\\item Je trace le segment $[%s%s]$ mesurant $\\unit[%s]{cm}$ ;") % (A, C, decimaux(AC)))
788    cor.append(_(u"\\item je trace $\\widehat{%s%s%s}$ et $\\widehat{%s%s%s}$ pour construire le point $%s$ ;") % (B, A, C, A, C, B, B))
789    cor.append(_(u"\\item je trace $\\widehat{%s%s%s}$ et $\\widehat{%s%s%s}$ pour construire le point $%s$ ;") % (A, C, D, C, A, D, D))
790    cor.append("\\end{enumerate}\n")
791    cor.append(u"\\begin{pspicture}(-0.4,%.3f)(%.3f,%.3f)" % (-y_D - 1, AC + 0.4, y_D + 1))
792    # figure
793    cor.append(u"\\pstGeonode[PosAngle={-180,0,90,-90}](0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}(%.3f,%.3f){%s}" % (A, AC, C, x_D, y_D, D, x_D, -y_D, B))
794    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (A, B))
795    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (C, D))
796    cor.append(u"\\pstLineAB[nodesepA=-1]{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (B, C))
797    cor.append(u"\\pstLineAB[nodesepA=-1]{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (D, A))
798    cor.append(u"\\pstLineAB{%s}{%s}" % (A, C))
799    cor.append(cotation_h((0, 0), (AC, 0), decimaux(AC), couleur="enonce"))
800    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce,Mark=MarkHash]{%s}{%s}{%s}{%s\\degres}" % (B, A, C, angBAC))
801    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=calcul,Mark=MarkHash]{%s}{%s}{%s}{}" % (C, A, D))
802    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=calcul,Mark=MarkHash]{%s}{%s}{%s}{}" % (D, C, A))
803    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=calcul,Mark=MarkHash]{%s}{%s}{%s}{}" % (A, C, B))
804    cor.append(u"\\end{pspicture}")
805
806def quest_losange_CDbis(exo, cor):
807    """On donne un losange avec la longueur d'un côté et la mesure d'un angle entre un côté et une diagonale"""
808
809    A, B, C, D = geo.choix_points(4)
810    nom = shuffle_nom([A, B, C, D])
811    AC = 0.1 * random.randint(40, 60)  # AB mesure entre 4cm et 7cm, tracé horizontalement
812    angCDA = 2 * random.randint(15, 70)
813    # Calcul pour tracer
814    angCAD = (180 - angCDA) / 2
815    x_D = AC / 2
816    y_D = AC / 2 * tan(angCAD)
817
818    exo.append(_(u"\\item Trace un losange $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
819               % (nom, A, C, decimaux(AC), C, D, A, angCDA))
820    cor.append(_(u"\\item Trace un losange $%s$ tel que $%s%s=\\unit[%s]{cm}$ et $\\widehat{%s%s%s}=%s\\degres$.\\par")
821               % (nom, A, C, decimaux(AC), C, D, A, angCDA))
822
823    # Rédaction des calculs
824    cor.append(_(u"Les quatre côtés du losange sont de même longueur donc $%s%s=%s%s=%s%s=%s%s$.\\par") % (A, B, B, C, C, D, D, A))
825    cor.append(_(u"Ainsi, le triangle $%s%s%s$ est isocèle en $%s$ et je peux calculer la mesure des angles $\\widehat{%s%s%s}=\\widehat{%s%s%s}$.\\par")
826               % (A, C, D, A, A, C, D, C, A, D))
827    cor.append(_(u"Dans un triangle, la somme des angles du triangle est égale à 180\\degres\\\\"))
828    cor.append(_(u"donc $\\widehat{%s%s%s}=\\widehat{%s%s%s}=(180\\degres-%s)\\div2=%s\\degres$") % (A, C, D, C, A, D, angCDA, angCAD))
829    # Programme de construction
830    cor.append(u"\\begin{enumerate}")
831    cor.append(_(u"\\item Je trace le segment $[%s%s]$ mesurant $\\unit[%s]{cm}$ ;") % (A, C, decimaux(AC)))
832    cor.append(_(u"\\item je trace $\\widehat{%s%s%s}$ et $\\widehat{%s%s%s}$ pour construire le point $%s$ ;") % (B, A, C, A, C, B, B))
833    cor.append(_(u"\\item je trace $\\widehat{%s%s%s}$ et $\\widehat{%s%s%s}$ pour construire le point $%s$ ;") % (A, C, D, C, A, D, D))
834    cor.append("\\end{enumerate}\n")
835
836    cor.append(u"\\begin{pspicture}(-0.4,%.3f)(%.3f,%.3f)" % (-y_D - 1, AC + 0.4, y_D + 1))
837    # Figure
838    cor.append(u"\\pstGeonode[PosAngle={-180,0,90,-90}](0,0){%s}(%.3f,0){%s}(%.3f,%.3f){%s}(%.3f,%.3f){%s}" % (A, AC, C, x_D, y_D, D, x_D, -y_D, B))
839    cor.append(u"\\pstLineAB{%s}{%s}" % (A, C))
840    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}" % (A, B))
841    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}" % (C, B))
842    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}" % (C, D))
843    cor.append(u"\\pstLineAB[nodesepB=-1]{%s}{%s}" % (A, D))
844    # codage
845    cor.append(u"\\color{calcul}\\pstMarkAngle[linecolor=calcul,Mark=MarkHash]{%s}{%s}{%s}{}" % (B, A, C))
846    cor.append(u"\\color{calcul}\\pstMarkAngle[linecolor=calcul,Mark=MarkHash]{%s}{%s}{%s}{%s\\degres}" % (C, A, D, angCAD))
847    cor.append(u"\\color{calcul}\\pstMarkAngle[linecolor=calcul,Mark=MarkHash]{%s}{%s}{%s}{%s\\degres}" % (D, C, A, angCAD))
848    cor.append(u"\\color{calcul}\\pstMarkAngle[linecolor=calcul,Mark=MarkHash]{%s}{%s}{%s}{}" % (A, C, B))
849    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (A, B))
850    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (C, B))
851    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (C, D))
852    cor.append(u"\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (A, D))
853    cor.append(cotation((0, 0), (AC, 0), decimaux(AC), couleur="enonce"))
854    cor.append(u"\\color{enonce}\\pstMarkAngle[linecolor=enonce]{%s}{%s}{%s}{%s\\degres}" % (A, D, C, angCDA))
855    cor.append(u"\\end{pspicture}")
856
857################### CARRÉ #######################
858
859def carre_diag(exo, cor):
860    """trace un carré dont on donne la longueur de la diagonale"""
861
862    A, B, C, D, E = geo.choix_points(5)
863    nom = shuffle_nom([A, B, C, D])
864    BD = AC = 0.2 * random.randint(20, 40)  # AC mesure entre 4cm et 8cm, tracé horizontalement
865
866    exo.append(_(u"\\item Trace un carré $%s$  tel que $%s%s=\\unit[%s]{cm}$.\\par")
867               % (nom, A, C, decimaux(AC)))
868    cor.append(_(u"\\item Trace un carré $%s$  tel que $%s%s=\\unit[%s]{cm}$.\\par")
869               % (nom, A, C, decimaux(AC)))
870
871    cor.append(_(u"Je note $%s$ le centre du carré.\\par") % (E))
872    cor.append(_(u" Les diagonales du carré se coupent perpendiculairement en leur milieu $%s$ donc on a :") % E)
873    cor.append("\\begin{enumerate}")
874    cor.append(u"\\item $(%s%s)\\perp(%s%s)$." % (A, C, B, D))
875    cor.append(u"\\item  $%s%s=%s%s=%s%s=%s%s=\\unit[%s]{cm}$ ;"
876               % (A, E, C, E, B, E, D, E, decimaux(BD / 2)))
877    cor.append("\\end{enumerate}\n")
878
879    cor.append("\\begin{pspicture}(%.3f,%.3f)(%.3f,%.3f)" % (-BD / 2 - 0.4, -AC / 2 - 0.4, BD / 2 + 0.4, AC / 2 + 0.4))
880    cor.append("\\pstGeonode[PosAngle={-90,0,90,180}](0,%.3f){%s}(%.3f,0){%s}(0,%.3f){%s}(%.3f,0){%s}"
881               % (-AC / 2, A, BD / 2, B, AC / 2, C, -BD / 2, D))
882    cor.append("\\pstGeonode[PosAngle=-45](0,0){%s}" % E)
883
884    cor.append("\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkCros}" % (A, E))
885    cor.append("\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkCros}" % (C, E))
886    cor.append("\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkCros}" % (B, E))
887    cor.append("\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=calcul}\\MarkCros}" % (D, E))
888    cor.append("\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (A, B))
889    cor.append("\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (C, D))
890    cor.append("\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (B, C))
891    cor.append("\\pstLineAB{%s}{%s}\\lput{:U}{\\psset{linecolor=enonce}\\MarkHashh}" % (D, A))
892    cor.append("\\pstRightAngle[linecolor=calcul]{%s}{%s}{%s}" % (B, E, C))
893    cor.append(cotation_h((-BD / 2, 0), (0, 0), decimaux(BD / 2), couleur="enonce"))
894    cor.append(u"\\end{pspicture}")
Note: See TracBrowser for help on using the repository browser.