source: pyromaths/trunk/fuentes/src/pyromaths/ex/quatriemes/geometrie.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: 30.3 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#
23import random
24from math import acos, asin, atan, pi, sin, cos, tan
25
26from pyromaths.outils.Geometrie import couples_pythagore, choix_points
27
28
29#
30# ------------------- THEOREME DE PYTHAGORE -------------------
31def fig_tr_rect(lg):
32    # renvoie les angles au centre des trois sommets du triangle ABC rectange en C
33    a = random.randrange(360)
34    if a < 180:
35        b = a + 180
36    else:
37        b = a - 180
38    c = (int((180 - ((2 * acos((lg[1] * 1.0) / lg[2])) * 180) / pi) *
39         100) * 1.0) / 100 + a
40    if c < 0:
41        c = c + 360
42    return (str(a), str(b), str(c))
43
44
45def enonce_pythagore(noms, angles, longueurs, cotes, nom_tr, long0,
46                     long1, diam=0):
47    if diam:
48        return (
49            noms[0],
50            angles[0],
51            angles[0],
52            noms[1],
53            angles[1],
54            angles[1],
55            noms[2],
56            angles[2],
57            angles[2],
58            int(float(angles[0]) - 90),
59            cotes[2],
60            noms[2],
61            cotes[long0],
62            nombre(longueurs[long0]),
63            cotes[long1],
64            nombre(longueurs[long1]),
65            cotes[(3 - long0) - long1],
66            )
67    else:
68        return (
69            nom_tr,
70            noms[2],
71            cotes[long0],
72            nombre(longueurs[long0]),
73            cotes[long1],
74            nombre(longueurs[long1]),
75            cotes[(3 - long0) - long1],
76            )
77
78
79def exo_pythagore():
80    types_exercice = [[2, random.randrange(2)], [0, 1]]
81    random.shuffle(types_exercice)
82    random.shuffle(types_exercice[0])
83    random.shuffle(types_exercice[1])
84    exo = ["\\exercice\n\\begin{multicols}{2}\n  \\begin{enumerate}"]
85    cor = ["\\exercice*\n\\begin{multicols}{2}\n  \\begin{enumerate}"]
86    for j in range(2):
87        while True:
88            longueurs = couples_pythagore[random.randrange(len(couples_pythagore))]
89            longueurs = [longueurs[i] / 10.0 for i in range(3)]
90            if inegalite_triangulaire(longueurs):
91                break
92        noms = choix_points(3)
93        angles = fig_tr_rect(longueurs)
94        nom_tr = nom_triangle(noms)
95        long0 , long1 = types_exercice[j]
96        cotes = cotes_sommets(noms)
97        enonce = \
98            """    \\item Soit $%s$ un triangle rectangle en $%s$ tel que :\\par
99$%s=\\unit[%s]{cm}$ et $%s=\\unit[%s]{cm}$.\\par
100Calculer la longueur $%s$.""" % \
101            enonce_pythagore(noms, angles, longueurs, cotes, nom_tr, long0,
102                             long1)
103        exo.append(enonce)
104        cor.append(enonce)
105        cor.append("\\par\\dotfill{}\\par\n")
106        cor.append(u"Le triangle $%s$ est rectangle en $%s$.\\par" % \
107                   (nom_tr, noms[2]))
108        cor.append(u"Son hypoténuse est $[%s]$.\\par" % (cotes[2]))
109        cor.append(u"D'après le \\textbf{théorème de Pythagore} :")
110        cor.append("\\[%s^2=%s^2+%s^2\\]" % (cotes[2], cotes[0], cotes[1]))
111        if long0 == 2 or long1 == 2:
112            cor.append("\\[%s^2=%s^2-%s^2\\kern1cm\\text{(On cherche }%s)\\]" %
113                       (cotes[(3 - long0) - long1], cotes[2], cotes[((4 -
114                       long0) - long1) % 2], cotes[(3 - long0) - long1]))
115        if long0 == 2 or long1 == 2:
116            cor.append("\\[%s^2=%s^2-%s^2\\]" % (cotes[(3 - long0) - long1],
117                       nombre(longueurs[2]), nombre(longueurs[((4 - long0) -
118                       long1) % 2])))
119        else:
120            cor.append("\\[%s^2=%s^2+%s^2\\]" % (cotes[2], nombre(longueurs[0]),
121                       nombre(longueurs[1])))
122        if long0 == 2 or long1 == 2:
123            cor.append("\\[%s^2=%s-%s\\]" % (cotes[(3 - long0) - long1],
124                       nombre(longueurs[2] ** 2), nombre(longueurs[((4 -
125                       long0) - long1) % 2] ** 2)))
126        else:
127            cor.append("\\[%s^2=%s+%s\\]" % (cotes[2], nombre(longueurs[0] **
128                       2), nombre(longueurs[1] ** 2)))
129        if long0 == 2 or long1 == 2:
130            cor.append("\\[%s^2=%s\\]" % (cotes[(3 - long0) - long1],
131                       nombre(longueurs[2] ** 2 - longueurs[((4 - long0) -
132                       long1) % 2] ** 2)))
133        else:
134            cor.append("\\[%s^2=%s\\]" % (cotes[2], nombre(longueurs[0] **
135                       2 + longueurs[1] ** 2)))
136        if long0 == 2 or long1 == 2:
137            cor.append("\\[ \\boxed{\\text{Donc }%s=\\sqrt{%s}=\\unit[%s]{cm}}\\]" %
138                       (cotes[(3 - long0) - long1], nombre(longueurs[2] ** 2 -
139                       longueurs[((4 - long0) - long1) % 2] ** 2), nombre(longueurs[(3 -
140                       long0) - long1])))
141        else:
142            cor.append("\\[\\boxed{\\text{Donc }%s=\\sqrt{%s}=\\unit[%s]{cm}}\\]" %
143                       (cotes[2], nombre(longueurs[0] ** 2 + longueurs[1] **
144                       2), nombre(longueurs[2])))
145        if j == 0:
146            exo.append("\\columnbreak")
147            cor.append("\\columnbreak")
148    exo.append("\\end{enumerate}\n\\end{multicols}\n")
149    cor.append("\\end{enumerate}\n\\end{multicols}\n")
150    return (exo, cor)
151
152exo_pythagore.description = u'Théorème de Pythagore'
153
154
155def nom_triangle(noms):  # renvoie le nom du triangle dans un ordre aleatoire
156    a = random.randrange(3)
157    b = (random.randrange(2) + 1 + a) % 3
158    c = (3 - a) - b
159    return '%s%s%s' % (noms[a], noms[b], noms[c])
160
161
162def cotes_sommets(noms):  # renvoie les noms des 3 cotes du triangle en finissant par l'hypotenuse
163    return (noms[1] + noms[2], noms[0] + noms[2], noms[0] + noms[1])
164
165
166#
167# ------------------- CERCLE ET THEOREME DE PYTHAGORE -------------------
168#
169
170
171def exo_triangle_cercle():
172    exo = ["\\exercice"]
173    cor = ["\\exercice*"]
174    while True:
175        longueurs = couples_pythagore[random.randrange(len(couples_pythagore))]
176        longueurs = [longueurs[i] / 10.0 for i in range(3)]
177        if inegalite_triangulaire(longueurs):
178            break
179    noms = choix_points(3)
180    angles = fig_tr_rect(longueurs)
181    nom_tr = nom_triangle(noms)
182    long0 = random.randrange(3)
183    long1 = (random.randrange(2) + 1 + long0) % 3
184    cotes = cotes_sommets(noms)
185    enonce = \
186        u"""\\begin{minipage}{4cm}
187\\begin{pspicture}(-2,-2)(2,2)
188\\SpecialCoor\\psset{PointSymbol=none}
189\\pstGeonode[PointName=%s,PosAngle=%s](1.5;%s){a}
190\\pstGeonode[PointName=%s,PosAngle=%s](1.5;%s){b}
191\\pstGeonode[PointName=%s,PosAngle=%s](1.5;%s){c}
192\\pspolygon(a)(b)(c)\\pscircle(0,0){1.5}
193\\rput(1.8;%s){$\\big(\\mathcal{C}\\big)$}
194\\end{pspicture}
195\\end{minipage}\\hfill
196\\begin{minipage}{13cm}
197$\\big(\\mathcal{C}\\big)$ est un cercle de diamètre $[%s]$ et $%s$ est un point de $\\big(\\mathcal{C}\\big)$.\\par
198On donne $%s=\\unit[%s]{cm}$ et $%s=\\unit[%s]{cm}$.\\par
199Calculer la longueur $%s$.""" % \
200        enonce_pythagore(noms, angles, longueurs, cotes, nom_tr, long0,
201                         long1, diam=1)
202    exo.append(enonce)
203    cor.append(enonce)
204    cor.append("\\par\\dotfill{}\\\\\n")
205    cor.append(u"$[%s]$ est le diamètre du cercle circonscrit au triangle $%s$.\\par" %
206               (cotes[2], nom_tr))
207    cor.append("\\fbox{Donc le triangle %s est rectangle en %s.}\\\\\n" %
208               (nom_tr, noms[2]))
209    cor.append(u"D'après le \\textbf{théorème de Pythagore} :")
210    cor.append(u"\\[%s^2=%s^2+%s^2\\kern1cm\\text{(car }[%s]\\text{ est \\emph{l'hypoténuse})}\\]" %
211               (cotes[2], cotes[0], cotes[1], cotes[2]))
212    if long0 == 2 or long1 == 2:
213        cor.append("\\[%s^2=%s^2-%s^2\\kern1cm\\text{(On cherche }%s)\\]" %
214                   (cotes[(3 - long0) - long1], cotes[2], cotes[((4 -
215                   long0) - long1) % 2], cotes[(3 - long0) - long1]))
216    if long0 == 2 or long1 == 2:
217        cor.append("\\[%s^2=%s^2-%s^2\\]" % (cotes[(3 - long0) - long1],
218                   nombre(longueurs[2]), nombre(longueurs[((4 - long0) -
219                   long1) % 2])))
220    else:
221        cor.append("\\[%s^2=%s^2+%s^2\\]" % (cotes[2], nombre(longueurs[0]),
222                   nombre(longueurs[1])))
223    if long0 == 2 or long1 == 2:
224        cor.append("\\[%s^2=%s-%s\\]" % (cotes[(3 - long0) - long1],
225                   nombre(longueurs[2] ** 2), nombre(longueurs[((4 -
226                   long0) - long1) % 2] ** 2)))
227    else:
228        cor.append("\\[%s^2=%s+%s\\]" % (cotes[2], nombre(longueurs[0] **
229                   2), nombre(longueurs[1] ** 2)))
230    if long0 == 2 or long1 == 2:
231        cor.append("\\[%s^2=%s\\]" % (cotes[(3 - long0) - long1],
232                   nombre(longueurs[2] ** 2 - longueurs[((4 - long0) -
233                   long1) % 2] ** 2)))
234    else:
235        cor.append("\\[%s^2=%s\\]" % (cotes[2], nombre(longueurs[0] **
236                   2 + longueurs[1] ** 2)))
237    if long0 == 2 or long1 == 2:
238        cor.append("\\[\\boxed{\\text{Donc }%s=\\sqrt{%s}=\\unit[%s]{cm}}\\]" %
239                   (cotes[(3 - long0) - long1], nombre(longueurs[2] ** 2 -
240                   longueurs[((4 - long0) - long1) % 2] ** 2), nombre(longueurs[(3 -
241                   long0) - long1])))
242    else:
243        cor.append("\\[\\boxed{\\text{Donc }%s=\\sqrt{%s}=\\unit[%s]{cm}}\\]" %
244                   (cotes[2], nombre(longueurs[0] ** 2 + longueurs[1] **
245                   2), nombre(longueurs[2])))
246    exo.append("\\end{minipage}\n")
247    cor.append("\\end{minipage}\n")
248    return (exo, cor)
249
250exo_triangle_cercle.description = u'Cercle et théorème de Pythagore'
251
252
253#
254# ------------------- RECIPROQUE DU THEOREME DE PYTHAGORE -------------------
255#
256
257
258def exo_reciproque_pythagore():
259    exo = ["\\exercice"]
260    cor = ["\\exercice*"]
261    while True:
262        longueurs = couples_pythagore[random.randrange(len(couples_pythagore))]
263        longueurs = [longueurs[i] / 10.0 for i in range(3)]
264        if inegalite_triangulaire(longueurs):
265            break
266    noms = choix_points(3)
267    nom_tr = nom_triangle(noms)
268    l = [i for i in range(3)]
269    n = [l.pop(random.randrange(3 - i)) for i in range(3)]
270    c = cotes_sommets(noms)
271    recip = (nom_tr, c[n[0]], nombre(longueurs[n[0]]), c[n[1]], nombre(longueurs[n[1]]),
272             c[n[2]], nombre(longueurs[n[2]]), nom_tr)
273    enonce = \
274        """Soit $%s$ un triangle tel que : $\\quad %s=\\unit[%s]{cm}\\quad$, $\\quad %s=\\unit[%s]{cm}\\quad$ et $\\quad %s=\\unit[%s]{cm}$.\\par
275Quelle est la nature du triangle $%s$?
276""" % \
277        recip
278    exo.append(enonce)
279    cor.append(enonce)
280    cor.append("\\par\\dotfill{}\\\\\n")
281    cor.append(u"Le triangle %s n'est ni isocèle, ni équilatéral.\\par\n" %
282               nom_tr)
283    cor.append("$\\left.")
284    cor.append("\\renewcommand{\\arraystretch}{2}")
285    cor.append("\\begin{array}{l}")
286
287    cor.append(u"\\bullet %s^2=%s^2=%s\\qquad\\text{(}[%s]\\text{ est le plus grand côté.)}\\\\\n" %
288               (c[2], nombre(longueurs[2]), nombre(longueurs[2] ** 2), c[2]))
289    cor.append("\\bullet  %s^2+%s^2=%s^2+%s^2=%s \n" % (c[0], c[1],
290               nombre(longueurs[0]), nombre(longueurs[1]), nombre(longueurs[0] **
291               2 + longueurs[1] ** 2)))
292    cor.append("\\end{array}")
293    cor.append("\\right\\rbrace$")
294    cor.append(u"""Donc $%s^2=%s^2+%s^2$.\\par
295D'après la \\textbf{réciproque du théorème de Pythagore},
296\\fbox{le triangle $%s$ est rectangle en $%s$.}""" %
297               (c[2], c[0], c[1], nom_tr, noms[2]))
298    return (exo, cor)
299
300exo_reciproque_pythagore.description = u'Réciproque du théorème de Pythagore'
301
302
303#
304# ------------------- THEOREME DE THALES -------------------
305#
306
307
308def valeurs_thales(pyromax):
309    liste = [0, 0, 0, 0, 0, 0, 0, 0]
310    while liste == [0, 0, 0, 0, 0, 0, 0, 0]:
311        for i in range(3):
312            liste[i] = random.randrange(2)
313    a = random.randrange(liste.count(1))
314    for i in range(3):
315        if liste[i]:
316            if not a:
317                liste[i + 3] = 1
318            a = a - 1
319        else:
320            liste[i + 3] = 1  # on doit connaitre le numeratuer ou le denominateur
321    for i in range(2):  # AB et AE  ou  AB et BE  ou  AE et EB
322        if liste[i] and liste[i + 3]:  # i est le rapport complet. On choisit une des 3 formes ci-dessus
323            a = random.randrange(2)
324            liste[i + 6] = 1
325            liste[i + 3 * a] = 0
326            rapport = [i + 3 * ((a + 1) % 3), i + 3 * ((a + 2) % 3)]
327            rapport.sort()
328    if liste[2] and liste[5]:
329        rapport = [2, 5]
330    valeurs = [0, 0, 0, 0, 0, 0, 0, 0]
331    for i in range(3):
332        if liste[i]:
333            valeurs[i] = random.randrange(15, pyromax) / 10.0
334        if liste[i + 3] and liste[i]:
335            valeurs[i + 3] = random.randrange(5, valeurs[i] * 10 - 9) / \
336                10.0
337        elif liste[i + 3]:
338            valeurs[i + 3] = random.randrange(5, pyromax) / 10.0
339    if liste[6]:
340        valeurs[6] = random.randrange(5, pyromax) / 10.0
341    if liste[7]:
342        valeurs[7] = random.randrange(5, pyromax) / 10.0
343
344    #--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
345    # type_thales=valeur_alea(-1,1) # -1 si papillon, 1 si triangle
346
347    type_thales = 1
348    valeurs.append((rapport, type_thales))
349    if test_valeurs_thales(valeurs, rapport, type_thales):
350        return valeurs
351    else:
352        return 0
353
354
355def test_valeurs_thales(valeurs, rapport, type_thales):
356    v = [valeurs[i] for i in range(8)]
357    if rapport[0] // 3 == 0 and rapport[1] // 3 == 2:  # On donne AB et EB
358        v[rapport[0] + 3] = (v[rapport[0]] - v[rapport[1]]) * \
359            type_thales
360    elif rapport[0] // 3 == 1 and rapport[1] // 3 == 2:
361
362                                                # On donne AE et EB
363
364        v[rapport[0] - 3] = v[rapport[0]] * type_thales + v[rapport[1]]
365    if v[rapport[0] % 3]:  # rapport est AE/AB
366        rapp = (v[rapport[0] % 3 + 3] * 1.0) / v[rapport[0] % 3]
367    else:
368        rapp = 0
369    for i in range(3):
370        if not v[i] and rapp:
371            v[i] = v[i + 3] / rapp
372        elif not v[i + 3]:
373            v[i + 3] = v[i] * rapp
374    if inegalite_triangulaire(v[0:3]) and inegalite_triangulaire(v[3:6]) and \
375        .3 < rapp < .7:
376        return v
377    else:
378        return 0
379
380
381def inegalite_triangulaire(a):  # renvoie 1 si c'est un triangle, 0 sinon
382    vrai = 0
383    coef = 1.2  # evite les triangles trop ecrases
384    if a[0] > a[1] and a[0] > a[2]:
385        if a[1] + a[2] > coef * a[0]:
386            vrai = 1
387    elif a[1] > a[0] and a[1] > a[2]:
388        if a[0] + a[2] > coef * a[1]:
389            vrai = 1
390    elif a[2] > a[0] and a[2] > a[1]:
391        if a[0] + a[1] > coef * a[2]:
392            vrai = 1
393    return vrai
394
395
396def exo_thales():
397    exo = ["\\exercice"]
398    cor = ["\\exercice*"]
399    noms = choix_points(5)  # les noms des sommets
400    arrondi = random.randrange(1, 4)
401    text_arrondi = ['dix', 'cent', 'mill'][arrondi - 1] + u'ième'
402    while True:
403        valeurs = valeurs_thales(70)  # les longueurs en mm
404        if valeurs:
405            break
406    exo.append(tex_fig_thales(noms, valeurs))
407    exo.append(tex_enonce_thales(noms, valeurs, text_arrondi))
408    cor.append(tex_fig_thales(noms, valeurs))
409    cor.append(tex_enonce_thales(noms, valeurs, text_arrondi))
410    cor.append(tex_resolution_thales0(noms, valeurs))
411    cor.append(tex_resolution_thales1(noms, valeurs))
412    cor.append(tex_resolution_thales2(noms, valeurs))
413    cor.append(tex_resolution_thales3(noms, valeurs, arrondi))
414    return (exo, cor)
415
416exo_thales.description = u'Théorème de Thalès'
417
418
419def long_val(noms, valeurs):  # renvoie un tuple contenant les noms des segments et leur longueur puis les noms des longueurs a calculer
420    liste = []
421    for i in range(8):
422        if valeurs[i]:
423            liste.append(creer_noms(noms, i))
424            liste.append(nombre(valeurs[i]))
425    for i in range(6):
426        if not valeurs[i] and valeurs[8][0][0] % 3 != i % 3:
427            liste.append(creer_noms(noms, i))
428    return liste
429
430
431def lAB(a):  # renvoie AB
432    return str(a[0]) + str(a[1])
433
434
435def nombre(a):
436    texte = str(a).replace('.', ',')
437    if a >= 1000 or a <= 0.0001:
438        return '\\nombre{%s}' % texte
439    else:
440        if texte.count(',') and len(texte) - texte.find(',0') == 2:
441            return texte.replace(',', '{,}').replace('{,}0', '')
442        elif texte.count(','):
443            return texte.replace(',', '{,}')
444        else:
445            return texte
446
447
448def creer_noms(noms, i):
449    if i == 0:
450        return str(noms[0]) + str(noms[1])
451    elif i == 1:
452        return str(noms[0]) + str(noms[2])
453    elif i == 2:
454        return str(noms[1]) + str(noms[2])
455    elif i == 3:
456        return str(noms[0]) + str(noms[3])
457    elif i == 4:
458        return str(noms[0]) + str(noms[4])
459    elif i == 5:
460        return str(noms[3]) + str(noms[4])
461    elif i == 6:
462        return str(noms[3]) + str(noms[1])
463    elif i == 7:
464        return str(noms[4]) + str(noms[2])
465
466
467def tex_enonce_thales(noms, valeurs, arrondi):
468    texte = \
469        u'{Sur la figure ci-contre, les droites $(%s)$ et $(%s)$ sont parallèles.\\par\n' % \
470        (lAB(noms[1:3]), lAB(noms[3:5]))
471    liste = long_val(noms, valeurs)
472    texte = texte + \
473        'On donne $%s=\\unit[%s]{cm}$,$\\quad %s=\\unit[%s]{cm}$, $\\quad %s=\\unit[%s]{cm}\\quad$ et $\\quad %s~=~\\unit[%s]{cm}$.\\par\n' % \
474        tuple(liste[0:8])
475    texte = texte + 'Calculer $%s$ et $%s$, ' % tuple(liste[8:10])
476    texte = texte + 'arrondies au %s}\n' % arrondi
477    return texte
478
479
480def tex_resolution_thales0(n, v):
481    return u"""Dans le triangle $%s$,~ $%s$ est sur le côté $[%s]$,~
482$%s$ est sur le côté $[%s]$ et les droites $(%s)$ et $(%s)$ sont
483parallèles.\\par
484D'après le \\textbf{théorème de Thalès} :
485$\\qquad\\mathbf{\\cfrac{%s}{%s}=\\cfrac{%s}{%s}=\\cfrac{%s}{%s}}$""" % \
486        (
487        n[0] + n[1] + n[2],
488        n[3],
489        n[0] + n[1],
490        n[4],
491        n[0] + n[2],
492        n[1] + n[2],
493        n[3] + n[4],
494        creer_noms(n, 0),
495        creer_noms(n, 3),
496        creer_noms(n, 1),
497        creer_noms(n, 4),
498        creer_noms(n, 2),
499        creer_noms(n, 5),
500        )
501
502
503def tex_resolution_thales1(n, v):
504    r = v[8][0][0] % 3  # grand rapport
505    if v[8][1] == 1:
506        sgn = '+'
507    else:
508        sgn = '-'
509    if v[r] and v[r + 3]:  # on connait les deux rapports
510        donnees = 0
511    elif v[r + 3]:
512
513        # on connait  le petit rapport, mais pas le grand
514
515        v[r] = v[r + 6] + v[r + 3] * v[8][1]
516        donnees = (creer_noms(n, r), creer_noms(n, r + 6), sgn,
517                   creer_noms(n, r + 3), nombre(v[r]))
518    else:
519        v[r + 3] = (v[r] - v[r + 6]) * v[8][1]
520        if sgn == '+':
521            donnees = (creer_noms(n, r + 3), creer_noms(n, r), '-',
522                       creer_noms(n, r + 6), nombre(v[r + 3]))
523        else:
524            donnees = (creer_noms(n, r + 3), creer_noms(n, r + 6), '-',
525                       creer_noms(n, r), nombre(v[r + 3]))
526    if donnees:
527        return '\\vspace{1ex}\\par De plus $%s=%s%s%s=\\unit[%s]{cm}$\n' % \
528            donnees
529    else:
530        return ''
531
532
533def tex_resolution_thales2(n, v):
534    donnees = []
535    for i in range(3):
536        if v[i]:
537            donnees.append(nombre(v[i]))
538        else:
539            donnees.append(creer_noms(n, i))
540        if v[i + 3]:
541            donnees.append(nombre(v[i + 3]))
542        else:
543            donnees.append(creer_noms(n, i + 3))
544    return '\\[\\frac{%s}{%s}=\\frac{%s}{%s}=\\frac{%s}{%s}\\]' % tuple(donnees)
545
546
547def nom_ou_valeur(n, v, i):
548    if v[i]:
549        return nombre(v[i])
550    else:
551        return creer_noms(n, i)
552
553
554def valeur_exacte(a, approx=3, unit=1):
555    nb = nombre(a)
556    if unit:
557        if nb.count(',') and (len(nb) - nb.find(',')) - 1 > approx:
558            return '\\simeq\\unit[' + nombre(round(a, approx)) + ']{cm}'
559        else:
560            return '=\\unit[' + nombre(a) + ']{cm}'
561    else:
562        if nb.count(',') and (len(nb) - nb.find(',')) - 1 > approx:
563            return '\\simeq' + nombre(round(a, approx))
564        else:
565            return '=' + nombre(a)
566
567
568def tex_resolution_thales3(n, v, arrondi):
569    r = v[8][0][0] % 3  # grand rapport
570    donnees = []
571    for i in range(3):
572        if i != r:
573            donnees.extend([nom_ou_valeur(n, v, r), nom_ou_valeur(n, v,
574                           r + 3), nom_ou_valeur(n, v, i), nom_ou_valeur(n,
575                           v, i + 3)])
576            if v[i]:  # on cherche i+3
577                donnees.extend([creer_noms(n, i + 3), nombre(v[i]),
578                               nombre(v[r + 3]), nombre(v[r]),
579                               valeur_exacte(((v[i] * 1.0) * v[r + 3]) /
580                               v[r], approx=arrondi)])
581            else:
582                donnees.extend([creer_noms(n, i), nombre(v[i + 3]),
583                               nombre(v[r]), nombre(v[r + 3]),
584                               valeur_exacte(((v[r] * 1.0) * v[i + 3]) /
585                               v[r + 3], approx=arrondi)])
586    texte = \
587        '$\\cfrac{%s}{%s}=\\cfrac{%s}{%s}\\quad$ donc $\\quad \\boxed{%s=\\cfrac{%s\\times %s}{%s}%s}$\\par\n ' % tuple(donnees[0:9])
588    texte = texte + \
589        '$\\cfrac{%s}{%s}=\\cfrac{%s}{%s}\\quad$ donc $\\quad\\boxed{%s=\\cfrac{%s\\times %s}{%s}%s}$\\par\n' % tuple(donnees[9:18])
590    return texte
591
592
593# def pyromax(a):
594#    maxi = a[0]
595#    for i in xrange(len(a)):
596#        if a[i] > maxi:
597#            maxi = a[i]
598#    return maxi
599#
600#
601# def pyromin(a):
602#    mini = a[0]
603#    for i in xrange(len(a)):
604#        if a[i] < mini:
605#            mini = a[i]
606#    return mini
607
608
609def fig_thales(noms, valeurs):
610    v = test_valeurs_thales(valeurs[0:8], valeurs[8][0], valeurs[8][1])
611    type_thales = valeurs[8][1]
612    angle = int(((100.0 * acos(((v[0] ** 2 + v[1] ** 2) - v[2] ** 2) / ((2 *
613                v[0]) * v[1]))) * 180) / pi) / 100.0
614    v = [int(v[i] * 100) / 100.0 for i in range(8)]
615    mini_x = int(100.0 * min(0, v[1] * cos((angle * pi) / 180), v[3] *
616                 type_thales, (v[4] * cos((angle * pi) / 180)) *
617                 type_thales)) / 100.0 - 1.5
618    mini_y = int(100.0 * min(0, (v[4] * sin((angle * pi) / 180)) *
619                 type_thales)) / 100.0 - 1.5
620    maxi_x = int(100.0 * max(v[0], v[1] * cos((angle * pi) / 180))) / \
621        100.0 + 1.5
622    maxi_y = int((100.0 * v[1]) * sin((angle * pi) / 180)) / 100.0 + .5
623    echelle = int(400 / max(abs(mini_x) + maxi_x, abs(mini_y) + maxi_y)) / \
624        100.0
625    if type_thales == 1:
626        return (
627            echelle,
628            mini_x,
629            mini_y,
630            maxi_x,
631            maxi_y,
632            225,
633            angle + 45,
634            noms[0],
635            noms[1],
636            noms[2],
637            v[0],
638            v[1],
639            angle,
640            - 45,
641            angle + 90,
642            noms[3],
643            noms[4],
644            v[3],
645            v[4],
646            angle,
647            )
648    else:
649        return (
650            echelle,
651            mini_x,
652            mini_y,
653            maxi_x,
654            maxi_y,
655            135,
656            angle + 45,
657            noms[0],
658            noms[1],
659            noms[2],
660            v[0],
661            v[1],
662            angle,
663            135,
664            angle + 180,
665            noms[3],
666            noms[4],
667            - v[3],
668            - v[4],
669            angle,
670            )
671
672
673def tex_fig_thales(noms, valeurs):
674    donnees = fig_thales(noms, valeurs)
675    enonce = \
676        '''\\figureadroite{
677  \\psset{PointSymbol=none,unit=%s}
678  \\begin{pspicture}(%s,%s)(%s,%s)
679    \\SpecialCoor
680    \\pstTriangle[PosAngleA=%s,PosAngleB=-45,PosAngleC=%s,PointNameA=%s,
681      PointNameB=%s,PointNameC=%s](0,0){a}(%s,0){b}(%s;%s){c}
682    \\pstTriangle[PosAngleB=%s,PosAngleC=%s,PointSymbolA=none,
683      PointName=none,PointNameB=%s,PointNameC=%s](0,0){a}(%s,0){b}(%s;%s){c}
684  \\end{pspicture}
685}''' % \
686        donnees
687    return enonce
688
689
690#
691# ------------------- TRIGONOMETRIE -------------------
692#
693
694
695def exo_trigo():
696    exo = ["\\exercice"]
697    cor = ["\\exercice*"]
698    s = choix_points(6)
699    n1 = cotes_sommets(s[0:3])
700    n2 = cotes_sommets(s[3:6])
701    v = valeurs_trigo()
702    (l1, l2) = enonce_trigo(((s[0:3], n1, v[0]), (s[3:6], n2, v[1])))
703    exo.extend(l1)
704    cor.extend(l2)
705    return (exo, cor)
706
707exo_trigo.description = u'Cosinus d\'un angle aigu'
708
709
710def enonce_trigo(v):
711    (exo, cor) = ([], [])
712    (l, lt) = ([], [])
713    for j in range(2):
714        f = (('\\sin', 1, 0), ('\\cos', 2, 0), ('\\tan', 1, 2))[v[j][2][0]]
715        for i in range(2):
716            l.append(v[j][1][f[i + 1]])
717            l.append(v[j][2][i + 1])
718        l.append(angle(v[j][0], 1))
719        l.append(v[j][2][3])
720    for j in range(2):
721        tmp = []
722        for i in range(3):
723            if len(l[2 * i + 6 * j]) < 3:
724                if l[2 * i + 6 * j + 1]:
725                    lt.append('$%s=\\unit[%s]{cm}$' % (l[2 * i + 6 * j],
726                              nombre(l[2 * i + 6 * j + 1])))
727                else:
728                    tmp = 'la longueur $%s$' % l[2 * i + 6 * j]
729            elif l[2 * i + 6 * j + 1]:
730                lt.append('$%s=%s\\degres$' % (l[2 * i + 6 * j], l[2 * i +
731                          6 * j + 1]))
732            else:
733                lt.append('la mesure de l\'angle $%s$' % l[2 * i + 6 * j])
734        if tmp:
735            lt.append(tmp)
736    exo.append('\\begin{multicols}{2}')
737    exo.append('\\begin{enumerate}')
738    cor.append('\\begin{multicols}{2}')
739    cor.append('\\begin{enumerate}')
740    arrondi = random.randrange(1, 4)
741    text_arrondi = ['dix', 'cent', 'mill'][arrondi - 1] + u'ième'
742    tr = nom_triangle(v[0][0])
743    exo.append('\\item $%s$ est un triangle rectangle en $%s$ tel que :\\par' %
744               (tr, v[0][0][0]))
745    exo.append('%s et %s.\\par\nCalculer %s, arrondie au %s.\\par' % tuple(lt[0:3] + [text_arrondi]))
746    cor.append('\\item $%s$ est un triangle rectangle en $%s$ tel que :\\par' %
747               (tr, v[0][0][0]))
748    cor.append('%s et %s.\\par\nCalculer %s, arrondie au %s.\\par' % tuple(lt[0:3] + [text_arrondi]))
749    cor.append('Dans le triangle $%s$ rectangle en $%s$,' % (tr, v[0][0][0]))  # résolution
750    v2 = (v[0][1], v[0][2])
751    l2 = l[0:6]
752    cor.extend(resolution_trigo(v2, l2, arrondi))
753    tr = nom_triangle(v[1][0])
754    exo.append('\\columnbreak')
755    cor.append('\\columnbreak')
756    arrondi = random.randrange(1, 4)
757    text_arrondi = ['dix', 'cent', 'mill'][arrondi - 1] + u'ième'
758    exo.append('\\item $%s$ est un triangle rectangle en $%s$ tel que :\\par' %
759               (tr, v[1][0][0]))
760    exo.append('''%s et %s.\\par
761Calculer %s, arrondie au %s.\\par''' %
762               tuple(lt[3:6] + [text_arrondi]))
763    cor.append('\\item $%s$ est un triangle rectangle en $%s$ tel que :\\par' %
764               (tr, v[1][0][0]))
765    cor.append('%s et %s.\\par\nCalculer %s, arrondie au %s.\\par' % tuple(lt[3:6] + [text_arrondi]))
766#    cor.append("""\\dotfill{}\\par\\vspace{2ex}")
767    cor.append('Dans le triangle $%s$ rectangle en $%s$,' % (tr, v[1][0][0]))  # résolution
768    v2 = (v[1][1], v[1][2])
769    l2 = l[6:12]
770    cor.extend(resolution_trigo(v2, l2, arrondi))
771    exo.append('\\end{enumerate}')
772    exo.append('\\end{multicols}')
773    cor.append('\\end{enumerate}')
774    cor.append('\\end{multicols}')
775    return (exo, cor)
776
777
778def resolution_trigo(v2, l2, arrondi):
779    cor = []
780    f = (('\\sin', 1, 0), ('\\cos', 2, 0), ('\\tan', 1, 2))[v2[1][0]]
781    cor.append('\\[ %s%s=\\cfrac{%s}{%s} \\]' % (f[0], l2[4], v2[0][f[1]],
782               v2[0][f[2]]))
783    if not v2[1][3]:
784        cor.append('\\[ %s%s=\\cfrac{%s}{%s} \\]' % (f[0], l2[4],
785                   nombre(v2[1][1]), nombre(v2[1][2])))
786        if f[0] == '\\sin':
787            r = (asin(v2[1][1] / v2[1][2]) * 180) / pi
788        elif f[0] == '\\cos':
789            r = (acos(v2[1][1] / v2[1][2]) * 180) / pi
790        else:
791            r = (atan(v2[1][1] / v2[1][2]) * 180) / pi
792        cor.append(r'\[ \boxed{%s=%s^{-1}\left(\cfrac{%s}{%s}\right) %s\degres} \]' %
793                   (l2[4], f[0], nombre(v2[1][1]), nombre(v2[1][2]),
794                   valeur_exacte(r, approx=arrondi, unit=0)))
795    elif not v2[1][1]:
796        cor.append('\\[ %s%s=\\cfrac{%s}{%s} \\]' % (f[0], v2[1][3],
797                   v2[0][f[1]], nombre(v2[1][2])))
798        if f[0] == '\\sin':
799            r = sin((v2[1][3] * pi) / 180)
800        elif f[0] == '\\cos':
801            r = cos((v2[1][3] * pi) / 180)
802        else:
803            r = tan((v2[1][3] * pi) / 180)
804        r = r * v2[1][2]
805        cor.append(r'\[ \boxed{%s=%s%s\times %s %s} \]' %
806                   (v2[0][f[1]], f[0], v2[1][3], nombre(v2[1][2]),
807                   valeur_exacte(r, approx=arrondi)))
808    else:
809        cor.append('\\[ %s%s=\\cfrac{%s}{%s} \\]' % (f[0], v2[1][3],
810                   nombre(v2[1][1]), v2[0][f[2]]))
811        if f[0] == '\\sin':
812            r = sin((v2[1][3] * pi) / 180)
813        elif f[0] == '\\cos':
814            r = cos((v2[1][3] * pi) / 180)
815        else:
816            r = tan((v2[1][3] * pi) / 180)
817        r = v2[1][1] / r
818        cor.append(r'\[ \boxed{%s=\cfrac{%s}{%s%s} %s} \]' %
819                   (v2[0][f[2]], nombre(v2[1][1]), f[0], v2[1][3],
820                   valeur_exacte(r, approx=arrondi)))
821    return cor
822
823
824def 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
825    return '\\widehat{%s%s%s}' % (s[(n + 2) % 3], s[n], s[(n + 1) % 3])
826
827
828def valeurs_trigo():
829    l = [random.randrange(10, 121) / 10.0 for dummy in range(3)]
830    l.sort()
831    l.append(random.randrange(15, 76))
832    trigo = 1
833    if random.randrange(2):  # on choisit en 1er une longueur et un angle
834        if random.randrange(2):  # on connait la première des deux longueurs
835            v = (trigo, l[0], 0, l[3])
836        else:
837            v = (trigo, 0, l[0], l[3])
838        v = (v, (trigo, l[1], l[2], 0))
839    else:
840
841        # on choisit en 1er deux longueurs
842
843        v = (trigo, l[1], l[2], 0)
844        if random.randrange(2):  # on connait la première des deux longueurs
845            v = (v, (trigo, l[0], 0, l[3]))
846        else:
847            v = (v, (trigo, 0, l[0], l[3]))
848    return v
Note: See TracBrowser for help on using the repository browser.