#!/usr/bin/python # -*- coding: utf-8 -*- # # 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 #import sys, os #sys.path.append(os.path.join(os.path.dirname(__file__), "..")) import random from ..outils import Affichage def boxes(): """Crée les boites pour insérer les figures dans un environnement 36x16""" b0x, b0y = random.randrange(5, 2*36/3-1), random.randrange(5, 2*16/3+1) b1x, b1y = random.randrange(5, 2*(36-b0x)/3-1), random.randrange(5, 2*16/3+1) b2x, b2y = 36-b0x-b1x-2, random.randrange(5, 2*16/3+1) b3x, b3y = b0x, 16-b0y-1 b4x, b4y = b1x, 16-b1y-1 b5x, b5y = b2x, 16-b2y-1 return (b0x, b0y), (b1x, b1y), (b2x, b2y), (b3x, b3y), (b4x, b4y), (b5x, b5y) def carre(dim, n_fig): """Dessine en psTricks un carre de dimensions inf(dim) et numérote la figure avec n_fig""" if dim[0] dim[1]: quiz_exo += ("$$\\fs3\\picture(240){(20,70){\\line(0,100)}(20,70){\\line(200,0)}(220,70){\\line(0,100)}(20,170){\\line(200,0)}(115,55){%s}(25,115){%s}}$$" % (abs(dim[0]), abs(dim[1]))) else: quiz_exo += ("$$\\fs3\\picture(240){(20,70){\\line(0,100)}(20,70){\\line(200,0)}(220,70){\\line(0,100)}(20,170){\\line(200,0)}(115,55){%s}(25,115){%s}}$$" % (abs(dim[1]), abs(dim[0]))) quiz_rectangle.append(quiz_exo) quiz_rectangle.append("%s" % Affichage.decimaux_quiz(aire_rectangle(dim)[1],1)) return (f, f, s, quiz_rectangle) def parallelogramme(dim, n_fig): """Dessine en psTricks un parallelogramme inclus dans un rectangle de dimensions dim et numérote la figure avec n_fig""" base_h = random.randrange(2) if base_h: tab = random.randrange(1, min(dim[0]/2, dim[0]-3))*(-1)**random.randrange(2) if tab>0: s0, s1, s2, s3 = (tab, 0), (dim[0], 0), (dim[0]-tab, dim[1]), (0, dim[1]) frame0, frame1 = s0, dim else: s0, s1, s2, s3 = (0, 0), (dim[0]+tab, 0), (dim[0], dim[1]), (-tab, dim[1]) frame0, frame1 = s0, (dim[0]+tab, dim[1]) else: tab = random.randrange(1, min(dim[1]/2, dim[1]-3))*(-1)**random.randrange(2) if tab>0: s0, s1, s2, s3 = (0, tab), (dim[0], 0), (dim[0], dim[1]-tab), (0, dim[1]) frame0, frame1 = s0, dim else: s0, s1, s2, s3 = (0, 0), (dim[0], -tab), (dim[0], dim[1]), (0, dim[1]+tab) frame0, frame1 = s0, (dim[0], dim[1]+tab) f = "\\pspolygon[fillstyle=hlines]%s%s%s%s\n" % (s0, s1, s2, s3) f += "\\rput(%.2f,%.2f)" % isobarycentre((0, 0), dim) f += _(u"{\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{figure %s}} ") % n_fig fc = "\\pspolygon%s%s%s%s\n" % (s0, s1, s2, s3) fc += "\\psframe[linestyle=dashed, fillstyle=hlines]%s%s\n" % (frame0, frame1) fc += "\\rput(%.2f,%.2f)" % isobarycentre((0, 0), dim) fc += _(u"{\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{figure %s}} ") % n_fig s = _(u"Aire de la figure %s : ") % n_fig s += _(u"c'est l'aire du rectangle en pointillés.\\par\n") s += _(u"$%s = %s$~unités d'aire") %(aire_rectangle(frame0, frame1)[0], aire_rectangle(frame0, frame1)[1]) quiz_parallelogramme = [] quiz_parallelogramme.append(_(u'Aire d\'un parallélogramme')) quiz_exo = _(u"Répond: Le parallélogramme d'en bas a d'aire _____ unités carrées.\n") quiz_x = abs(frame0[0] - frame1[0]) quiz_y = abs(frame0[1] - frame1[1]) if quiz_x > quiz_y: quiz_exo += ("$$\\fs3\\picture(240){(20,20){\\line(50,200)}(20,20){\\line(100,0)}(120,20){\\line(50,200)}(70,220){\\line(100,0)}(70,20){\\line(0,200)}(60,5){%s}(75,115){%s}}$$" % (quiz_y, quiz_x)) else: quiz_exo += ("$$\\fs3\\picture(240){(20,20){\\line(50,200)}(20,20){\\line(100,0)}(120,20){\\line(50,200)}(70,220){\\line(100,0)}(70,20){\\line(0,200)}(60,5){%s}(75,115){%s}}$$" % (quiz_x, quiz_y)) quiz_parallelogramme.append(quiz_exo) quiz_parallelogramme.append("%s" % Affichage.decimaux_quiz(aire_rectangle(frame0, frame1)[1],1)) return (f, fc, s, quiz_parallelogramme) def triangle_rectangle(dim, n_fig): """Dessine en psTricks un triangle rectangle dans une boite de dimensions dim et numérote la figure avec n_fig""" sommets = [(0, 0), (dim[0], 0), dim, (0, dim[1])] s0 = random.randrange(4) s1, s2 = (s0+1)%4, (s0+2)%4 s0, s1, s2 = sommets[s0], sommets[s1], sommets[s2] f = "\\pspolygon[fillstyle=hlines]%s%s%s\n" % (s0, s1, s2) f += "\\rput(%.2f,%.2f)" % isobarycentre(s0, s1, s2) f += _(u"{\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{figure %s}} ") % n_fig fc = "\\psframe[linestyle=dashed]%s%s\n" % (s0, s2) fc += f s = _(u"Aire de la figure %s : ") % n_fig s += _(u"c'est la moitié de l'aire du rectangle en pointillés.\\par\n") s += _(u"$(%s) \\div 2= %s$~unités d'aire") %(aire_rectangle(dim)[0], Affichage.decimaux(aire_rectangle(dim)[1]/2., 1)) quiz_triangle_rectangle = [] quiz_triangle_rectangle.append(_(u'Aire d\'un triangle rectangle')) quiz_exo = _(u"Répond: Le triangle rectangle d'en bas a d'aire _____ unités carrées.\n") if dim[0] > dim[1]: quiz_exo += ("$$\\fs3\\picture(240){(20,20){\\line(0,200)}(20,20){\\line(200,0)}(20,220){\\line(200,-200)}(105,5){%s}(25,105){%s}}$$" % (abs(dim[0]), abs(dim[1]))) else: quiz_exo += ("$$\\fs3\\picture(240){(20,20){\\line(0,200)}(20,20){\\line(200,0)}(20,220){\\line(200,-200)}(105,5){%s}(25,105){%s}}$$" % (abs(dim[1]), abs(dim[0]))) quiz_triangle_rectangle.append(quiz_exo) quiz_triangle_rectangle.append("%s" % Affichage.decimaux_quiz(aire_rectangle(dim)[1]/2., 1)) return (f, f, s, quiz_triangle_rectangle) def triangle_base(dim, n_fig): """Dessine en psTricks un triangle avec une base horizontale ou verticale dans une boite de dimensions dim et numérote la figure avec n_fig""" sommets = [(0, 0), (dim[0], 0), dim, (0, dim[1])] s0 = random.randrange(4) s1 = (s0+1)%4 x0, x1 = sommets[(s0+2)%4][0], sommets[(s0+3)%4][0] y0, y1 = sommets[(s0+2)%4][1], sommets[(s0+3)%4][1] if x0>x1: x0, x1 = x1, x0 if y0>y1: y0, y1 = y1, y0 if x0 != x1: x0 = random.randrange(x0+1, x1) if y0 != y1: y0 = random.randrange(y0+1, y1) s2 = (x0, y0) s0, s1 = sommets[s0], sommets[s1] f = "\\pspolygon[fillstyle=hlines]%s%s%s\n" % (s0, s1, s2) f += "\\rput(%.2f,%.2f)" % isobarycentre(s0, s1, s2) f += _(u"{\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{figure %s}} ") % n_fig fc = "\\psframe[linestyle=dashed]%s%s\n" % (s0, s2) fc += "\\psframe[linestyle=dashed]%s%s\n" % (s2, s1) fc += f s = _(u"Aire de la figure %s : ") % n_fig s += _(u"c'est la moitié de l'aire du rectangle en pointillés.\\par\n") s += _(u"$(%s) \\div 2= %s$~unités d'aire") %(aire_rectangle(dim)[0], Affichage.decimaux(aire_rectangle(dim)[1]/2., 1)) quiz_triangle_base = [] quiz_triangle_base.append(_(u'Aire d\'un triangle')) quiz_exo = _(u"Répond: Le triangle d'en bas a d'aire _____ unités carrées.\n") if dim[0] > dim[1]: quiz_exo += ("$$\\fs3\\picture(240){(20,20){\\line(50,160)}(20,20){\\line(200,0)}(70,180){\\line(150,-160)}(70,20){\\line(0,160)}(95,5){%s}(75,85){%s}}$$" % (abs(dim[0]), abs(dim[1]))) else: quiz_exo += ("$$\\fs3\\picture(240){(20,20){\\line(50,160)}(20,20){\\line(200,0)}(70,180){\\line(150,-160)}(70,20){\\line(0,160)}(95,5){%s}(75,85){%s}}$$" % (abs(dim[1]), abs(dim[0]))) quiz_triangle_base.append(quiz_exo) quiz_triangle_base.append("%s" % Affichage.decimaux_quiz(aire_rectangle(dim)[1]/2., 1)) return (f, f, s, quiz_triangle_base) def triangle_qcq(dim, n_fig): """Dessine en psTricks un triangle quelconque dans une boite de dimensions dim et numérote la figure avec n_fig""" sommets = [(0, 0), (dim[0], 0), dim, (0, dim[1])] s0 = random.randrange(4) angle0, angle1, angle2 = sommets[(s0+1)%4], sommets[(s0+2)%4], sommets[(s0+3)%4] x0, x1 = sommets[(s0+1)%4][0], sommets[(s0+2)%4][0] y0, y1 = sommets[(s0+1)%4][1], sommets[(s0+2)%4][1] if x0>x1: x0, x1 = x1, x0 if y0>y1: y0, y1 = y1, y0 if x0 != x1: x0 = random.randrange(x0+1, x1) if y0 != y1: y0 = random.randrange(y0+1, y1) s1 = (x0, y0) x0, x1 = sommets[(s0+2)%4][0], sommets[(s0+3)%4][0] y0, y1 = sommets[(s0+2)%4][1], sommets[(s0+3)%4][1] if x0>x1: x0, x1 = x1, x0 if y0>y1: y0, y1 = y1, y0 if x0 != x1: x0 = random.randrange(x0+1, x1) if y0 != y1: y0 = random.randrange(y0+1, y1) s2 = (x0, y0) s0 = sommets[s0] f = "\\pspolygon[fillstyle=hlines]%s%s%s\n" % (s0, s1, s2) f += "\\rput(%.2f,%.2f)" % isobarycentre(s0, s1, s2) f += _(u"{\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{figure %s}}") % n_fig fc = "\\psframe[linestyle=dashed](0,0)(%s,%s) " % dim fc += "\\rput(%.2f,%.2f){\\pscirclebox{1}} " % isobarycentre(s0, s1, angle0) fc += "\\rput(%.2f,%.2f){\\pscirclebox{2}} " % isobarycentre(s1, s2, angle1) fc += "\\rput(%.2f,%.2f){\\pscirclebox{3}}\n" % isobarycentre(s2, s0, angle2) fc += f s = _(u"Aire de la figure %s : ") % n_fig s += _(u"on calcule l'aire du rectangle en pointillés et on soustrait ") s += _(u"les aires des triangles rectangles \\pscirclebox{1}, ") s += _(u"\\pscirclebox{2} et \\pscirclebox{3}.\\par\n") s += _("$(%s) - (%s) \\div 2 - (%s) \\div 2 - (%s) \\div 2 ") %\ (aire_rectangle(dim)[0], aire_rectangle(s0, s1)[0], aire_rectangle(s1, s2)[0], aire_rectangle(s2, s0)[0]) s += _(u"= %s$~unités d'aire") % Affichage.decimaux(aire_rectangle(dim)[1] - aire_rectangle(s0, s1)[1]/2. - aire_rectangle(s0, s2)[1]/2. - aire_rectangle(s1, s2)[1]/2., 1) quiz_triangle_qcq = [] quiz_triangle_qcq.append(_(u'Aire d\'un triangle non horizontal')) quiz_exo = _(u"Répond: Le triangle du centre du rectangle d'en bas a d'aire _____ unités carrées.\n") quiz_exo += ("$$\\fs3\\picture(240){(20,20){\\line(50,160)}(20,20){\\line(200,60)}(70,180){\\line(150,-100)}") quiz_exo += ("{(20,20){\\line(200,0)}(20,20){\\line(0,160)}(20,180){\\line(200,0)}(220,20){\\line(0,160)}") if abs(s1[0]-s0[0]) == (abs(s2[0]-s1[0])+abs(s0[0]-s2[0])): quiz_exo += ("(130,5){%s}(200,30){%s}" % (abs(s1[0]-s0[0]), abs(s1[1]-s0[1]))) quiz_exo += ("(150,185){%s}(200,130){%s}" % (abs(s2[0]-s1[0]), abs(s2[1]-s1[1]))) quiz_exo += ("(30,185){%s}(25,130){%s}$$" % (abs(s0[0]-s2[0]), abs(s0[1]-s2[1]))) else: quiz_exo += ("(130,5){%s}(200,30){%s}" % (abs(s1[1]-s0[1]), abs(s1[0]-s0[0]))) quiz_exo += ("(150,185){%s}(200,130){%s}" % (abs(s2[1]-s1[1]), abs(s2[0]-s1[0]))) quiz_exo += ("(30,185){%s}(25,130){%s}$$" % (abs(s0[1]-s2[1]), abs(s0[0]-s2[0]))) quiz_triangle_qcq.append(quiz_exo) quiz_triangle_qcq.append("%s" % Affichage.decimaux_quiz(aire_rectangle(dim)[1] - aire_rectangle(s0, s1)[1]/2. - aire_rectangle(s0, s2)[1]/2. - aire_rectangle(s1, s2)[1]/2., 1)) return (f, fc, s, quiz_triangle_qcq) def aire_rectangle(pos1, pos2=(0, 0)): """Affiche le calcul et le résultat de l'aire d'un rectangle, les coordonnées de deux sommets opposés étant pos1 et pos2""" dx = abs(pos1[0] - pos2[0]) dy = abs(pos1[1] - pos2[1]) return (_("%s \\times %s") % (dx, dy), dx*dy) def isobarycentre(*args): nbarg = len(args)*1. isobar = [0, 0] for i in args: isobar = [isobar[0]+i[0]/nbarg, isobar[1]+i[1]/nbarg] return tuple(isobar) def figure(quiz): """Dessine en psTricks la figure de l'exercice sur les aires (quadrillage et figures géométriques)""" exo, cor, sol = [], [], ["\\begin{enumerate}"] t = "\\begin{pspicture}(0,0)(18,9)\n" t += "\\psgrid[subgriddiv=2, gridlabels=0pt]\n" t += "\\psframe[fillstyle=vlines, hatchsep=1pt](0,0)(.5,.5)\n" t += _(u"\\rput[l](0.6,0.25){\\psframebox[linecolor=white, fillcolor=white, fillstyle=solid]{unité d'aire}}\n") t += "\\psset{unit=5mm}\n" exo.append(t) cor.append(t) dim0, dim1, dim2, dim3, dim4, dim5 = boxes() xtab0 = 0 ytab3 = ytab4 = ytab5 = 2 xtab1 = dim0[0] + 1 xtab2 = dim0[0] + dim1[0] + 2 ytab0 = dim3[1]+3 ytab1 = dim4[1]+3 ytab2 = dim5[1]+3 fig = [carre, rectangle, triangle_rectangle, triangle_base, triangle_qcq, parallelogramme] for i in range(len(fig)): r = fig.pop(random.randrange(len(fig)))(eval('dim'+str(i)), i+1) exo.append("\\rput(%s,%s){\n" % (eval('xtab' + str(i%3)), eval('ytab' + str(i)))+ r[0] + '\n}') cor.append("\\rput(%s,%s){\n" % (eval('xtab' + str(i%3)), eval('ytab' + str(i)))+ r[1] + '\n}') sol.append("\\item %s" % r[2]) quiz.append(r[3]) exo.append("\\end{pspicture}") cor.append("\\end{pspicture}") cor.extend(sol) cor.append("\\end{enumerate}") return("\n".join(exo), "\n".join(cor)) def main(): exo, cor, sol, quiz = [], [], [], [] exo = ["\\exercice", _(u"Calculer l'aire de chacune des figures suivantes dans l'unité d'aire donnée :\\par")] cor = ["\\exercice*", _(u"Calculer l'aire de chacune des figures suivantes dans l'unité d'aire donnée :\\par")] quiz = [u"numerical"] exercice = figure(quiz) exo.append(exercice[0]) cor.append(exercice[1]) return(exo, cor, quiz)