#!/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)