geometrie.py 32.8 KB
Newer Older
1
#!/usr/bin/env python3
2

Jérôme Ortais's avatar
Jérôme Ortais committed
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Pyromaths
# Un programme en Python qui permet de créer des fiches d'exercices types de
# mathématiques niveau collège ainsi que leur corrigé en LaTeX.
# Copyright (C) 2006 -- Jérôme Ortais (jerome.ortais@pyromaths.org)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Louis's avatar
Louis committed
21
22


Jérôme Ortais's avatar
Jérôme Ortais committed
23
import random
Louis's avatar
Louis committed
24
import textwrap
25
from decimal import Decimal
Jérôme Ortais's avatar
Jérôme Ortais committed
26
27
from math import acos, asin, atan, pi, sin, cos, tan

28
from fractions import Fraction
29
from pyromaths.outils.decimaux import decimaux
30
from pyromaths.outils.Geometrie import couples_pythagore, choix_points
31
from pyromaths.ex import LegacyExercise
Jérôme Ortais's avatar
Jérôme Ortais committed
32

33

Jérôme Ortais's avatar
Jérôme Ortais committed
34
35
#
# ------------------- THEOREME DE PYTHAGORE -------------------
Jérôme Ortais's avatar
Jérôme Ortais committed
36
37
38
39
40
41
42
def fig_tr_rect(lg):
    # renvoie les angles au centre des trois sommets du triangle ABC rectange en C
    a = random.randrange(360)
    if a < 180:
        b = a + 180
    else:
        b = a - 180
43
    c = float(Fraction(int((180 - 2 * acos(lg[1] * 1 / lg[2]) * 180 / pi) * 100), 100) + a)
Jérôme Ortais's avatar
Jérôme Ortais committed
44
45
46
47
48
49
50
51
    if c < 0:
        c = c + 360
    return (str(a), str(b), str(c))


def enonce_pythagore(noms, angles, longueurs, cotes, nom_tr, long0,
                     long1, diam=0):
    if diam:
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
        return {
                "nomA": noms[0],
                "anglenomA": angles[0],
                "angleA": angles[0],
                "nomB": noms[1],
                "anglenomB": angles[1],
                "angleB": angles[1],
                "nomC": noms[2],
                "anglenomC": angles[2],
                "angleC": angles[2],
                "angleCercle": int(float(angles[0]) - 90),
                "diametre": cotes[2],
                "sommet": noms[2],
                "segment0": cotes[long0],
                "longueur0": decimaux(longueurs[long0], 1),
                "segment1": cotes[long1],
                "longueur1": decimaux(longueurs[long1], 1),
                "question": cotes[(3 - long0) - long1],
            }
Jérôme Ortais's avatar
Jérôme Ortais committed
71
72
73
74
75
    else:
        return (
            nom_tr,
            noms[2],
            cotes[long0],
76
            decimaux(longueurs[long0], 1),
Jérôme Ortais's avatar
Jérôme Ortais committed
77
            cotes[long1],
78
            decimaux(longueurs[long1], 1),
Jérôme Ortais's avatar
Jérôme Ortais committed
79
            cotes[(3 - long0) - long1],
80
        )
Jérôme Ortais's avatar
Jérôme Ortais committed
81
82


83
def _exo_pythagore():
84
85
86
87
88
89
90
91
    types_exercice = [[2, random.randrange(2)], [0, 1]]
    random.shuffle(types_exercice)
    random.shuffle(types_exercice[0])
    random.shuffle(types_exercice[1])
    exo = ["\\exercice\n\\begin{multicols}{2}\n  \\begin{enumerate}"]
    cor = ["\\exercice*\n\\begin{multicols}{2}\n  \\begin{enumerate}"]
    for j in range(2):
        while True:
92
            longueurs = couples_pythagore[random.randrange(len(couples_pythagore))]
93
            longueurs = [longueurs[i] / 10 for i in range(3)]
94
95
            if inegalite_triangulaire(longueurs):
                break
Jérôme Ortais's avatar
Jérôme Ortais committed
96
        noms = choix_points(3)
97
98
        angles = fig_tr_rect(longueurs)
        nom_tr = nom_triangle(noms)
99
        long0, long1 = types_exercice[j]
100
101
102
        cotes = cotes_sommets(noms)
        enonce = \
            """    \\item Soit $%s$ un triangle rectangle en $%s$ tel que :\\par
Louis's avatar
Louis committed
103
$%s=\\SI{%s}{cm}$ et $%s=\\SI{%s}{cm}$.\\par
104
Calculer la longueur $%s$.""" % \
105
            enonce_pythagore(noms, angles, longueurs, cotes, nom_tr, long0, long1)
106
107
        exo.append(enonce)
        cor.append(enonce)
108
        cor.append("\\par\\dotfill{}\\par\n")
109
        cor.append(u"Le triangle $%s$ est rectangle en $%s$.\\par" % \
110
                   (nom_tr, noms[2]))
111
        cor.append(u"Son hypoténuse est $[%s]$.\\par" % (cotes[2]))
112
113
        cor.append(u"D'après le \\textbf{théorème de Pythagore} :")
        cor.append("\\[%s^2=%s^2+%s^2\\]" % (cotes[2], cotes[0], cotes[1]))
114
        if long0 == 2 or long1 == 2:
115
116
            cor.append("\\[%s^2=%s^2-%s^2\\kern1cm\\text{(On cherche }%s)\\]" %
                       (cotes[(3 - long0) - long1], cotes[2], cotes[((4 -
117
                                                                      long0) - long1) % 2], cotes[(3 - long0) - long1]))
118
        if long0 == 2 or long1 == 2:
119
            cor.append("\\[%s^2=%s^2-%s^2\\]" % (cotes[(3 - long0) - long1],
120
121
                                                 decimaux(longueurs[2], 1),
                                                 decimaux(longueurs[((4 - long0) - long1) % 2], 1)))
122
        else:
123
124
125
            cor.append("\\[%s^2=%s^2+%s^2\\]" % (cotes[2],
                decimaux(longueurs[0], 1),
                decimaux(longueurs[1], 1)))
126
        if long0 == 2 or long1 == 2:
127
            cor.append("\\[%s^2=%s-%s\\]" % (cotes[(3 - long0) - long1],
128
129
                decimaux(longueurs[2] ** 2, 1),
                decimaux(longueurs[((4 - long0) - long1) % 2] ** 2, 1)))
130
        else:
131
132
133
            cor.append("\\[%s^2=%s+%s\\]" % (cotes[2],
                decimaux(longueurs[0] ** 2),
                decimaux(longueurs[1] ** 2, 1)))
