#!/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 random import string from math import atan, cos, pi, sin, floor, ceil #=============================================================================== # Symétrique d'une figure par rapport à une droite avec quadrillage #=============================================================================== def valeurs_quad2(nb_pts): vals = [] for i in range(nb_pts): angle = random.randrange((i * 360) / nb_pts, ((i + 1) * 360) / nb_pts) vals.append(((random.randrange(1, 7) * .5) * cos((angle * pi) / 180), (random.randrange(1, 7) * .5) * sin((angle * pi) / 180))) return vals def valeurs_quad(nb_pts): vals = [] for i in range(nb_pts): (alpha, beta) = ((i * 360) / nb_pts, ((i + 1) * 360) / nb_pts) (x, y) = (0, 0) while x == 0 or angle < alpha or angle > beta: (x, y) = (random.randrange(-6, 7) * .5, random.randrange(-6, 7) * .5) if x > 0: angle = int((atan((y * 1.0) / x) * 180) / pi + 360) % \ 360 if x < 0: angle = int((atan((y * 1.0) / x) * 180) / pi + 180) vals.append((x, y)) return vals def centre_sym(vals): fin = 0 while not fin: (fin, cpt) = (1, 0) (o1, o2) = (random.randrange(-6, 7) * .5, random.randrange(-6, 7) * .5) while fin and cpt < len(vals): fin = fin and -3 <= 2 * o1 - vals[cpt][0] <= 3 and -3 <= 2 * \ o2 - vals[cpt][1] <= 3 cpt = cpt + 1 return (o1, o2) def place_pts(vals, O): txt = [" \\pstGeonode[PointSymbol=none,PointName=none]"] for i in range(len(vals)): txt.append("(%s,%s)" % vals[i]) txt.append("{%s}" % chr(i + 97)) txt.append("\n \\pstGeonode[PointSymbol=x, linecolor=Black, dotsize=6pt](%s,%s){O}" % O) txt.append("\n \\pspolygon[linewidth=1pt]") for i in range(len(vals)): txt.append("(%s)" % chr(i + 97)) return ("").join(txt) def place_pts_sym(vals): txt = [" \\pstSymO[PointSymbol=x,PointName=none]{O}{"] for i in range(len(vals)): if i > 0: txt.append(",") txt.append("%s" % chr(i + 97)) txt.append("}[") for i in range(len(vals)): if i > 0: txt.append(",") txt.append("%s1" % chr(i + 97)) txt.append("]\n\pspolygon[linecolor=Black,linestyle=dashed, linewidth=1pt]") for i in range(len(vals)): txt.append("(%s1)" % chr(i + 97)) return ("").join(txt) def exo_quadrillage(f0, f1): pass def symetrie_c_quiz(O, vals, nbpts): langles = [0, 90, 45, 135] angle2 = langles.pop(random.randrange(len(langles))) angle3 = langles.pop(random.randrange(len(langles))) if O == (0, 0): vals_ok = vals else: vals_ok = [(i[0]-2*O[0], i[1]-2*O[1]) for i in vals] vals_cor = [[vals_ok,-1], [vals_ok,angle2], [vals_ok,angle3]] # -1 indica simetria centro O random.shuffle(vals_cor) quiz_txt = "$$\\fs1\\picture(570,140){" quiz_txt += "(10,10){\\line(120,0)}(10,9){\\line(120,0)}(10,10){\\line(0,120)}(9,10){\\line(0,120)}" # Recuadro quiz_txt += "(130,130){\\line(-120,0)}(130,129){\\line(-120,0)}(130,130){\\line(0,-120)}(129,130){\\line(0,-120)}" quiz_txt += ("(%s,%s){\\bullet}(%s,%s){\\fs3O}" %(O[0]*20+68, O[1]*20+68, O[0]*20+75, O[1]*20+65)) # Centro O quiz_txt += ("%s{\\bullet}%s{\\bullet}%s{\\bullet}%s{\\bullet}%s{\\bullet}" % tuple(["("+str(i[0]*20+68)+","+str(i[1]*20+68)+")" for i in vals])) # puntos 1ºFigura quiz_txt += ("%s%s%s%s%s" % tuple([union_m(vals[i-1],vals[i],70,type_m=1) for i in range(nbpts)])) # rectas 1ºFigura quiz_txt += "(260,100){\\fs3\\fbox{1^o}}(400,100){\\fs3\\fbox{2^o}}(540,100){\\fs3\\fbox{3^o}}" # Numeración count_vals = 0 for v in vals_cor: #quiz_txt += ("(%s,%s){\\bullet}(%s,%s){\\fs3O}" % # Otros Centros O # (O[0]*20+208+count_vals*140, O[1]*20+68, O[0]*20+215+count_vals*140, O[1]*20+65)) if v[1] == -1: # -1 indica simetria centro O quiz_txt += ("%s{\\bullet}%s{\\bullet}%s{\\bullet}%s{\\bullet}%s{\\bullet}" % tuple(["("+str(i[0]*-20+208+count_vals*140)+","+str(i[1]*-20+68)+")" for i in v[0]])) # puntos demás Figura quiz_txt += ("%s%s%s%s%s" % tuple([union_m(v[0][i-1],v[0][i],210+count_vals*140,v[1]) for i in range(nbpts)])) # rectas demás Figura elif v[1] == 0: quiz_txt += ("%s{\\bullet}%s{\\bullet}%s{\\bullet}%s{\\bullet}%s{\\bullet}" % tuple(["("+str(i[0]*20+208+count_vals*140)+","+str(i[1]*-20+68)+")" for i in v[0]])) # puntos demás Figura quiz_txt += ("%s%s%s%s%s" % tuple([union_m(v[0][i-1],v[0][i],210+count_vals*140,v[1]) for i in range(nbpts)])) # rectas demás Figura elif v[1] == 90: quiz_txt += ("%s{\\bullet}%s{\\bullet}%s{\\bullet}%s{\\bullet}%s{\\bullet}" % tuple(["("+str(i[0]*-20+208+count_vals*140)+","+str(i[1]*20+68)+")" for i in v[0]])) # puntos demás Figura quiz_txt += ("%s%s%s%s%s" % tuple([union_m(v[0][i-1],v[0][i],210+count_vals*140,v[1]) for i in range(nbpts)])) # rectas demás Figura elif v[1] == 45: quiz_txt += ("%s{\\bullet}%s{\\bullet}%s{\\bullet}%s{\\bullet}%s{\\bullet}" % tuple(["("+str(i[1]*20+208+count_vals*140)+","+str(i[0]*20+68)+")" for i in v[0]])) # puntos demás Figura quiz_txt += ("%s%s%s%s%s" % tuple([union_m(v[0][i-1],v[0][i],210+count_vals*140,v[1]) for i in range(nbpts)])) # rectas demás Figura elif v[1] == 135: quiz_txt += ("%s{\\bullet}%s{\\bullet}%s{\\bullet}%s{\\bullet}%s{\\bullet}" % tuple(["("+str(i[1]*-20+208+count_vals*140)+","+str(i[0]*-20+68)+")" for i in v[0]])) # puntos demás Figura quiz_txt += ("%s%s%s%s%s" % tuple([union_m(v[0][i-1],v[0][i],210+count_vals*140,v[1]) for i in range(nbpts)])) # rectas demás Figura count_vals += 1 quiz_txt += "}$$
\n" quiz_sol = "" for x in range(3): if vals_cor[x][1] == -1: # -1 indica simetria centro O quiz_sol += (u"~=%sº" % str(x+1)) else: quiz_sol += (u"~%sº" % str(x+1)) return quiz_txt, quiz_sol def union_m(pt1, pt2, d_m, type_m=1): if type_m == -1: # -1 indica simetria centro O pt1_m = (-pt1[0], -pt1[1]) pt2_m = (-pt2[0], -pt2[1]) elif type_m == 0: pt1_m = (pt1[0], -pt1[1]) pt2_m = (pt2[0], -pt2[1]) elif type_m == 90: pt1_m = (-pt1[0], pt1[1]) pt2_m = (-pt2[0], pt2[1]) elif type_m == 45: pt1_m = (pt1[1], pt1[0]) pt2_m = (pt2[1], pt2[0]) elif type_m == 135: pt1_m = (-pt1[1], -pt1[0]) pt2_m = (-pt2[1], -pt2[0]) else: pt1_m = pt1 pt2_m = pt2 v_x = (pt2_m[0] - pt1_m[0])*20 v_y = (pt2_m[1] - pt1_m[1])*20 return ("(%s,%s){\\line(%s,%s)}" %(pt1_m[0]*20 + d_m, pt1_m[1]*20 + 70, v_x, v_y)) def main(): exo = ["\\exercice", _(u"Construire la symétrique de chacune des figures par rapport au point O en"), _(u"utilisant le quadrillage :\\par "), "\\psset{unit=.9cm}"] cor = ["\\exercice*", _(u"Construire la symétrique de chacune des figures par rapport au point O en"), _(u"utilisant le quadrillage :\\par "), "\\psset{unit=.9cm}"] quiz = ["cloze"] nbpts = 5 for i in range(3): vals = valeurs_quad(nbpts) O = centre_sym(vals) txt = place_pts(vals, O) exo.append("\\begin{pspicture*}(-3,-3)(3,3)") exo.append("\\psgrid[subgriddiv=2,gridlabels=0pt]") exo.append(txt) cor.append("\\begin{pspicture*}(-3,-3)(3,3)") cor.append("\\psgrid[subgriddiv=2,gridlabels=0pt]") cor.append(txt) cor.append(place_pts_sym(vals)) exo.append("\end{pspicture*}") cor.append("\end{pspicture*}") if i < 2: exo.append("\\hfill") cor.append("\\hfill") quiz_nom = (_(u"Symétrie centrale %s") % str(i+1)) quiz_exo_cor = _(u"Indique quel c'est le symétrique en ce qui concerne le centre $$O$$ de la forme encadrée de la gauche:
\n") quiz_txt, quiz_sol = symetrie_c_quiz(O, vals, nbpts) quiz_exo_cor += quiz_txt quiz_exo_cor += (_(u"Réponse: La symétrique en ce qui concerne le centre $$O$$ est le {1:MULTICHOICE:%s}") % quiz_sol) quiz.append([quiz_nom, quiz_exo_cor, ""]) return (exo, cor, quiz)