source: pyromaths/trunk/fuentes/src/pyromaths/ex/sixiemes/aires.py @ 423

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

add sources from pyromaths 15.10

File size: 11.0 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# import sys, os
23# sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
24
25import random
26from pyromaths.outils import Affichage
27def boxes():
28    """Crée les boites pour insérer les figures dans un environnement 36x16"""
29    b0x, b0y = random.randrange(5, 2 * 36 / 3 - 1), random.randrange(5, 2 * 16 / 3 + 1)
30    b1x, b1y = random.randrange(5, 2 * (36 - b0x) / 3 - 1), random.randrange(5,
31            2 * 16 / 3 + 1)
32    b2x, b2y = 36 - b0x - b1x - 2, random.randrange(5, 2 * 16 / 3 + 1)
33    b3x, b3y = b0x, 16 - b0y - 1
34    b4x, b4y = b1x, 16 - b1y - 1
35    b5x, b5y = b2x, 16 - b2y - 1
36    return (b0x, b0y), (b1x, b1y), (b2x, b2y), (b3x, b3y), (b4x, b4y), (b5x,
37            b5y)
38
39def carre(dim, n_fig):
40    """Dessine en psTricks un carre de dimensions inf(dim) et numérote la figure
41    avec n_fig"""
42    if dim[0] < dim[1]: dim = (dim[0], dim[0])
43    else: dim = (dim[1], dim[1])
44    f = "\\psframe[fillstyle=hlines](0, 0)(%s, %s)\n" % dim
45    f += "\\rput(%.2f,%.2f)" % isobarycentre((0, 0), dim)
46    f += "{\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{figure %s}} " % n_fig
47    s = u"Aire de la figure %s : $%s = %s$~unités d'aire" % (n_fig,
48            aire_rectangle(dim)[0], aire_rectangle(dim)[1])
49    return (f, f, s)
50
51def rectangle(dim, n_fig):
52    """Dessine en psTricks un rectangle de dimensions dim et numérote la figure
53    avec n_fig"""
54    f = "\\psframe[fillstyle=hlines](0, 0)(%s, %s)\n" % dim
55    f += "\\rput(%.2f,%.2f)" % isobarycentre((0, 0), dim)
56    f += "{\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{figure %s}}" % n_fig
57    s = u"Aire de la figure %s : $%s = %s$~unités d'aire" % (n_fig,
58            aire_rectangle(dim)[0], aire_rectangle(dim)[1])
59    return (f, f, s)
60
61def parallelogramme(dim, n_fig):
62    """Dessine en psTricks un parallelogramme inclus dans un rectangle de
63    dimensions dim et numérote la figure avec n_fig"""
64    base_h = random.randrange(2)
65    if base_h:
66        tab = random.randrange(1, min(dim[0] / 2, dim[0] - 3)) * (-1) ** random.randrange(2)
67        if tab > 0:
68            s0, s1, s2, s3 = (tab, 0), (dim[0], 0), (dim[0] - tab, dim[1]), (0,
69                    dim[1])
70            frame0, frame1 = s0, dim
71        else:
72            s0, s1, s2, s3 = (0, 0), (dim[0] + tab, 0), (dim[0], dim[1]), (-tab,
73                    dim[1])
74            frame0, frame1 = s0, (dim[0] + tab, dim[1])
75    else:
76        tab = random.randrange(1, min(dim[1] / 2, dim[1] - 3)) * (-1) ** random.randrange(2)
77        if tab > 0:
78            s0, s1, s2, s3 = (0, tab), (dim[0], 0), (dim[0], dim[1] - tab), (0,
79                    dim[1])
80            frame0, frame1 = s0, dim
81        else:
82            s0, s1, s2, s3 = (0, 0), (dim[0], -tab), (dim[0], dim[1]), (0,
83                    dim[1] + tab)
84            frame0, frame1 = s0, (dim[0], dim[1] + tab)
85    f = "\\pspolygon[fillstyle=hlines]%s%s%s%s\n" % (s0,
86            s1, s2, s3)
87    f += "\\rput(%.2f,%.2f)" % isobarycentre((0, 0), dim)
88    f += "{\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{figure %s}} " % n_fig
89    fc = "\\pspolygon%s%s%s%s\n" % (s0, s1, s2, s3)
90    fc += "\\psframe[linestyle=dashed, fillstyle=hlines]%s%s\n" % (frame0, frame1)
91    fc += "\\rput(%.2f,%.2f)" % isobarycentre((0, 0), dim)
92    fc += "{\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{figure %s}} " % n_fig
93    s = "Aire de la figure %s : " % n_fig
94    s += u"c'est l'aire du rectangle en pointillés.\\par\n"
95    s += u"$%s = %s$~unités d'aire" % (aire_rectangle(frame0, frame1)[0],
96            aire_rectangle(frame0, frame1)[1])
97    return (f, fc, s)
98
99def triangle_rectangle(dim, n_fig):
100    """Dessine en psTricks un triangle rectangle dans une boite de dimensions
101    dim et numérote la figure avec n_fig"""
102    sommets = [(0, 0), (dim[0], 0), dim, (0, dim[1])]
103    s0 = random.randrange(4)
104    s1, s2 = (s0 + 1) % 4, (s0 + 2) % 4
105    s0, s1, s2 = sommets[s0], sommets[s1], sommets[s2]
106    f = "\\pspolygon[fillstyle=hlines]%s%s%s\n" % (s0, s1,
107            s2)
108    f += "\\rput(%.2f,%.2f)" % isobarycentre(s0, s1, s2)
109    f += "{\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{figure %s}} " % n_fig
110    fc = "\\psframe[linestyle=dashed]%s%s\n" % (s0, s2)
111    fc += f
112    s = "Aire de la figure %s : " % n_fig
113    s += u"c'est la moitié de l'aire du rectangle en pointillés.\\par\n"
114    s += u"$(%s) \\div 2= %s$~unités d'aire" % (aire_rectangle(dim)[0],
115            Affichage.decimaux(aire_rectangle(dim)[1] / 2., 1))
116    return f, fc, s
117
118def triangle_base(dim, n_fig):
119    """Dessine en psTricks un triangle avec une base horizontale ou verticale
120    dans une boite de dimensions dim et numérote la figure avec n_fig"""
121    sommets = [(0, 0), (dim[0], 0), dim, (0, dim[1])]
122    s0 = random.randrange(4)
123    s1 = (s0 + 1) % 4
124    x0, x1 = sommets[(s0 + 2) % 4][0], sommets[(s0 + 3) % 4][0]
125    y0, y1 = sommets[(s0 + 2) % 4][1], sommets[(s0 + 3) % 4][1]
126    if x0 > x1: x0, x1 = x1, x0
127    if y0 > y1: y0, y1 = y1, y0
128    if x0 != x1: x0 = random.randrange(x0 + 1, x1)
129    if y0 != y1: y0 = random.randrange(y0 + 1, y1)
130    s2 = (x0, y0)
131    s0, s1 = sommets[s0], sommets[s1]
132    f = "\\pspolygon[fillstyle=hlines]%s%s%s\n" % (s0, s1,
133            s2)
134    f += "\\rput(%.2f,%.2f)" % isobarycentre(s0, s1, s2)
135    f += "{\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{figure %s}} " % n_fig
136    fc = "\\psframe[linestyle=dashed]%s%s\n" % (s0, s2)
137    fc += "\\psframe[linestyle=dashed]%s%s\n" % (s2, s1)
138    fc += f
139    s = "Aire de la figure %s : " % n_fig
140    s += u"c'est la moitié de l'aire du rectangle en pointillés.\\par\n"
141    s += u"$(%s) \\div 2= %s$~unités d'aire" % (aire_rectangle(dim)[0],
142            Affichage.decimaux(aire_rectangle(dim)[1] / 2., 1))
143    return f, fc, s
144
145def triangle_qcq(dim, n_fig):
146    """Dessine en psTricks un triangle quelconque dans une boite de dimensions
147    dim et numérote la figure avec n_fig"""
148    sommets = [(0, 0), (dim[0], 0), dim, (0, dim[1])]
149    s0 = random.randrange(4)
150    angle0, angle1, angle2 = sommets[(s0 + 1) % 4], sommets[(s0 + 2) % 4], sommets[(s0 + 3) % 4]
151    x0, x1 = sommets[(s0 + 1) % 4][0], sommets[(s0 + 2) % 4][0]
152    y0, y1 = sommets[(s0 + 1) % 4][1], sommets[(s0 + 2) % 4][1]
153    if x0 > x1: x0, x1 = x1, x0
154    if y0 > y1: y0, y1 = y1, y0
155    if x0 != x1: x0 = random.randrange(x0 + 1, x1)
156    if y0 != y1: y0 = random.randrange(y0 + 1, y1)
157    s1 = (x0, y0)
158    x0, x1 = sommets[(s0 + 2) % 4][0], sommets[(s0 + 3) % 4][0]
159    y0, y1 = sommets[(s0 + 2) % 4][1], sommets[(s0 + 3) % 4][1]
160    if x0 > x1: x0, x1 = x1, x0
161    if y0 > y1: y0, y1 = y1, y0
162    if x0 != x1: x0 = random.randrange(x0 + 1, x1)
163    if y0 != y1: y0 = random.randrange(y0 + 1, y1)
164    s2 = (x0, y0)
165    s0 = sommets[s0]
166    f = "\\pspolygon[fillstyle=hlines]%s%s%s\n" % (s0, s1,
167            s2)
168    f += "\\rput(%.2f,%.2f)" % isobarycentre(s0, s1, s2)
169    f += "{\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{figure %s}}" % n_fig
170    fc = "\\psframe[linestyle=dashed](0,0)(%s,%s) " % dim
171    fc += "\\rput(%.2f,%.2f){\\pscirclebox{1}} " % isobarycentre(s0, s1, angle0)
172    fc += "\\rput(%.2f,%.2f){\\pscirclebox{2}} " % isobarycentre(s1, s2, angle1)
173    fc += "\\rput(%.2f,%.2f){\\pscirclebox{3}}\n" % isobarycentre(s2, s0, angle2)
174    fc += f
175    s = "Aire de la figure %s : " % n_fig
176    s += u"on calcule l'aire du rectangle en pointillés et on soustrait "
177    s += "les aires des triangles rectangles \\pscirclebox{1}, "
178    s += "\\pscirclebox{2} et \\pscirclebox{3}.\\par\n"
179    s += "$(%s) - (%s) \\div 2 - (%s) \\div 2 - (%s) \\div 2 " % \
180            (aire_rectangle(dim)[0], aire_rectangle(s0, s1)[0],
181                    aire_rectangle(s1, s2)[0], aire_rectangle(s2, s0)[0])
182    s += u"= %s$~unités d'aire" % Affichage.decimaux(aire_rectangle(dim)[1] - 
183            aire_rectangle(s0, s1)[1] / 2. - aire_rectangle(s0, s2)[1] / 2. - 
184            aire_rectangle(s1, s2)[1] / 2., 1)
185    return f, fc, s
186
187def aire_rectangle(pos1, pos2=(0, 0)):
188    """Affiche le calcul et le résultat de l'aire d'un rectangle, les
189    coordonnées de deux sommets opposés étant pos1 et pos2"""
190    dx = abs(pos1[0] - pos2[0])
191    dy = abs(pos1[1] - pos2[1])
192    return ("%s \\times %s" % (dx, dy), dx * dy)
193
194def isobarycentre(*args):
195    nbarg = len(args) * 1.
196    isobar = [0, 0]
197    for i in args:
198        isobar = [isobar[0] + i[0] / nbarg, isobar[1] + i[1] / nbarg]
199    return tuple(isobar)
200
201def figure():
202    """Dessine en psTricks la figure de l'exercice sur les aires (quadrillage et
203    figures géométriques)"""
204    exo, cor, sol = [], [], ["\\begin{enumerate}"]
205    t = "\\begin{pspicture}(0,0)(18,9)\n"
206    t += "\\psgrid[subgriddiv=2, gridlabels=0pt]\n"
207    t += "\\psframe[fillstyle=vlines, hatchsep=1pt](0,0)(.5,.5)\n"
208    t += u"\\rput[l](0.6,0.25){\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{unité d'aire}}\n"
209    t += "\\psset{unit=5mm}\n"
210    exo.append(t)
211    cor.append(t)
212    dim0, dim1, dim2, dim3, dim4, dim5 = boxes()
213    xtab0 = 0
214    ytab3 = ytab4 = ytab5 = 2
215    xtab1 = dim0[0] + 1
216    xtab2 = dim0[0] + dim1[0] + 2
217    ytab0 = dim3[1] + 3
218    ytab1 = dim4[1] + 3
219    ytab2 = dim5[1] + 3
220    fig = [carre, rectangle, triangle_rectangle, triangle_base, triangle_qcq, parallelogramme]
221    for i in range(len(fig)):
222        r = fig.pop(random.randrange(len(fig)))(eval('dim' + str(i)), i + 1)
223        exo.append("\\rput(%s,%s){\n" % (eval('xtab' + str(i % 3)),
224                eval('ytab' + str(i))) + r[0] + '\n}')
225        cor.append("\\rput(%s,%s){\n" % (eval('xtab' + str(i % 3)),
226                eval('ytab' + str(i))) + r[1] + '\n}')
227        sol.append("\\item %s" % r[2])
228    exo.append("\\end{pspicture}")
229    cor.append("\\end{pspicture}")
230    cor.extend(sol)
231    cor.append("\\end{enumerate}")
232    return("\n".join(exo), "\n".join(cor))
233
234def aires():
235    exo = ["\\exercice", u"Calculer l'aire de chacune des figures suivantes dans l'unité d'aire donnée :\\par"]
236    cor = ["\\exercice*", u"Calculer l'aire de chacune des figures suivantes dans l'unité d'aire donnée :\\par"]
237    exercice = figure()
238    exo.append(exercice[0])
239    cor.append(exercice[1])
240    return(exo, cor)
241
242aires.description = u'Aires et quadrillage'
Note: See TracBrowser for help on using the repository browser.