134
        if long0 == 2 or long1 == 2:
135
            cor.append("\\[%s^2=%s\\]" % (cotes[(3 - long0) - long1],
136
                decimaux(longueurs[2] ** 2 - longueurs[((4 - long0) - long1) % 2] ** 2, 1)))
137
        else:
138
139
            cor.append("\\[%s^2=%s\\]" % (cotes[2],
                decimaux(longueurs[0] ** 2 + longueurs[1] ** 2, 1)))
140
        if long0 == 2 or long1 == 2:
Louis's avatar
Louis committed
141
            cor.append("\\[ \\boxed{\\text{Donc }%s=\\sqrt{%s}=\\SI{%s}{cm}}\\]" %
142
143
144
                       (cotes[(3 - long0) - long1],
                           decimaux(longueurs[2] ** 2 - longueurs[((4 - long0) - long1) % 2] ** 2, 1),
                           decimaux(longueurs[(3 - long0) - long1], 1)))
145
        else:
Louis's avatar
Louis committed
146
            cor.append("\\[\\boxed{\\text{Donc }%s=\\sqrt{%s}=\\SI{%s}{cm}}\\]" %
147
148
149
                       (cotes[2],
                           decimaux(longueurs[0] ** 2 + longueurs[1] ** 2, 1),
                           decimaux(longueurs[2], 1)))
150
        if j == 0:
151
152
153
154
            exo.append("\\columnbreak")
            cor.append("\\columnbreak")
    exo.append("\\end{enumerate}\n\\end{multicols}\n")
    cor.append("\\end{enumerate}\n\\end{multicols}\n")
Jérôme Ortais's avatar
Jérôme Ortais committed
155
156
    return (exo, cor)

157
158
159
class exo_pythagore(LegacyExercise):
    """Théorème de Pythagore"""

160
161
162
163
164
    tags = [
        "Quatrième",
        "triangle",
        "Pythagore",
    ]
165
    function = _exo_pythagore
166

Jérôme Ortais's avatar
Jérôme Ortais committed
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183

def nom_triangle(noms):  # renvoie le nom du triangle dans un ordre aleatoire
    a = random.randrange(3)
    b = (random.randrange(2) + 1 + a) % 3
    c = (3 - a) - b
    return '%s%s%s' % (noms[a], noms[b], noms[c])


def cotes_sommets(noms):  # renvoie les noms des 3 cotes du triangle en finissant par l'hypotenuse
    return (noms[1] + noms[2], noms[0] + noms[2], noms[0] + noms[1])


#
# ------------------- CERCLE ET THEOREME DE PYTHAGORE -------------------
#


184
def _exo_triangle_cercle():
Jérôme Ortais's avatar
Jérôme Ortais committed
185
186
187
    exo = ["\\exercice"]
    cor = ["\\exercice*"]
    while True:
188
        longueurs = couples_pythagore[random.randrange(len(couples_pythagore))]
189
        longueurs = [longueurs[i] / 10 for i in range(3)]
Jérôme Ortais's avatar
Jérôme Ortais committed
190
191
        if inegalite_triangulaire(longueurs):
            break
Jérôme Ortais's avatar
Jérôme Ortais committed
192
    noms = choix_points(3)
Jérôme Ortais's avatar
Jérôme Ortais committed
193
194
195
196
197
198
    angles = fig_tr_rect(longueurs)
    nom_tr = nom_triangle(noms)
    long0 = random.randrange(3)
    long1 = (random.randrange(2) + 1 + long0) % 3
    cotes = cotes_sommets(noms)
    enonce = \
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
        r"""\begin{{minipage}}{{4cm}}
\begin{{tikzpicture}}[Maroon, very thick]
    \coordinate (a) at ({angleA}:1.5);
    \coordinate (b) at ({angleB}:1.5);
    \coordinate (c) at ({angleC}:1.5);
    \draw ($(a) + ({anglenomA}:.4)$) node[black]{{${nomA}$}};
    \draw ($(b) + ({anglenomB}:.4)$) node[black]{{${nomB}$}};
    \draw ($(c) + ({anglenomC}:.4)$) node[black]{{${nomC}$}};
    \draw (a) -- (b) -- (c) -- cycle;
    \draw (0, 0) circle (1.5);
    \draw ({angleCercle}:1.8) node[black]{{$\big(\mathcal{{C}}\big)$}};
\end{{tikzpicture}}
\end{{minipage}}\hfill
\begin{{minipage}}{{13cm}}
$\big(\mathcal{{C}}\big)$ est un cercle de diamètre $[{diametre}]$ et ${sommet}$ est un point de $\big(\mathcal{{C}}\big)$.\par
On donne ${segment0}=\SI{{ {longueur0} }}{{cm}}$ et ${segment1}=\SI{{ {longueur1} }}{{cm}}$.\par
Calculer la longueur ${question}$.""".format(**enonce_pythagore(noms, angles, longueurs, cotes, nom_tr, long0, long1, diam=1))
Jérôme Ortais's avatar
Jérôme Ortais committed
216
217
    exo.append(enonce)
    cor.append(enonce)
218
    cor.append("\\par\\dotfill{}\\\\\n")
219
    cor.append(u"$[%s]$ est le diamètre du cercle circonscrit au triangle $%s$.\\par" %
Jérôme Ortais's avatar
Jérôme Ortais committed
220
               (cotes[2], nom_tr))
221
    cor.append("\\fbox{Donc le triangle %s est rectangle en %s.}\\\\\n" %
Jérôme Ortais's avatar
Jérôme Ortais committed
222
               (nom_tr, noms[2]))
223
    cor.append(u"D'après le \\textbf{théorème de Pythagore} :")
224
    cor.append(u"\\[%s^2=%s^2+%s^2\\kern1cm\\text{(car }[%s]\\text{ est \\emph{l'hypoténuse})}\\]" %
Jérôme Ortais's avatar
Jérôme Ortais committed
225
226
               (cotes[2], cotes[0], cotes[1], cotes[2]))
    if long0 == 2 or long1 == 2:
227
228
        cor.append("\\[%s^2=%s^2-%s^2\\kern1cm\\text{(On cherche }%s)\\]" %
                   (cotes[(3 - long0) - long1], cotes[2], cotes[((4 -
229
                                                                  long0) - long1) % 2], cotes[(3 - long0) - long1]))
Jérôme Ortais's avatar
Jérôme Ortais committed
230
    if long0 == 2 or long1 == 2:
