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