exercices/4e/4G10-2.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { randint, listeQuestionsToContenu, choisitLettresDifferentes } from '../../modules/outils.js'
import { afficheLongueurSegment, codageAngleDroit, droite, droiteParPointEtPerpendiculaire, labelPoint, point, pointAdistance, pointIntersectionDD, pointSurDroite, polygoneAvecNom, segment, translation2Points, triangle2points2longueurs, vecteur } from '../../modules/2d.js'
import Alea2iep from '../../modules/Alea2iep.js'
export const titre = 'Transformer une figure par translation'

export const dateDePublication = '16/05/2022'

/**
 * @author Guillaume Valmont
 * Référence 4G10-2
*/
export const uuid = '6a2dd'
export const ref = '4G10-2'
export default class nomExercice extends Exercice {
  constructor () {
    super()
    this.nbQuestions = 1
  }

  nouvelleVersion (numeroExercice) {
    this.listeQuestions = []
    this.listeCorrections = []
    this.autoCorrection = []

    let objetsEnonceEtCorr, objetsEnonceOnly, objetsCorrectionOnly, paramsEnonce, paramsCorrection
    for (let i = 0, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      objetsEnonceOnly = []
      objetsCorrectionOnly = []
      objetsEnonceEtCorr = []

      const lettres = choisitLettresDifferentes(5)

      // Figure initiale
      const A = point(0, -8, lettres[0], 'below')
      const B = pointAdistance(A, randint(30, 60) / 10, randint(0, 45), lettres[1])
      const C = triangle2points2longueurs(A, B, randint(40, 60) / 10, randint(30, 50) / 10).listePoints[2]
      C.nom = lettres[2]
      const poly = polygoneAvecNom(A, B, C)
      objetsEnonceEtCorr.push(poly[0], poly[1], afficheLongueurSegment(B, A), afficheLongueurSegment(A, C), afficheLongueurSegment(C, B))

      // Vecteur et image par translation
      const D = point(B.x - 1, B.y + 7 + randint(-10, 10) / 10, lettres[3])
      const E = point(B.x - 10, B.y + 7 + randint(-20, 20) / 10, lettres[4])
      const imageA = translation2Points(A, D, E, `${lettres[0]}'`)
      const imageB = translation2Points(B, D, E, `${lettres[1]}'`)
      const imageC = translation2Points(C, D, E, `${lettres[2]}'`)
      const imagePoly = polygoneAvecNom(imageA, imageB, imageC)
      function segmente (point, image) {
        const segmentAA = segment(point, image, 'red')
        segmentAA.styleExtremites = '|->'
        segmentAA.pointilles = 2
        return segmentAA
      }
      objetsEnonceEtCorr.push(vecteur(D, E).representant(D), afficheLongueurSegment(D, E), labelPoint(D, E))
      objetsCorrectionOnly.push(imagePoly[0], imagePoly[1])
      objetsCorrectionOnly.push(afficheLongueurSegment(imageB, imageA), afficheLongueurSegment(imageA, imageC), afficheLongueurSegment(imageC, imageB))
      objetsCorrectionOnly.push(segmente(A, imageA), segmente(B, imageB), segmente(C, imageC))
      objetsCorrectionOnly.push(afficheLongueurSegment(A, imageA, 'red'), afficheLongueurSegment(B, imageB, 'red'), afficheLongueurSegment(C, imageC, 'red'))

      // Perpendiculaire
      const min = Math.max(A.x, B.x, C.x, D.x)
      const max = Math.min(imageA.x, imageB.x, imageC.x, E.x)
      const DE = droite(D, E)
      const pied = pointSurDroite(DE, (min + max) / 2)
      const perpendiculaire = droiteParPointEtPerpendiculaire(pied, DE, '', 'red')
      perpendiculaire.pointilles = 2
      const pied2 = pointSurDroite(perpendiculaire, (min + max) / 2 + 0.1)
      const AA = pointIntersectionDD(droite(A, imageA), perpendiculaire)
      const AA2 = pointSurDroite(perpendiculaire, AA.x - 0.1)
      const BB = pointIntersectionDD(droite(B, imageB), perpendiculaire)
      const CC = pointIntersectionDD(droite(C, imageC), perpendiculaire)
      objetsCorrectionOnly.push(perpendiculaire, codageAngleDroit(D, pied, pied2, 'red'))
      objetsCorrectionOnly.push(codageAngleDroit(A, AA, pied, 'red'), codageAngleDroit(B, BB, pied, 'red'), codageAngleDroit(C, CC, pied, 'red'))

      // Paramétrage de la fenêtre
      const xmin = Math.min(A.x, B.x, C.x, D.x, E.x, imageA.x, imageB.x, imageC.x) - 2
      const xmax = Math.max(A.x, B.x, C.x, D.x, E.x, imageA.x, imageB.x, imageC.x) + 2
      const ymin = Math.min(A.y, B.y, C.y, D.x, E.x, imageA.y, imageB.y, imageC.y) - 2
      const ymax = Math.max(A.y, B.y, C.y, D.x, E.x, imageA.y, imageB.y, imageC.y) + 2
      paramsEnonce = { xmin: xmin, ymin: ymin, xmax: xmax, ymax: ymax, pixelsParCm: 20, scale: 1 }
      paramsCorrection = paramsEnonce

      // Animation
      const anim = new Alea2iep()
      anim.recadre(xmin, ymax)
      // Situation initiale
      anim.tempo = 0.001
      anim.couleur = 'black'
      anim.pointCreer(A)
      anim.pointCreer(B)
      anim.pointCreer(C)
      anim.pointCreer(D)
      anim.pointCreer(E)
      anim.traitRapide(D, E)
      anim.traitRapide(A, B)
      anim.traitRapide(A, C)
      anim.traitRapide(B, C)
      // Perpendiculaire
      anim.tempo = 0.5
      anim.couleur = 'red'
      anim.pointilles = 5
      anim.equerreDeplacer(pied)
      anim.equerreMontrer()
      anim.equerreRotation(AA)
      anim.regleDeplacer(pied)
      anim.regleMontrer()
      anim.regleRotation(AA)
      anim.regleDeplacer(pied2)
      anim.equerreMasquer()
      anim.crayonDeplacer(AA2)
      anim.crayonMontrer()
      anim.crayonDeplacer(pied2)
      anim.traitRapide(AA2, pied2)
      anim.codageAngleDroit(D, pied, pied2)
      // Parallèles côté droit
      anim.crayonMasquer()
      anim.equerreMontrer()
      anim.equerreDeplacer(CC)
      anim.crayonMontrer()
      anim.crayonDeplacer(CC)
      anim.crayonDeplacer(C)
      anim.traitRapide(C, CC)
      anim.codageAngleDroit(C, CC, pied)

      anim.crayonMasquer()
      anim.equerreMontrer()
      anim.equerreDeplacer(BB)
      anim.crayonMontrer()
      anim.crayonDeplacer(BB)
      anim.crayonDeplacer(B)
      anim.traitRapide(B, BB)
      anim.codageAngleDroit(B, BB, pied)

      anim.crayonMasquer()
      anim.equerreMontrer()
      anim.equerreDeplacer(AA)
      anim.crayonMontrer()
      anim.crayonDeplacer(AA)
      anim.crayonDeplacer(A)
      anim.traitRapide(A, AA)
      anim.codageAngleDroit(A, AA, pied)
      // Parallèles côté gauche
      anim.equerreMasquer()
      anim.regleProlongerSegment(C, CC, { longueur: 10 })
      anim.regleProlongerSegment(B, BB, { longueur: 10 })
      anim.regleProlongerSegment(A, AA, { longueur: 10 })
      anim.regleMasquer()
      // Compas
      anim.compasMontrer()
      anim.compasEcarter2Points(D, E)
      anim.compasTracerArcCentrePoint(C, imageC)
      anim.compasTracerArcCentrePoint(B, imageB)
      anim.compasTracerArcCentrePoint(A, imageA)
      anim.compasMasquer()
      // Tracer image
      anim.couleur = 'black'
      anim.pointilles = false
      anim.pointCreer(imageC)
      anim.pointCreer(imageB)
      anim.pointCreer(imageA)
      anim.regleMontrer()
      anim.regleSegment(imageC, imageB)
      anim.regleSegment(imageB, imageA)
      anim.regleSegment(imageA, imageC)
      anim.regleMasquer()
      anim.crayonMasquer()

      // Énoncé et correction
      texte = `Tracer l'image du triangle $${lettres[0]}${lettres[1]}${lettres[2]}$ par la translation qui transforme $${lettres[3]}$ en $${lettres[4]}$.<br>`
      texte += mathalea2d(paramsEnonce, objetsEnonceOnly, objetsEnonceEtCorr)
      texteCorr = mathalea2d(paramsCorrection, objetsCorrectionOnly, objetsEnonceEtCorr)
      texteCorr += anim.htmlBouton()
      if (this.questionJamaisPosee(i, B.x, B.y, C.x, C.y)) {
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this) // On envoie l'exercice à la fonction de mise en page
  }
}