231
        cor.append("\\[%s^2=%s^2-%s^2\\]" % (cotes[(3 - long0) - long1],
232
233
                                             decimaux(longueurs[2], 1), decimaux(longueurs[((4 - long0) -
                                                                                     long1) % 2], 1)))
Jérôme Ortais's avatar
Jérôme Ortais committed
234
    else:
235
236
        cor.append("\\[%s^2=%s^2+%s^2\\]" % (cotes[2], decimaux(longueurs[0], 1),
                                             decimaux(longueurs[1], 1)))
Jérôme Ortais's avatar
Jérôme Ortais committed
237
    if long0 == 2 or long1 == 2:
238
        cor.append("\\[%s^2=%s-%s\\]" % (cotes[(3 - long0) - long1],
239
240
                                         decimaux(longueurs[2] ** 2, 1), decimaux(longueurs[((4 -
                                                                                       long0) - long1) % 2] ** 2, 1)))
Jérôme Ortais's avatar
Jérôme Ortais committed
241
    else:
242
243
        cor.append("\\[%s^2=%s+%s\\]" % (cotes[2], decimaux(longueurs[0] **
                                                          2, 1), decimaux(longueurs[1] ** 2, 1)))
Jérôme Ortais's avatar
Jérôme Ortais committed
244
    if long0 == 2 or long1 == 2:
245
        cor.append("\\[%s^2=%s\\]" % (cotes[(3 - long0) - long1],
246
247
                                      decimaux(longueurs[2] ** 2 - longueurs[((4 - long0) -
                                                                            long1) % 2] ** 2, 1)))
Jérôme Ortais's avatar
Jérôme Ortais committed
248
    else:
249
250
        cor.append("\\[%s^2=%s\\]" % (cotes[2], decimaux(longueurs[0] **
                                                       2 + longueurs[1] ** 2, 1)))
Jérôme Ortais's avatar
Jérôme Ortais committed
251
    if long0 == 2 or long1 == 2:
Louis's avatar
Louis committed
252
        cor.append("\\[\\boxed{\\text{Donc }%s=\\sqrt{%s}=\\SI{%s}{cm}}\\]" %
253
254
255
                   (cotes[(3 - long0) - long1],
                       decimaux(longueurs[2] ** 2 - longueurs[((4 - long0) - long1) % 2] ** 2, 1),
                       decimaux(longueurs[(3 - long0) - long1], 1)))
Jérôme Ortais's avatar
Jérôme Ortais committed
256
    else:
Louis's avatar
Louis committed
257
        cor.append("\\[\\boxed{\\text{Donc }%s=\\sqrt{%s}=\\SI{%s}{cm}}\\]" %
258
259
260
                   (cotes[2],
                       decimaux(longueurs[0] ** 2 + longueurs[1] ** 2, 1),
                       decimaux(longueurs[2], 1)))
Jérôme Ortais's avatar
Jérôme Ortais committed
261
262
263
264
    exo.append("\\end{minipage}\n")
    cor.append("\\end{minipage}\n")
    return (exo, cor)

265
266
267
class exo_triangle_cercle(LegacyExercise):
    """Cercle et théorème de Pythagore"""

268
269
270
271
272
273
    tags = [
        "Quatrième",
        "géométrie",
        "Pythagore",
        "triangle",
    ]
274
    function = _exo_triangle_cercle
275

Jérôme Ortais's avatar
Jérôme Ortais committed
276
277
278
279
280
281

#
# ------------------- RECIPROQUE DU THEOREME DE PYTHAGORE -------------------
#


282
def _exo_reciproque_pythagore():
Jérôme Ortais's avatar
Jérôme Ortais committed
283
284
285
    exo = ["\\exercice"]
    cor = ["\\exercice*"]
    while True:
286
        longueurs = couples_pythagore[random.randrange(len(couples_pythagore))]
287
        longueurs = [longueurs[i] / 10 for i in range(3)]
Jérôme Ortais's avatar
Jérôme Ortais committed
288
289
        if inegalite_triangulaire(longueurs):
            break
Jérôme Ortais's avatar
Jérôme Ortais committed
290
    noms = choix_points(3)
Jérôme Ortais's avatar
Jérôme Ortais committed
291
    nom_tr = nom_triangle(noms)
292
293
    l = [i for i in range(3)]
    n = [l.pop(random.randrange(3 - i)) for i in range(3)]
Jérôme Ortais's avatar
Jérôme Ortais committed
294
    c = cotes_sommets(noms)
295
296
    recip = (nom_tr, c[n[0]], decimaux(longueurs[n[0]], 1), c[n[1]], decimaux(longueurs[n[1]], 1),
             c[n[2]], decimaux(longueurs[n[2]], 1), nom_tr)
Jérôme Ortais's avatar
Jérôme Ortais committed
297
    enonce = \
Louis's avatar
Louis committed
298
        """Soit $%s$ un triangle tel que : $\\quad %s=\\SI{%s}{cm}\\quad$, $\\quad %s=\\SI{%s}{cm}\\quad$ et $\\quad %s=\\SI{%s}{cm}$.\\par
Jérôme Ortais's avatar
Jérôme Ortais committed
299
300
301
302
303
304
Quelle est la nature du triangle $%s$?
""" % \
        recip
    exo.append(enonce)
    cor.append(enonce)
    cor.append("\\par\\dotfill{}\\\\\n")
305
    cor.append(u"Le triangle %s n'est ni isocèle, ni équilatéral.\\par\n" %
Jérôme Ortais's avatar
Jérôme Ortais committed
306
307
               nom_tr)
    cor.append("$\\left.")
308
309
    cor.append("\\renewcommand{\\arraystretch}{2}")
    cor.append("\\begin{array}{l}")
Jérôme Ortais's avatar
Jérôme Ortais committed
310

311
    cor.append(u"\\bullet %s^2=%s^2=%s\\qquad\\text{(}[%s]\\text{ est le plus grand côté.)}\\\\\n" %
312
               (c[2], decimaux(longueurs[2], 1), decimaux(longueurs[2] ** 2, 1), c[2]))
313
    cor.append("\\bullet  %s^2+%s^2=%s^2+%s^2=%s \n" % (c[0], c[1],
314
315
316
                                                        decimaux(longueurs[0], 1), decimaux(longueurs[1], 1),
                                                        decimaux(longueurs[0] **
                                                               2 + longueurs[1] ** 2, 1)))
317
    cor.append("\\end{array}")
Jérôme Ortais's avatar
Jérôme Ortais committed
318
    cor.append("\\right\\rbrace$")
