exercices/6e/6G20.js

  1. import Exercice from '../Exercice.js'
  2. import { mathalea2d } from '../../modules/2dGeneralites.js'
  3. import { context } from '../../modules/context.js'
  4. import { listeQuestionsToContenu, randint, combinaisonListes, creerNomDePolygone } from '../../modules/outils.js'
  5. import { point, barycentre, vecteur, polygone, carre, nommePolygone, translation, rotation, homothetie, similitude, codageAngleDroit, codageSegments, codageAngle, grille, seyes } from '../../modules/2d.js'
  6. export const titre = 'Nommer et coder des polygones'
  7. /**
  8. * @author Jean-Claude Lhote
  9. * Placer les sommets et les égalités de longueur...
  10. * Référence 6G20
  11. */
  12. export const uuid = '90e1a'
  13. export const ref = '6G20'
  14. export default function NommerEtCoderDesPolygones () {
  15. Exercice.call(this) // Héritage de la classe Exercice()
  16. this.titre = titre
  17. this.consigne = "Nommer les figures en fonction de l'énoncé puis ajouter le codage."
  18. this.nbQuestions = 4
  19. this.nbCols = 2
  20. this.nbColsCorr = 2
  21. this.sup = 3
  22. this.nouvelleVersion = function () {
  23. this.listeQuestions = [] // Liste de questions
  24. this.listeCorrections = [] // Liste de questions corrigées
  25. this.autoCorrection = []
  26. let Xmin, Xmax, Ymin, Ymax, sc, g, carreaux
  27. const ppc = 40
  28. if (context.isHtml) {
  29. sc = 0.5
  30. } else {
  31. sc = 0.4
  32. }
  33. let params
  34. const liste = combinaisonListes([1, 2, 3, 4, 5, 6, 7, 8], this.nbQuestions)
  35. let listeDeNomsDePolygones
  36. for (
  37. let i = 0, texte, texteCorr, cpt = 0;
  38. i < this.nbQuestions && cpt < 50;
  39. ) {
  40. if (i % 4 === 0) listeDeNomsDePolygones = ['PQD']
  41. context.pixelsParCm = 40
  42. let pol, polcode, polsom, polnom
  43. function choisirPolygone (n) { // n compris entre 1 et 8 (1 à 4 pour un triangle, 5 à 8 pour une quadrilatère)
  44. let A, B, C, D
  45. const nom = creerNomDePolygone(4, listeDeNomsDePolygones); let pnom; let q; let p; let pcode; let enonce
  46. listeDeNomsDePolygones.push(nom)
  47. switch (n) {
  48. case 1: // triangle isocèle
  49. A = point(3, randint(0, 20) / 10, nom[0])
  50. B = point(randint(7, 8), randint(0, 10) / 10, nom[1])
  51. C = rotation(B, A, randint(25, 80), nom[2])
  52. q = polygone(A, B, C)
  53. p = rotation(q, barycentre(q), randint(0, 360))
  54. A = p.listePoints[0]
  55. B = p.listePoints[1]
  56. C = p.listePoints[2]
  57. pnom = nommePolygone(p, nom[0] + nom[1] + nom[2])
  58. pcode = [codageSegments('||', 'blue', A, B, A, C), codageAngle(B, C, A, 0.8, '|', 'blue', 2, 0.8, 'blue', 0.2), codageAngle(C, B, A, 0.8, '|', 'blue', 2, 0.8, 'blue', 0.2)]
  59. enonce = `le triangle $${nom[0] + nom[1] + nom[2]}$ est isocèle en $${nom[0]}$.<br>`
  60. break
  61. case 2: // triangle équilatéral
  62. A = point(3, randint(0, 20) / 10, nom[0])
  63. B = point(randint(7, 8), randint(0, 10) / 10, nom[1])
  64. C = rotation(B, A, 60, nom[2])
  65. q = polygone(A, B, C)
  66. p = rotation(q, barycentre(q), randint(0, 360))
  67. A = p.listePoints[0]
  68. B = p.listePoints[1]
  69. C = p.listePoints[2]
  70. pnom = nommePolygone(p, nom[0] + nom[1] + nom[2])
  71. pcode = [codageSegments('||', 'blue', A, B, A, C, B, C), codageAngle(B, C, A, 0.8, '|', 'blue', 2, 0.8, 'blue', 0.2), codageAngle(C, B, A, 0.8, '|', 'blue', 2, 0.8, 'blue', 0.2), codageAngle(C, A, B, 0.8, '|', 'blue', 2, 0.8, 'blue', 0.2)]
  72. enonce = `le triangle $${nom[0] + nom[1] + nom[2]}$ est équilatéral.<br>$\\phantom{et sa longueur est AB}$`
  73. break
  74. case 3: // triangle rectangle
  75. A = point(3, randint(0, 20) / 10, nom[0])
  76. B = point(randint(7, 8), randint(0, 10) / 10, nom[1])
  77. C = similitude(B, A, 90, randint(30, 100) / 100, nom[2])
  78. q = polygone(A, B, C)
  79. p = rotation(q, barycentre(q), randint(0, 360))
  80. A = p.listePoints[0]
  81. B = p.listePoints[1]
  82. C = p.listePoints[2]
  83. pnom = nommePolygone(p, nom[0] + nom[1] + nom[2])
  84. pcode = codageAngleDroit(B, A, C)
  85. enonce = `le triangle $${nom[0] + nom[1] + nom[2]}$ est rectangle en $${nom[0]}$.<br>$\\phantom{et sa longueur est AB}$`
  86. break
  87. case 4: // triangle rectangle isocèle
  88. A = point(3, randint(0, 20) / 10, nom[0])
  89. B = point(randint(7, 8), randint(0, 10) / 10, nom[1])
  90. C = rotation(B, A, 90, nom[2])
  91. q = polygone(A, B, C)
  92. p = rotation(q, barycentre(q), randint(0, 360))
  93. A = p.listePoints[0]
  94. B = p.listePoints[1]
  95. C = p.listePoints[2]
  96. pnom = nommePolygone(p, nom[0] + nom[1] + nom[2])
  97. pcode = [codageSegments('||', 'blue', A, B, A, C), codageAngleDroit(B, A, C), codageAngle(B, C, A, 0.8, '|', 'blue', 2, 0.8, 'blue', 0.2), codageAngle(C, B, A, 0.8, '|', 'blue', 2, 0.8, 'blue', 0.2)]
  98. enonce = `le triangle $${nom[0] + nom[1] + nom[2]}$ est rectangle et isocèle en $${nom[0]}$.`
  99. break
  100. // on choisit un quadrilatère
  101. case 5: // carré
  102. A = point(3, randint(0, 20) / 10, nom[0])
  103. B = point(randint(7, 8), randint(10, 30) / 10, nom[1])
  104. q = carre(A, B)
  105. p = rotation(q, barycentre(q), randint(0, 360))
  106. A = p.listePoints[0]
  107. B = p.listePoints[1]
  108. C = p.listePoints[2]
  109. D = p.listePoints[3]
  110. pnom = nommePolygone(p, nom[0] + nom[1] + nom[2] + nom[3])
  111. pcode = [codageSegments('||', 'blue', A, B, B, C, C, D, D, A), codageAngleDroit(B, A, D), codageAngleDroit(A, B, C), codageAngleDroit(B, C, D), codageAngleDroit(A, D, C)]
  112. enonce = `le quadrilatère $${nom[0] + nom[1] + nom[2] + nom[3]}$ est un carré.<br>$\\phantom{et sa longueur est AB}$`
  113. break
  114. case 6: // rectangle
  115. A = point(3, randint(0, 20) / 10, nom[0])
  116. B = point(randint(7, 8), randint(10, 30) / 10, nom[1])
  117. C = similitude(A, B, -90, randint(30, 80) / 100, nom[2])
  118. D = translation(C, vecteur(B, A), nom[3])
  119. q = polygone(A, B, C, D)
  120. p = rotation(q, barycentre(q), randint(0, 360))
  121. A = p.listePoints[0]
  122. B = p.listePoints[1]
  123. C = p.listePoints[2]
  124. D = p.listePoints[3]
  125. pnom = nommePolygone(p, nom[0] + nom[1] + nom[2] + nom[3])
  126. pcode = [codageSegments('||', 'blue', A, B, C, D), codageSegments('|', 'red', C, B, A, D), codageAngleDroit(B, A, C), codageAngleDroit(A, B, C), codageAngleDroit(B, C, D), codageAngleDroit(A, D, C)]
  127. enonce = `le quadrilatère $${nom[0] + nom[1] + nom[2] + nom[3]}$ est un rectangle et $${nom[0] + nom[1]}$ est sa longueur.`
  128. break
  129. case 7: // losange
  130. A = point(3, randint(0, 20) / 10, nom[0])
  131. B = point(randint(7, 8), randint(10, 30) / 10, nom[1])
  132. C = rotation(A, B, randint(100, 150), nom[2])
  133. D = translation(C, vecteur(B, A), nom[3])
  134. q = polygone(A, B, C, D)
  135. p = rotation(q, barycentre(q), randint(0, 360))
  136. A = p.listePoints[0]
  137. B = p.listePoints[1]
  138. C = p.listePoints[2]
  139. D = p.listePoints[3]
  140. pnom = nommePolygone(p, nom[0] + nom[1] + nom[2] + nom[3])
  141. pcode = [codageSegments('O', 'blue', A, B, B, C, C, D, D, A), codageAngle(C, D, A, 0.8, '||', 'red', 2, 0.8, 'red', 0.2), codageAngle(C, B, A, 0.8, '||', 'red', 2, 0.8, 'red', 0.2), codageAngle(B, C, D, 0.8, '|', 'blue', 2, 0.8, 'blue', 0.2), codageAngle(D, A, B, 0.8, '|', 'blue', 2, 0.8, 'blue', 0.2)]
  142. enonce = `le quadrilatère $${nom[0] + nom[1] + nom[2] + nom[3]}$ est un losange et [$${nom[0] + nom[2]}$] est sa plus grande diagonale.`
  143. break
  144. case 8: // trapèze rectangle
  145. A = point(3, randint(0, 20) / 10, nom[0])
  146. B = point(randint(7, 8), randint(10, 30) / 10, nom[1])
  147. D = similitude(B, A, 90, randint(30, 80) / 100, nom[3])
  148. C = translation(D, homothetie(vecteur(A, B), A, randint(30, 80) / 100), nom[2])
  149. q = polygone(A, B, C, D)
  150. p = rotation(q, barycentre(q), randint(0, 360))
  151. A = p.listePoints[0]
  152. B = p.listePoints[1]
  153. C = p.listePoints[2]
  154. D = p.listePoints[3]
  155. pnom = nommePolygone(p, nom[0] + nom[1] + nom[2] + nom[3])
  156. pcode = [codageAngleDroit(B, A, D), codageAngleDroit(C, D, A)]
  157. enonce = `le quadrilatère $${nom[0] + nom[1] + nom[2] + nom[3]}$ est un trapèze rectangle de grande base $${nom[0] + nom[1]}$ de hauteur $${nom[0] + nom[3]}$.`
  158. break
  159. }
  160. return [p, nom, pcode, pnom, enonce]
  161. }
  162. [pol, polnom, polcode, polsom, texte] = choisirPolygone(liste[i])
  163. if (pol.listePoints.length === 4) {
  164. Xmin = Math.floor(Math.min(pol.listePoints[0].x, pol.listePoints[1].x, pol.listePoints[2].x, pol.listePoints[3].x) - 1)
  165. Ymin = Math.floor(Math.min(pol.listePoints[0].y, pol.listePoints[1].y, pol.listePoints[2].y, pol.listePoints[3].y) - 1)
  166. Xmax = Math.ceil(Math.max(pol.listePoints[0].x, pol.listePoints[1].x, pol.listePoints[2].x, pol.listePoints[3].x) + 1)
  167. Ymax = Math.ceil(Math.max(pol.listePoints[0].y, pol.listePoints[1].y, pol.listePoints[2].y, pol.listePoints[3].y) + 1)
  168. } else {
  169. Xmin = Math.floor(Math.min(pol.listePoints[0].x, pol.listePoints[1].x, pol.listePoints[2].x) - 1)
  170. Ymin = Math.floor(Math.min(pol.listePoints[0].y, pol.listePoints[1].y, pol.listePoints[2].y) - 1)
  171. Xmax = Math.ceil(Math.max(pol.listePoints[0].x, pol.listePoints[1].x, pol.listePoints[2].x) + 1)
  172. Ymax = Math.ceil(Math.max(pol.listePoints[0].y, pol.listePoints[1].y, pol.listePoints[2].y) + 1)
  173. }
  174. params = {
  175. xmin: Xmin,
  176. ymin: Ymin,
  177. xmax: Xmax,
  178. ymax: Ymax,
  179. pixelsParCm: ppc,
  180. scale: sc
  181. }
  182. if (this.sup < 3) g = grille(Xmin, Ymin, Xmax, Ymax, 'gray', 0.7)
  183. else g = ''
  184. if (parseInt(this.sup === 2)) {
  185. carreaux = seyes(Xmin, Ymin, Xmax, Ymax)
  186. } else {
  187. carreaux = ''
  188. }
  189. pol.epaisseur = 2
  190. texte += '<br>' + mathalea2d(params, pol, polnom, g, carreaux)
  191. texteCorr = mathalea2d(params, pol, polnom, polcode, polsom, g, carreaux)
  192. if (this.listeQuestions.indexOf(texte) === -1) {
  193. // Si la question n'a jamais été posée, on en crée une autre
  194. this.listeQuestions.push(texte)
  195. this.listeCorrections.push(texteCorr)
  196. i++
  197. }
  198. cpt++
  199. }
  200. listeQuestionsToContenu(this)
  201. context.pixelsParCm = 20
  202. }
  203. this.besoinFormulaireNumerique = [
  204. 'Type de cahier',
  205. 3,
  206. ' 1 : Cahier à petits carreaux\n 2 : Cahier à gros carreaux (Seyes)\n 3 : Feuille blanche'
  207. ]
  208. }