319
    cor.append(u"""Donc $%s^2=%s^2+%s^2$.\\par
320
D'après la \\textbf{réciproque du théorème de Pythagore},
321
\\fbox{le triangle $%s$ est rectangle en $%s$.}""" %
Jérôme Ortais's avatar
Jérôme Ortais committed
322
323
324
               (c[2], c[0], c[1], nom_tr, noms[2]))
    return (exo, cor)

325
326
327
class exo_reciproque_pythagore(LegacyExercise):
    """Réciproque du théorème de Pythagore"""

328
329
330
331
332
    tags = [
        "Quatrième",
        "Pythagore",
        "triangle",
    ]
333
    function = _exo_reciproque_pythagore
334

Jérôme Ortais's avatar
Jérôme Ortais committed
335
336
337
338
339
340
341
342
343

#
# ------------------- THEOREME DE THALES -------------------
#


def valeurs_thales(pyromax):
    liste = [0, 0, 0, 0, 0, 0, 0, 0]
    while liste == [0, 0, 0, 0, 0, 0, 0, 0]:
344
        for i in range(3):
Jérôme Ortais's avatar
Jérôme Ortais committed
345
346
            liste[i] = random.randrange(2)
    a = random.randrange(liste.count(1))
347
    for i in range(3):
Jérôme Ortais's avatar
Jérôme Ortais committed
348
349
350
351
352
353
        if liste[i]:
            if not a:
                liste[i + 3] = 1
            a = a - 1
        else:
            liste[i + 3] = 1  # on doit connaitre le numeratuer ou le denominateur
354
    for i in range(2):  # AB et AE  ou  AB et BE  ou  AE et EB
Jérôme Ortais's avatar
Jérôme Ortais committed
355
356
357
358
359
360
361
362
363
        if liste[i] and liste[i + 3]:  # i est le rapport complet. On choisit une des 3 formes ci-dessus
            a = random.randrange(2)
            liste[i + 6] = 1
            liste[i + 3 * a] = 0
            rapport = [i + 3 * ((a + 1) % 3), i + 3 * ((a + 2) % 3)]
            rapport.sort()
    if liste[2] and liste[5]:
        rapport = [2, 5]
    valeurs = [0, 0, 0, 0, 0, 0, 0, 0]
364
    for i in range(3):
Jérôme Ortais's avatar
Jérôme Ortais committed
365
        if liste[i]:
366
            valeurs[i] = random.randrange(15, pyromax)
Jérôme Ortais's avatar
Jérôme Ortais committed
367
        if liste[i + 3] and liste[i]:
368
            valeurs[i + 3] = random.randrange(5, valeurs[i] - 9)
Jérôme Ortais's avatar
Jérôme Ortais committed
369
        elif liste[i + 3]:
370
            valeurs[i + 3] = random.randrange(5, pyromax)
Jérôme Ortais's avatar
Jérôme Ortais committed
371
    if liste[6]:
372
        valeurs[6] = random.randrange(5, pyromax)
Jérôme Ortais's avatar
Jérôme Ortais committed
373
    if liste[7]:
374
        valeurs[7] = random.randrange(5, pyromax)
Jérôme Ortais's avatar
Jérôme Ortais committed
375

376
    # --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
377
    # type_thales=valeur_alea(-1,1) # -1 si papillon, 1 si triangle
Jérôme Ortais's avatar
Jérôme Ortais committed
378
379
380
381
382
383
384
385
386
387

    type_thales = 1
    valeurs.append((rapport, type_thales))
    if test_valeurs_thales(valeurs, rapport, type_thales):
        return valeurs
    else:
        return 0


def test_valeurs_thales(valeurs, rapport, type_thales):
388
    v = [valeurs[i] for i in range(8)]
Jérôme Ortais's avatar
Jérôme Ortais committed
389
    if rapport[0] // 3 == 0 and rapport[1] // 3 == 2:  # On donne AB et EB
390
        v[rapport[0] + 3] = (v[rapport[0]] - v[rapport[1]]) * type_thales
391
    elif rapport[0] // 3 == 1 and rapport[1] // 3 == 2:  # On donne AE et EB
Jérôme Ortais's avatar
Jérôme Ortais committed
392
393
        v[rapport[0] - 3] = v[rapport[0]] * type_thales + v[rapport[1]]
    if v[rapport[0] % 3]:  # rapport est AE/AB
394
        rapp = Fraction(v[rapport[0] % 3 + 3], v[rapport[0] % 3])
Jérôme Ortais's avatar
Jérôme Ortais committed
395
396
    else:
        rapp = 0
397
    for i in range(3):
Jérôme Ortais's avatar
Jérôme Ortais committed
398
        if not v[i] and rapp:
399
            v[i] = v[i + 3] / rapp
Jérôme Ortais's avatar
Jérôme Ortais committed
400
401
        elif not v[i + 3]:
            v[i + 3] = v[i] * rapp
402
    if inegalite_triangulaire(v[0:3]) and inegalite_triangulaire(v[3:6]) and .3 < rapp < .7:
Jérôme Ortais's avatar
Jérôme Ortais committed
403
404
405
406
407
408
409
        return v
    else:
        return 0


def inegalite_triangulaire(a):  # renvoie 1 si c'est un triangle, 0 sinon
    vrai = 0
410
    coef = Fraction(12, 10)  # evite les triangles trop ecrases
Jérôme Ortais's avatar
Jérôme Ortais committed
411
412
413
414
    if a[0] > a[1] and a[0] > a[2]:
        if a[1] + a[2] > coef * a[0]:
            vrai = 1
    elif a[1] > a[0] and a[1] > a[2]:
415
        if a[0] + a[2] > coef * a[1]:
Jérôme Ortais's avatar
Jérôme Ortais committed
416
417
418
419
420
421
422
            vrai = 1
    elif a[2] > a[0] and a[2] > a[1]:
        if a[0] + a[1] > coef * a[2]:
            vrai = 1
    return vrai


423
def _exo_thales():
Jérôme Ortais's avatar
Jérôme Ortais committed
424
425
    exo = ["\\exercice"]
    cor = ["\\exercice*"]
Jérôme Ortais's avatar
Jérôme Ortais committed
426
    noms = choix_points(5)  # les noms des sommets
427
428
    arrondi = random.randrange(1, 4)
    text_arrondi = ['dix', 'cent', 'mill'][arrondi - 1] + u'ième'
Jérôme Ortais's avatar
Jérôme Ortais committed
429
430
431
432
433
    while True:
        valeurs = valeurs_thales(70)  # les longueurs en mm
        if valeurs:
            break
    exo.append(tex_fig_thales(noms, valeurs))
434
    exo.append(tex_enonce_thales(noms, valeurs, text_arrondi))
Jérôme Ortais's avatar
Jérôme Ortais committed
435
    cor.append(tex_fig_thales(noms, valeurs))
436
    cor.append(tex_enonce_thales(noms, valeurs, text_arrondi))
Jérôme Ortais's avatar
Jérôme Ortais committed
437
438
439
    cor.append(tex_resolution_thales0(noms, valeurs))
    cor.append(tex_resolution_thales1(noms, valeurs))
    cor.append(tex_resolution_thales2(noms, valeurs))
440
    cor.append(tex_resolution_thales3(noms, valeurs, arrondi))
Jérôme Ortais's avatar
Jérôme Ortais committed
441
442
    return (exo, cor)

443
444
445
class exo_thales(LegacyExercise):
    """Théorème de Thalès"""

446
447
448
449
450
    tags = [
        "Quatrième",
        "triangle",
        "Thalès",
    ]
451
    function = _exo_thales
452

Jérôme Ortais's avatar
Jérôme Ortais committed
453

454
455
def long_val(noms,
             valeurs):  # renvoie un tuple contenant les noms des segments et leur longueur puis les noms des longueurs a calculer
Jérôme Ortais's avatar
Jérôme Ortais committed
456
    liste = []
457
    for i in range(8):
Jérôme Ortais's avatar
Jérôme Ortais committed
458
459
        if valeurs[i]:
            liste.append(creer_noms(noms, i))
460
            liste.append(decimaux(valeurs[i], 1))
461
    for i in range(6):
Jérôme Ortais's avatar
Jérôme Ortais committed
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
        if not valeurs[i] and valeurs[8][0][0] % 3 != i % 3:
            liste.append(creer_noms(noms, i))
    return liste


def lAB(a):  # renvoie AB
    return str(a[0]) + str(a[1])


def creer_noms(noms, i):
    if i == 0:
        return str(noms[0]) + str(noms[1])
    elif i == 1:
        return str(noms[0]) + str(noms[2])
    elif i == 2:
        return str(noms[1]) + str(noms[2])
    elif i == 3:
        return str(noms[0]) + str(noms[3])
    elif i == 4:
        return str(noms[0]) + str(noms[4])
    elif i == 5:
        return str(noms[3]) + str(noms[4])
    elif i == 6:
        return str(noms[3]) + str(noms[1])
    elif i == 7:
        return str(noms[4]) + str(noms[2])


490
def tex_enonce_thales(noms, valeurs, arrondi):
Jérôme Ortais's avatar
Jérôme Ortais committed
491
    texte = \
492
        u'{Sur la figure ci-contre, les droites $(%s)$ et $(%s)$ sont parallèles.\\par\n' % \
Jérôme Ortais's avatar
Jérôme Ortais committed
493
494
495
        (lAB(noms[1:3]), lAB(noms[3:5]))
    liste = long_val(noms, valeurs)
    texte = texte + \
Louis's avatar
Louis committed
496
            'On donne $%s=\\SI{%s}{cm}$,$\\quad %s=\\SI{%s}{cm}$, $\\quad %s=\\SI{%s}{cm}\\quad$ et $\\quad %s~=~\\SI{%s}{cm}$.\\par\n' % \
497
            tuple(liste[0:8])
498
499
    texte = texte + 'Calculer $%s$ et $%s$, ' % tuple(liste[8:10])
    texte = texte + 'arrondies au %s}\n' % arrondi
Jérôme Ortais's avatar
Jérôme Ortais committed
500
501
502
503
    return texte


def tex_resolution_thales0(n, v):
504
    return u"""Dans le triangle $%s$,~ $%s$ est sur le côté $[%s]$,~
505
506
507
$%s$ est sur le côté $[%s]$ et les droites $(%s)$ et $(%s)$ sont
parallèles.\\par
D'après le \\textbf{théorème de Thalès} :
Jérôme Ortais's avatar
Jérôme Ortais committed
508
$\\qquad\\mathbf{\\cfrac{%s}{%s}=\\cfrac{%s}{%s}=\\cfrac{%s}{%s}}$""" % \
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
           (
               n[0] + n[1] + n[2],
               n[3],
               n[0] + n[1],
               n[4],
               n[0] + n[2],
               n[1] + n[2],
               n[3] + n[4],
               creer_noms(n, 0),
               creer_noms(n, 3),
               creer_noms(n, 1),
               creer_noms(n, 4),
               creer_noms(n, 2),
               creer_noms(n, 5),
           )
Jérôme Ortais's avatar
Jérôme Ortais committed
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539


def tex_resolution_thales1(n, v):
    r = v[8][0][0] % 3  # grand rapport
    if v[8][1] == 1:
        sgn = '+'
    else:
        sgn = '-'
    if v[r] and v[r + 3]:  # on connait les deux rapports
        donnees = 0
    elif v[r + 3]:

        # on connait  le petit rapport, mais pas le grand

        v[r] = v[r + 6] + v[r + 3] * v[8][1]
        donnees = (creer_noms(n, r), creer_noms(n, r + 6), sgn,
540
                   creer_noms(n, r + 3), decimaux(v[r], 1))
Jérôme Ortais's avatar
Jérôme Ortais committed
541
542
543
544
    else:
        v[r + 3] = (v[r] - v[r + 6]) * v[8][1]
        if sgn == '+':
            donnees = (creer_noms(n, r + 3), creer_noms(n, r), '-',
545
                       creer_noms(n, r + 6), decimaux(v[r + 3], 1))
Jérôme Ortais's avatar
Jérôme Ortais committed
546
547
        else:
            donnees = (creer_noms(n, r + 3), creer_noms(n, r + 6), '-',
548
                       creer_noms(n, r), decimaux(v[r + 3], 1))
Jérôme Ortais's avatar
Jérôme Ortais committed
549
    if donnees:
Louis's avatar
Louis committed
550
        #print(donnees)
Louis's avatar
Louis committed
551
        return '\\vspace{1ex}\\par De plus $%s=%s%s%s=\\SI{%s}{cm}$\n' % donnees
Jérôme Ortais's avatar
Jérôme Ortais committed
552
553
554
555
556
557
    else:
        return ''


def tex_resolution_thales2(n, v):
    donnees = []
558
    for i in range(3):
Jérôme Ortais's avatar
Jérôme Ortais committed
559
        if v[i]:
560
            donnees.append(decimaux(v[i], 1))
Jérôme Ortais's avatar
Jérôme Ortais committed
561
562
563
        else:
            donnees.append(creer_noms(n, i))
        if v[i + 3]:
564
            donnees.append(decimaux(v[i + 3], 1))
Jérôme Ortais's avatar
Jérôme Ortais committed
565
566
567
568
569
570
571
        else:
            donnees.append(creer_noms(n, i + 3))
    return '\\[\\frac{%s}{%s}=\\frac{%s}{%s}=\\frac{%s}{%s}\\]' % tuple(donnees)


def nom_ou_valeur(n, v, i):
    if v[i]:
572
        return decimaux(v[i], 1)
Jérôme Ortais's avatar
Jérôme Ortais committed
573
574
575
576
577
    else:
        return creer_noms(n, i)


def valeur_exacte(a, approx=3, unit=1):
578
    nb = decimaux(a, 1)
Jérôme Ortais's avatar
Jérôme Ortais committed
579
580
    if unit:
        if nb.count(',') and (len(nb) - nb.find(',')) - 1 > approx:
Louis's avatar
Louis committed
581
            return '\\simeq\\SI{' + decimaux(round(a, approx), 1) + '}{cm}'
Jérôme Ortais's avatar
Jérôme Ortais committed
582
        else:
Louis's avatar
Louis committed
583
            return '=\\SI{' + decimaux(a, 1) + '}{cm}'
Jérôme Ortais's avatar
Jérôme Ortais committed
584
585
    else:
        if nb.count(',') and (len(nb) - nb.find(',')) - 1 > approx:
586
            return '\\simeq' + decimaux(round(a, approx), 1)
Jérôme Ortais's avatar
Jérôme Ortais committed
587
        else:
588
            return '=' + decimaux(a, 1)
Jérôme Ortais's avatar
Jérôme Ortais committed
589
590


591
def tex_resolution_thales3(n, v, arrondi):
Jérôme Ortais's avatar
Jérôme Ortais committed
592
593
    r = v[8][0][0] % 3  # grand rapport
    donnees = []
594
    for i in range(3):
Jérôme Ortais's avatar
Jérôme Ortais committed
595
        if i != r:
596
597
            donnees.extend([nom_ou_valeur(n, v, r), nom_ou_valeur(n, v, r + 3), nom_ou_valeur(n, v, i),
                            nom_ou_valeur(n, v, i + 3)])
Jérôme Ortais's avatar
Jérôme Ortais committed
598
            if v[i]:  # on cherche i+3
599
                donnees.extend([creer_noms(n, i + 3), decimaux(v[i], 1), decimaux(v[r + 3], 1), decimaux(v[r], 1),
600
                                valeur_exacte(v[i] * v[r + 3] / v[r], approx=arrondi)])
Jérôme Ortais's avatar
Jérôme Ortais committed
601
            else:
602
                donnees.extend([creer_noms(n, i), decimaux(v[i + 3], 1), decimaux(v[r], 1), decimaux(v[r + 3], 1),
603
                                valeur_exacte(v[r] * v[i + 3] / v[r + 3], approx=arrondi)])
Jérôme Ortais's avatar
Jérôme Ortais committed
604
    texte = \
605
606
        '$\\cfrac{%s}{%s}=\\cfrac{%s}{%s}\\quad$ donc $\\quad \\boxed{%s=\\cfrac{%s\\times %s}{%s}%s}$\\par\n ' % tuple(
            donnees[0:9])
Jérôme Ortais's avatar
Jérôme Ortais committed
607
    texte = texte + \
608
609
            '$\\cfrac{%s}{%s}=\\cfrac{%s}{%s}\\quad$ donc $\\quad\\boxed{%s=\\cfrac{%s\\times %s}{%s}%s}$\\par\n' % tuple(
        donnees[9:18])
Jérôme Ortais's avatar
Jérôme Ortais committed
610
611
612
    return texte


613
# def pyromax(a):
Jérôme Ortais's avatar
Jérôme Ortais committed
614
615
616
617
618
619
620
#    maxi = a[0]
#    for i in xrange(len(a)):
#        if a[i] > maxi:
#            maxi = a[i]
#    return maxi
#
#
621
# def pyromin(a):
Jérôme Ortais's avatar
Jérôme Ortais committed
622
623
624
625
626
627
628
629
630
631
#    mini = a[0]
#    for i in xrange(len(a)):
#        if a[i] < mini:
#            mini = a[i]
#    return mini


def fig_thales(noms, valeurs):
    v = test_valeurs_thales(valeurs[0:8], valeurs[8][0], valeurs[8][1])
    type_thales = valeurs[8][1]
632
    angle = Decimal(int(100 * acos((v[0] ** 2 + v[1] ** 2 - v[2] ** 2) / (2 * v[0] * v[1])) * 180 / pi)) / 100
633
    v = [int(v[i] * 100) / 100 for i in range(8)]
634
635
636
637
638
    mini_x = int(100 * min(0, v[1] * cos(float(angle) * pi / 180), v[3] * type_thales,
                           (v[4] * cos(float(angle) * pi / 180)) * type_thales)) / 100 - 1.5
    mini_y = int(100 * min(0, v[4] * sin(float(angle) * pi / 180) * type_thales)) / 100 - 1.5
    maxi_x = int(100 * max(v[0], v[1] * cos(float(angle) * pi / 180))) / 100 + 1.5
    maxi_y = int(100 * v[1] * sin(float(angle) * pi / 180)) / 100 + .5
639
    echelle = int(400 / max(abs(mini_x) + maxi_x, abs(mini_y) + maxi_y)) / 100
Jérôme Ortais's avatar
Jérôme Ortais committed
640
    if type_thales == 1:
Louis's avatar
Louis committed
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
        return {
                "echelle": echelle,
                "angleA": 225,
                "angleC": angle + 45,
                "nomA": noms[0],
                "nomB": noms[1],
                "nomC": noms[2],
                "xB": v[0],
                "rC": v[1],
                "thetaC": angle,
                "angleb": - 45,
                "anglec": angle + 90,
                "nomb": noms[3],
                "nomc": noms[4],
                "xb": v[3],
                "rc": v[4],
                "thetac": angle,
            }
Jérôme Ortais's avatar
Jérôme Ortais committed
659
    else:
Louis's avatar
Louis committed
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
        return {
                "echelle": echelle,
                "angleA": 135,
                "angleC": angle + 45,
                "nomA": noms[0],
                "nomB": noms[1],
                "nomC": noms[2],
                "xB": v[0],
                "rC": v[1],
                "thetaC": angle,
                "angleb": 135,
                "anglec": angle + 180,
                "nomb": noms[3],
                "nomc": noms[4],
                "xb": - v[3],
                "rc": - v[4],
                "thetac": angle,
                }
Jérôme Ortais's avatar
Jérôme Ortais committed
678
679
680
681


def tex_fig_thales(noms, valeurs):
    donnees = fig_thales(noms, valeurs)
Louis's avatar
Louis committed
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
    return textwrap.dedent(r"""
        \figureadroite{{
        \begin{{tikzpicture}}[scale={echelle}, very thick]
            \coordinate (A) at (0, 0);
            \coordinate (B) at ({xB}, 0);
            \coordinate (C) at ({thetaC}:{rC});
            \coordinate (b) at ({xb}, 0);
            \coordinate (c) at ({thetac}:{rc});
            \draw[Maroon] (A) -- (b) -- (B);
            \draw[Maroon] (A) -- (c) -- (C);
            \draw[Maroon] (c) -- (b);
            \draw[Maroon] (C) -- (B);
            \path
                ($(A)+({angleA}:15em)$) node {{ {nomA} }}
                ($(B)+({angleb}:15em)$) node {{ {nomB} }}
                ($(C)+({angleC}:15em)$) node {{ {nomC} }}
                ($(b)+({angleb}:15em)$) node {{ {nomb} }}
                ($(c)+({anglec}:15em)$) node {{ {nomc} }}
                ;
        \end{{tikzpicture}}
        }}""").format(**donnees)
Jérôme Ortais's avatar
Jérôme Ortais committed
703
704
705
706
707
708

#
# ------------------- TRIGONOMETRIE -------------------
#


709
def _exo_trigo():
Jérôme Ortais's avatar
Jérôme Ortais committed
710
711
    exo = ["\\exercice"]
    cor = ["\\exercice*"]
Jérôme Ortais's avatar
Jérôme Ortais committed
712
    s = choix_points(6)
Jérôme Ortais's avatar
Jérôme Ortais committed
713
714
715
716
717
718
719
720
    n1 = cotes_sommets(s[0:3])
    n2 = cotes_sommets(s[3:6])
    v = valeurs_trigo()
    (l1, l2) = enonce_trigo(((s[0:3], n1, v[0]), (s[3:6], n2, v[1])))
    exo.extend(l1)
    cor.extend(l2)
    return (exo, cor)

721
722
723
class exo_trigo(LegacyExercise):
    """Cosinus d\'un angle aigu"""

724
725
726
727
728
    tags = [
        "Quatrième",
        "triangle",
        "trigonométrie",
    ]
729
    function = _exo_trigo
730

Jérôme Ortais's avatar
Jérôme Ortais committed
731
732
733
734

def enonce_trigo(v):
    (exo, cor) = ([], [])
    (l, lt) = ([], [])
735
    for j in range(2):
Jérôme Ortais's avatar
Jérôme Ortais committed
736
        f = (('\\sin', 1, 0), ('\\cos', 2, 0), ('\\tan', 1, 2))[v[j][2][0]]
737
        for i in range(2):
Jérôme Ortais's avatar
Jérôme Ortais committed
738
739
740
741
            l.append(v[j][1][f[i + 1]])
            l.append(v[j][2][i + 1])
        l.append(angle(v[j][0], 1))
        l.append(v[j][2][3])
742
    for j in range(2):
Jérôme Ortais's avatar
Jérôme Ortais committed
743
        tmp = []
744
        for i in range(3):
Jérôme Ortais's avatar
Jérôme Ortais committed
745
746
            if len(l[2 * i + 6 * j]) < 3:
                if l[2 * i + 6 * j + 1]:
Louis's avatar
Louis committed
747
                    lt.append('$%s=\\SI{%s}{cm}$' % (l[2 * i + 6 * j],
748
                                                       decimaux(l[2 * i + 6 * j + 1], 1)))
Jérôme Ortais's avatar
Jérôme Ortais committed
749
750
751
                else:
                    tmp = 'la longueur $%s$' % l[2 * i + 6 * j]
            elif l[2 * i + 6 * j + 1]:
752
                lt.append('$%s=\\ang{%s}$' % (l[2 * i + 6 * j], l[2 * i +
753
                                                                   6 * j + 1]))
Jérôme Ortais's avatar
Jérôme Ortais committed
754
755
756
757
758
            else:
                lt.append('la mesure de l\'angle $%s$' % l[2 * i + 6 * j])
        if tmp:
            lt.append(tmp)
    exo.append('\\begin{multicols}{2}')
759
    exo.append('\\begin{enumerate}')
Jérôme Ortais's avatar
Jérôme Ortais committed
760
    cor.append('\\begin{multicols}{2}')
761
    cor.append('\\begin{enumerate}')
762
763
    arrondi = random.randrange(1, 4)
    text_arrondi = ['dix', 'cent', 'mill'][arrondi - 1] + u'ième'
Jérôme Ortais's avatar
Jérôme Ortais committed
764
    tr = nom_triangle(v[0][0])
765
    exo.append('\\item $%s$ est un triangle rectangle en $%s$ tel que :\\par' %
Jérôme Ortais's avatar
Jérôme Ortais committed
766
               (tr, v[0][0][0]))
767
768
    exo.append('%s et %s.\\par\nCalculer %s, arrondie au %s.\\par' % tuple(lt[0:3] + [text_arrondi]))
    cor.append('\\item $%s$ est un triangle rectangle en $%s$ tel que :\\par' %
Jérôme Ortais's avatar
Jérôme Ortais committed
769
               (tr, v[0][0][0]))
770
    cor.append('%s et %s.\\par\nCalculer %s, arrondie au %s.\\par' % tuple(lt[0:3] + [text_arrondi]))
771
    cor.append('Dans le triangle $%s$ rectangle en $%s$,' % (tr, v[0][0][0]))  # résolution
Jérôme Ortais's avatar
Jérôme Ortais committed
772
773
    v2 = (v[0][1], v[0][2])
    l2 = l[0:6]
774
    cor.extend(resolution_trigo(v2, l2, arrondi))
Jérôme Ortais's avatar
Jérôme Ortais committed
775
    tr = nom_triangle(v[1][0])
776
777
    exo.append('\\columnbreak')
    cor.append('\\columnbreak')
778
779
780
    arrondi = random.randrange(1, 4)
    text_arrondi = ['dix', 'cent', 'mill'][arrondi - 1] + u'ième'
    exo.append('\\item $%s$ est un triangle rectangle en $%s$ tel que :\\par' %
Jérôme Ortais's avatar
Jérôme Ortais committed
781
               (tr, v[1][0][0]))
782
    exo.append('''%s et %s.\\par
783
784
785
Calculer %s, arrondie au %s.\\par''' %
               tuple(lt[3:6] + [text_arrondi]))
    cor.append('\\item $%s$ est un triangle rectangle en $%s$ tel que :\\par' %
Jérôme Ortais's avatar
Jérôme Ortais committed
786
               (tr, v[1][0][0]))
787
    cor.append('%s et %s.\\par\nCalculer %s, arrondie au %s.\\par' % tuple(lt[3:6] + [text_arrondi]))
788
    #    cor.append("""\\dotfill{}\\par\\vspace{2ex}")
789
    cor.append('Dans le triangle $%s$ rectangle en $%s$,' % (tr, v[1][0][0]))  # résolution
Jérôme Ortais's avatar
Jérôme Ortais committed
790
791
    v2 = (v[1][1], v[1][2])
    l2 = l[6:12]
792
    cor.extend(resolution_trigo(v2, l2, arrondi))
793
    exo.append('\\end{enumerate}')
Jérôme Ortais's avatar
Jérôme Ortais committed
794
    exo.append('\\end{multicols}')
795
    cor.append('\\end{enumerate}')
Jérôme Ortais's avatar
Jérôme Ortais committed
796
797
798
799
    cor.append('\\end{multicols}')
    return (exo, cor)


800
def resolution_trigo(v2, l2, arrondi):
Jérôme Ortais's avatar
Jérôme Ortais committed
801
802
    cor = []
    f = (('\\sin', 1, 0), ('\\cos', 2, 0), ('\\tan', 1, 2))[v2[1][0]]
803
    cor.append('\\[ %s%s=\\cfrac{%s}{%s} \\]' % (f[0], l2[4], v2[0][f[1]],
804
                                                 v2[0][f[2]]))
Jérôme Ortais's avatar
Jérôme Ortais committed
805
    if not v2[1][3]:
806
        cor.append('\\[ %s%s=\\cfrac{%s}{%s} \\]' % (f[0], l2[4],
807
                                                     decimaux(v2[1][1], 1), decimaux(v2[1][2], 1)))
Jérôme Ortais's avatar
Jérôme Ortais committed
808
        if f[0] == '\\sin':
809
            r = asin(v2[1][1] / v2[1][2]) * 180 / pi
Jérôme Ortais's avatar
Jérôme Ortais committed
810
        elif f[0] == '\\cos':
811
            r = acos(v2[1][1] / v2[1][2]) * 180 / pi
Jérôme Ortais's avatar
Jérôme Ortais committed
812
        else:
813
            r = atan(v2[1][1] / v2[1][2]) * 180 / pi
814
        cor.append(r'\[ \boxed{%s=%s^{-1}\left(\cfrac{%s}{%s}\right) \\ang{%s}} \]' %
815
                   (l2[4], f[0], decimaux(v2[1][1], 1), decimaux(v2[1][2], 1),
816
                    valeur_exacte(r, approx=arrondi, unit=0)))
Jérôme Ortais's avatar
Jérôme Ortais committed
817
    elif not v2[1][1]:
818
        cor.append('\\[ %s%s=\\cfrac{%s}{%s} \\]' % (f[0], v2[1][3],
819
                                                     v2[0][f[1]], decimaux(v2[1][2], 1)))
Jérôme Ortais's avatar
Jérôme Ortais committed
820
        if f[0] == '\\sin':
821
            r = sin(v2[1][3] * pi / 180)
Jérôme Ortais's avatar
Jérôme Ortais committed
822
        elif f[0] == '\\cos':
823
            r = cos(v2[1][3] * pi / 180)
Jérôme Ortais's avatar
Jérôme Ortais committed
824
        else:
825
            r = tan(v2[1][3] * pi / 180)
Jérôme Ortais's avatar
Jérôme Ortais committed
826
        r = r * v2[1][2]
827
        cor.append(r'\[ \boxed{%s=%s%s\times %s %s} \]' %
828
                   (v2[0][f[1]], f[0], v2[1][3], decimaux(v2[1][2], 1),
829
                    valeur_exacte(r, approx=arrondi)))
Jérôme Ortais's avatar
Jérôme Ortais committed
830
    else:
831
        cor.append('\\[ %s%s=\\cfrac{%s}{%s} \\]' % (f[0], v2[1][3],
832
                                                     decimaux(v2[1][1], 1), v2[0][f[2]]))
Jérôme Ortais's avatar
Jérôme Ortais committed
833
        if f[0] == '\\sin':
834
            r = sin(v2[1][3] * pi / 180)
Jérôme Ortais's avatar
Jérôme Ortais committed
835
        elif f[0] == '\\cos':
836
            r = cos(v2[1][3] * pi / 180)
Jérôme Ortais's avatar
Jérôme Ortais committed
837
        else:
838
839
            r = tan(v2[1][3] * pi / 180)
        r = v2[1][1] / r
840
        cor.append(r'\[ \boxed{%s=\cfrac{%s}{%s%s} %s} \]' %
841
                   (v2[0][f[2]], decimaux(v2[1][1], 1), f[0], v2[1][3],
842
                    valeur_exacte(r, approx=arrondi)))
Jérôme Ortais's avatar
Jérôme Ortais committed
843
844
845
    return cor


846
847
def angle(s,
          n):  # renvoie \\widehat{ABC} où s est la liste des 3 sommets du triangle et n est le rang du sommet de l'angle dans cette liste
Jérôme Ortais's avatar
Jérôme Ortais committed
848
849
850
851
    return '\\widehat{%s%s%s}' % (s[(n + 2) % 3], s[n], s[(n + 1) % 3])


def valeurs_trigo():
852
    l = [random.randrange(10, 121) / 10 for dummy in range(3)]
Jérôme Ortais's avatar
Jérôme Ortais committed
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
    l.sort()
    l.append(random.randrange(15, 76))
    trigo = 1
    if random.randrange(2):  # on choisit en 1er une longueur et un angle
        if random.randrange(2):  # on connait la première des deux longueurs
            v = (trigo, l[0], 0, l[3])
        else:
            v = (trigo, 0, l[0], l[3])
        v = (v, (trigo, l[1], l[2], 0))
    else:

        # on choisit en 1er deux longueurs

        v = (trigo, l[1], l[2], 0)
        if random.randrange(2):  # on connait la première des deux longueurs
            v = (v, (trigo, l[0], 0, l[3]))
        else:
            v = (v, (trigo, 0, l[0], l[3]))
    return v
872

Louis's avatar
Louis committed
873
# TODO: utils/pyromaths generate exo_thales:1 plante sur l'arcos (ligne 605)