exercices/6e/6G13.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { listeQuestionsToContenu, randint, combinaisonListes, creerNomDePolygone, texNombre, stringNombre, texteEnCouleur } from '../../modules/outils.js'
import { point, tracePoint, labelPoint, polygoneRegulier, codageAngleDroit, pointAdistance, droiteParPointEtPerpendiculaire, droite, pointIntersectionLC, polygone, segment, texteSurSegment, milieu, afficheLongueurSegment, cercle, pointIntersectionCC } from '../../modules/2d.js'
import Alea2iep from '../../modules/Alea2iep.js'
export const titre = 'Tracer des carrés et des rectangles de longueurs données'

export const dateDePublication = '10/09/2022'

/**
 * Simple construction de rectangles et de carrés dont les longueur des côtés sont données avec pour autocorrection une vérification des mesures des diagonales.
 * @author Guillaume Valmont
 * Référence 6G13
*/
export const uuid = '2203a'
export const ref = '6G13'
export default class TracerQuadrilatèresParticuliers extends Exercice {
  constructor () {
    super()
    this.titre = titre
    this.nbQuestions = 4

    this.besoinFormulaireNumerique = ['Figure à tracer', 11, '1 : Carré\n2 : Rectangle\n3 : Carré (une diagonale)\n4 : Rectangle (une diagonale)\n5 : Losange (un côté et une diagonale)\n6 Losange (2 diagonales)\n7 : Parallélogramme\n8 : Mélange (1, 2)\n9 : mélange (1, 2, 3, 4)\n10 : Mélange (5, 6, 7)\n11 : Mélange (tous les cas)']
    this.sup = 8
  }

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

    let typesDeQuestionsDisponibles = ['Carré', 'Rectangle']
    if (this.sup === 1) typesDeQuestionsDisponibles = ['Carré']
    if (this.sup === 2) typesDeQuestionsDisponibles = ['Rectangle']
    if (this.sup === 3) typesDeQuestionsDisponibles = ['Carré1diag']
    if (this.sup === 4) typesDeQuestionsDisponibles = ['Rectangle1diag']
    if (this.sup === 5) typesDeQuestionsDisponibles = ['Losange']
    if (this.sup === 6) typesDeQuestionsDisponibles = ['Losange2diag']
    if (this.sup === 7) typesDeQuestionsDisponibles = ['Parallélogramme']
    if (this.sup === 8) typesDeQuestionsDisponibles = ['Carré', 'Rectangle']
    if (this.sup === 9) typesDeQuestionsDisponibles = ['Carré', 'Rectangle', 'Carré1diag', 'Rectangle1diag']
    if (this.sup === 10) typesDeQuestionsDisponibles = ['Losange', 'Losange2diag', 'Parallélogramme']
    if (this.sup === 11) typesDeQuestionsDisponibles = ['Carré', 'Rectangle', 'Carré1diag', 'Rectangle1diag', 'Losange', 'Losange2diag', 'Parallélogramme']

    const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions)
    for (let i = 0, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      const objetsCorrection = []
      const nomPoly = creerNomDePolygone(4)
      const A = point(0, 0, nomPoly.charAt(0), 'below left')
      let B, C, D, naturePoly, figure
      switch (listeTypeDeQuestions[i]) {
        case 'Carré': {
          naturePoly = 'carré'
          let ok = false; let disSave = [0, 0, 1000]; const old = []; let dis
          for (let jj = 0; jj < 20 && !ok; jj++) {
            const cote = randint(20, 50, old) * 2 // paire seulement!
            old.push(cote / 2)
            const diagonale = cote / Math.sqrt(2)
            const m = diagonale * 0.1 - Math.floor(diagonale /* * 0.1 * 10 */) * 0.1
            dis = [diagonale, cote, m]
            if (dis[2] < 0.005) {
              disSave = dis
              ok = true
              break
            } else {
              if (dis[2] < disSave[2]) {
                disSave = dis
              }
            }
          }
          B = point(dis[1] / 10, 0, nomPoly.charAt(1), 'below right')
          figure = polygoneRegulier(A, B, 4)
          C = point(figure.listePoints[2].x, figure.listePoints[2].y, nomPoly.charAt(2), 'above right')
          D = point(figure.listePoints[3].x, figure.listePoints[3].y, nomPoly.charAt(3), 'above left')
          break
        }

        case 'Carré1diag': {
          naturePoly = 'carré'
          let ok = false; let disSave = [0, 0, 1000]; const old = []; let dis
          for (let jj = 0; jj < 20 && !ok; jj++) {
            const diagonale = randint(25, 50, old) * 2 // paire seulement!
            old.push(diagonale / 2)
            const cote = diagonale / Math.sqrt(2)
            const m = cote * 0.1 - Math.floor(cote /* * 0.1 * 10  */) * 0.1
            dis = [diagonale, cote, m]
            if (dis[2] < 0.005) {
              disSave = dis
              ok = true
              break
            } else {
              if (dis[2] < disSave[2]) {
                disSave = dis
              }
            }
          }
          B = point(dis[1] / 10, 0, nomPoly.charAt(1), 'below right')
          figure = polygoneRegulier(A, B, 4)
          C = point(figure.listePoints[2].x, figure.listePoints[2].y, nomPoly.charAt(2), 'above right')
          D = point(figure.listePoints[3].x, figure.listePoints[3].y, nomPoly.charAt(3), 'above left')
          break
        }

        case 'Rectangle': {
          naturePoly = 'rectangle'
          let ok = false; let disSave = [0, 0, 0, 1000]; const old = []; let dis
          for (let jj = 0; jj < 20; jj++) {
            const lAB = randint(22, 45, old) * 2 // paire seulement!
            old.push(lAB / 2)
            for (let kk = 0; kk < 20 && !ok; kk++) {
              const lAC = randint(35, 60, lAB)
              const lBC = Math.sqrt(lAC * lAC + lAB * lAB)
              dis = [lAB, lBC, lAC, lBC * 0.1 - Math.floor(lBC /** 0.1 * 10 */) * 0.1]
              if (dis[3] < 0.005) {
                disSave = dis
                ok = true
                break
              } else {
                if (dis[3] < disSave[3]) {
                  disSave = dis
                }
              }
            }
          }
          B = point(dis[0] / 10, 0, nomPoly.charAt(1), 'below right')
          C = pointAdistance(B, dis[1] / 10, 90, nomPoly.charAt(2))
          D = pointAdistance(C, dis[0] / 10, 180, nomPoly.charAt(3))
          figure = polygone(A, B, C, D)
          break
        }

        case 'Rectangle1diag': {
          naturePoly = 'rectangle'
          let ok = false; let disSave = [0, 0, 0, 1000]; const old = []; let dis
          for (let jj = 0; jj < 20; jj++) {
            const lAB = randint(22, 45, old) * 2 // paire seulement!
            old.push(lAB / 2)
            for (let kk = 0; kk < 20 && !ok; kk++) {
              const lBC = randint(lAB + 5, 100)
              const lAC = Math.sqrt(lBC * lBC - lAB * lAB)
              dis = [lAB, lBC, lAC, lAC * 0.1 - Math.floor(lAC /** 0.1 * 10 */) * 0.1]
              if (dis[3] < 0.005) {
                disSave = dis
                ok = true
                break
              } else {
                if (dis[3] < disSave[3]) {
                  disSave = dis
                }
              }
            }
          }

          const diagonale = disSave[1] / 10
          B = point(dis[0] / 10, 0, nomPoly.charAt(1), 'below right')

          C = pointIntersectionLC(droiteParPointEtPerpendiculaire(B, droite(A, B)), cercle(A, diagonale), nomPoly[3], 1)
          C.positionLabel = 'above right'

          D = pointIntersectionLC(droiteParPointEtPerpendiculaire(A, droite(A, B)), cercle(B, diagonale), nomPoly[1], 1)
          D.positionLabel = 'above left'
          figure = polygone(A, B, C, D)
          break
        }

        case 'Losange': {
          naturePoly = 'losange'
          // triangle isocèle donné par deux longueurs et auto-correction
          let ok = false; let disSave = [0, 0, 0, 1000]; const old = []; let dis
          for (let jj = 0; jj < 20; jj++) {
            const base = randint(20, 50, old) * 2 // paire seulement!
            old.push(base / 2)
            for (let kk = 0; kk < 20 && !ok; kk++) {
              const cote = randint(base / 2 + 20, 80, base)
              const diagonale2 = 2 * Math.sqrt(cote * cote * 0.01 / 2 + cote * cote * 0.01 / 2 - base * base * 0.01 / 4)
              dis = [base, cote, cote, diagonale2 - Math.floor(diagonale2 * 10) * 0.1]
              if (dis[3] < 0.005) {
                disSave = dis
                ok = true
                break
              } else {
                if (dis[3] < disSave[3]) {
                  disSave = dis
                }
              }
            }
          }
          const diagonale = disSave[0] / 10
          const cote = disSave[1] / 10
          C = pointAdistance(A, diagonale, randint(-10, 10), nomPoly[2])
          C.positionLabel = 'right'
          const cA = cercle(A, cote)
          const cB = cercle(C, cote)
          B = pointIntersectionCC(cA, cB, nomPoly[1], 2)
          B.positionLabel = 'below'
          D = pointIntersectionCC(cA, cB, nomPoly[3], 1)
          D.positionLabel = 'above'
          figure = polygone(A, B, C, D)
          break
        }
        case 'Losange2diag' : {
          naturePoly = 'losange'
          // triangle rectangle avec deux longueurs et auto-correction
          let ok = false; let disSave = [0, 0, 0, 1000]; const old = []; let dis
          for (let jj = 0; jj < 10; jj++) {
            const lAB = randint(15, 30, old) * 2
            old.push(lAB)
            for (let kk = 0; kk < 20 && !ok; kk++) {
              const lAC = randint(15, 30, lAB) * 2
              const lBC = Math.sqrt(lAC * lAC + lAB * lAB)
              dis = [lAB, lBC, lAC, lAC * 0.1 - Math.floor(lAC /* 0.1 * 10 */) * 0.1]
              if (dis[3] < 0.005) {
                disSave = dis
                ok = true
                break
              } else {
                if (dis[3] < disSave[3]) {
                  disSave = dis
                }
              }
            }
          }
          const diagonale1 = 2 * disSave[0] / 10
          const diagonale2 = 2 * disSave[2] / 10
          C = pointAdistance(A, diagonale1, randint(-10, 10), nomPoly[2])
          C.positionLabel = 'right'
          B = pointIntersectionLC(droiteParPointEtPerpendiculaire(milieu(A, C), droite(A, C)), cercle(milieu(A, C), diagonale2 / 2), nomPoly[1], 2)
          B.positionLabel = 'below'
          D = pointIntersectionLC(droiteParPointEtPerpendiculaire(milieu(A, C), droite(A, C)), cercle(milieu(A, C), diagonale2 / 2), nomPoly[3], 1)
          D.positionLabel = 'above'
          figure = polygone(A, B, C, D)
          break
        }
        case 'Parallélogramme' : {
          naturePoly = 'parallélogramme'
          // triangle quelconque donné par trois longueurs et auto-correction
          const lAB = randint(25, 45) * 2 // paire seulement!
          let ok = false; let disSave = [0, 0, 0, 1000]; const old = []; let dis
          old.push(lAB)
          for (let kk = 0; kk < 10 && !ok; kk++) {
            const lBC = randint(30, 80, old)
            old.push(lBC)
            for (let jj = 0; jj < 30; jj++) {
              const lAC = randint(Math.max(Math.abs(lAB - lBC) + 20, 30), Math.min(lAB + lBC - 20, 150))
              const m = Math.sqrt(lAC * lAC * 0.01 / 2 + lBC * lBC * 0.01 / 2 - lAB * lAB * 0.01 / 4)
              dis = [lAB, lBC, lAC, m - Math.floor(m * 10) * 0.1]
              if (dis[3] < 0.005) {
                disSave = dis
                console.log('i:' + i + ':kk:' + kk + ':jj:' + jj + ':d:' + m + 'dmin:' + dis[3])
                console.log('OK i:' + i + ':kk:' + kk + ':jj:' + jj + ':a:' + lBC + ':b:' + lAC + ':c:' + lAB)
                ok = true
                break
              } else {
                if (dis[3] < disSave[3]) {
                  console.log('i:' + i + ':kk:' + kk + ':jj:' + jj + ':d:' + m + 'dmin:' + dis[3])
                  console.log('i:' + i + ':kk:' + kk + ':jj:' + jj + ':a:' + lBC + ':b:' + lAC + ':c:' + lAB)
                  disSave = dis
                }
              }
            }
          }
          const diagonale1 = disSave[0] / 10
          const cote1 = disSave[1] / 10
          const cote2 = disSave[2] / 10
          C = pointAdistance(A, diagonale1, randint(-10, 10), nomPoly[2])
          C.positionLabel = 'right'
          D = pointIntersectionCC(cercle(A, cote1), cercle(C, cote2), nomPoly[3], 1)
          D.positionLabel = 'above'
          B = pointIntersectionCC(cercle(A, cote2), cercle(C, cote1), nomPoly[1], 2)
          B.positionLabel = 'below'
          figure = polygone(A, B, C, D)
          break
        }
      }
      const aA = listeTypeDeQuestions[i] === 'Carré' || listeTypeDeQuestions[i] === 'Rectangle' ? codageAngleDroit(B, A, D, 'red', 0.7, 1, 0.6, 'red', 0.2) : null
      const aB = listeTypeDeQuestions[i] === 'Carré' || listeTypeDeQuestions[i] === 'Rectangle' ? codageAngleDroit(A, B, C, 'red', 0.7, 1, 0.6, 'red', 0.2) : null
      const aC = listeTypeDeQuestions[i] === 'Carré' || listeTypeDeQuestions[i] === 'Rectangle' ? codageAngleDroit(B, C, D, 'red', 0.7, 1, 0.6, 'red', 0.2) : null
      const aD = listeTypeDeQuestions[i] === 'Carré' || listeTypeDeQuestions[i] === 'Rectangle' ? codageAngleDroit(C, D, A, 'red', 0.7, 1, 0.6, 'red', 0.2) : null
      const aE = listeTypeDeQuestions[i] === 'Losange2diag' || listeTypeDeQuestions[i] === 'Carré1diag' ? codageAngleDroit(C, milieu(A, C), D, 'red', 0.7, 1, 0.6, 'red', 0.2) : null
      const segmentAC = segment(A, C, 'blue')
      const segmentBC = segment(B, D, 'blue')
      const traces2 = tracePoint(A, B, C, D)
      const labels2 = labelPoint(A, B, C, D)
      figure.epaisseur = 2
      objetsCorrection.push(traces2, labels2, figure, aA, aB, aC, aD, aE, segmentAC, segmentBC)
      if (listeTypeDeQuestions[i] === 'Rectangle' || listeTypeDeQuestions[i] === 'Carré') {
        objetsCorrection.push(afficheLongueurSegment(B, A), afficheLongueurSegment(C, B), afficheLongueurSegment(D, C), afficheLongueurSegment(A, D))
        const txt = texteSurSegment(`${A.nom}${C.nom}≃${stringNombre(segment(A, C).longueur, 1)} cm`, milieu(A, C), C, 'blue')
        txt.mathOn = false
        txt.scale = 1.2
        objetsCorrection.push(txt)
      }
      if (listeTypeDeQuestions[i] === 'Carré1diag') {
        const txt = texteSurSegment(`${A.nom}${C.nom}=${stringNombre(segment(A, C).longueur, 1)} cm`, milieu(A, C), C)
        txt.mathOn = false
        const txt2 = texteSurSegment(`${B.nom}${D.nom}=${stringNombre(segment(B, D).longueur, 1)} cm`, milieu(B, D), D)
        txt2.mathOn = false
        const txt3 = texteSurSegment(`${D.nom}${C.nom}≃${stringNombre(segment(D, C).longueur, 1)} cm`, D, C, 'blue')
        txt3.mathOn = false
        txt3.scale = 1.2
        objetsCorrection.push(txt, txt2, txt3)
      }
      if (listeTypeDeQuestions[i] === 'Rectangle1diag') {
        objetsCorrection.push(afficheLongueurSegment(B, A))
        const txt = texteSurSegment(`${A.nom}${C.nom}=${stringNombre(segment(A, C).longueur, 1)} cm`, milieu(A, C), C)
        txt.mathOn = false
        const txt3 = texteSurSegment(`${B.nom}${C.nom}≃${stringNombre(segment(B, C).longueur, 1)} cm`, C, B, 'blue')
        txt3.mathOn = false
        txt3.scale = 1.2
        objetsCorrection.push(txt, txt3)
      }
      if (listeTypeDeQuestions[i] === 'Losange') {
        objetsCorrection.push(afficheLongueurSegment(B, A), afficheLongueurSegment(C, B), afficheLongueurSegment(D, C), afficheLongueurSegment(A, D))
        const txt = texteSurSegment(`${A.nom}${C.nom}=${stringNombre(segment(A, C).longueur, 1)} cm`, milieu(A, C), C)
        txt.mathOn = false
        const txt2 = texteSurSegment(`${B.nom}${D.nom}≃${stringNombre(segment(B, D).longueur, 1)} cm`, milieu(B, D), D, 'blue')
        txt2.mathOn = false
        txt2.scale = 1.2
        objetsCorrection.push(txt, txt2)
      }
      if (listeTypeDeQuestions[i] === 'Losange2diag') {
        const txt = texteSurSegment(`${A.nom}${C.nom}=${stringNombre(segment(A, C).longueur, 1)} cm`, milieu(A, C), C)
        txt.mathOn = false
        const txt2 = texteSurSegment(`${B.nom}${D.nom}=${stringNombre(segment(B, D).longueur, 1)} cm`, milieu(B, D), D)
        txt2.mathOn = false
        const txt3 = texteSurSegment(`${D.nom}${C.nom}≃${stringNombre(segment(D, C).longueur, 1)} cm`, D, C, 'blue')
        txt3.mathOn = false
        txt3.scale = 1.2
        objetsCorrection.push(txt, txt2, txt3)
      }
      if (listeTypeDeQuestions[i] === 'Parallélogramme') {
        const txt = texteSurSegment(`${A.nom}${C.nom}=${stringNombre(segment(A, C).longueur, 1)} cm`, milieu(A, C), C)
        txt.mathOn = false
        const txt2 = texteSurSegment(`${B.nom}${D.nom}≃${stringNombre(segment(B, D).longueur, 1)} cm`, milieu(A, C), B, 'blue')
        txt2.mathOn = false
        txt2.scale = 1.2
        objetsCorrection.push(txt, afficheLongueurSegment(A, D), afficheLongueurSegment(D, C), txt2)
      }

      const anim = new Alea2iep()
      if (listeTypeDeQuestions[i] === 'Rectangle' || listeTypeDeQuestions[i] === 'Carré') {
        anim.recadre(-segment(A, B).longueur, segment(B, C).longueur) // Déplace l'origine du repère (à mettre en premier obligatoirement)
        anim.pointCreer(A, { dx: -0.5, dy: -0.5, label: nomPoly.charAt(0) }) // On déplace les labels des points avec dx et dy
        anim.regleMontrer(A)
        anim.regleSegment(A, B)
        anim.pointCreer(B, { dx: 0.2, dy: -0.5, label: nomPoly.charAt(1) })
        anim.regleMasquer()
        anim.equerreMontrer(B)
        anim.equerreRotation(90)
        anim.crayonMontrer(B)
        anim.tracer(pointAdistance(B, segment(B, C).longueur + 2, 90))
        anim.equerreMasquer()
        anim.codageAngleDroit(A, B, C)
        anim.regleMontrer()
        anim.regleDeplacer(B)
        anim.regleRotation(90)
        anim.crayonMontrer()
        anim.crayonDeplacer(C)
        anim.pointCreer(C, { dx: 0.2, dy: 0.8, label: nomPoly.charAt(2), tempo: 10 })
        anim.crayonMasquer()
        anim.regleMasquer()
        anim.equerreRotation(90)
        anim.equerreMontrer(C)
        anim.crayonMontrer()
        anim.tracer(pointAdistance(C, segment(C, D).longueur + 2, -180))
        anim.codageAngleDroit(B, C, D)
        anim.equerreMasquer()
        anim.regleDeplacer(C)
        anim.regleMontrer()
        anim.regleRotation(180)
        anim.crayonDeplacer(D)
        anim.pointCreer(D, { dx: -0.5, dy: 0.8, label: nomPoly.charAt(3) })
        anim.regleSegment(D, A)
        anim.regleMasquer()
        anim.crayonMasquer()
      } else if (listeTypeDeQuestions[i] === 'Rectangle1diag') {
        anim.recadre(-segment(A, B).longueur, segment(B, C).longueur) // Déplace l'origine du repère (à mettre en premier obligatoirement)
        anim.pointCreer(A, { dx: -0.5, dy: -0.5, label: nomPoly.charAt(0) }) // On déplace les labels des points avec dx et dy
        anim.regleMontrer(A)
        anim.regleSegment(A, B)
        anim.pointCreer(B, { dx: 0.2, dy: -0.5, label: nomPoly.charAt(1) })
        anim.regleMasquer()

        anim.equerreMontrer(B)
        anim.equerreRotation(90)
        anim.crayonMontrer(B)
        anim.tracer(pointAdistance(B, segment(B, C).longueur + 2, 90))
        anim.equerreMasquer()
        anim.codageAngleDroit(A, B, C)

        anim.compasMontrer(A)
        anim.compasEcarterAvecRegle(segment(A, C).longueur)
        anim.regleMasquer()
        anim.compasTracerArcCentrePoint(A, C, 40)
        anim.compasMasquer()

        anim.crayonMontrer(C)
        anim.pointCreer(C, { dx: 0.2, dy: +0.5, label: nomPoly.charAt(2) })

        anim.equerreMontrer(C)
        anim.equerreRotation(90)
        anim.crayonMontrer(C)
        anim.tracer(pointAdistance(C, segment(A, C).longueur + 2, 180))
        anim.equerreMasquer()

        anim.compasMontrer(C)
        anim.compasEcarterAvecRegle(segment(A, B).longueur)
        anim.regleMasquer()
        anim.compasTracerArcCentrePoint(C, D, 40)
        anim.compasMasquer()
        anim.codageAngleDroit(B, C, D)

        anim.crayonMontrer(D)
        anim.pointCreer(D, { dx: -0.2, dy: +0.5, label: nomPoly.charAt(3) })
        anim.regleSegment(A, D)
        anim.regleMasquer()
        anim.crayonMasquer()
        anim.textePoint(`${nomPoly.charAt(1)}${nomPoly.charAt(2)} ≃ ${stringNombre(segment(B, C).longueur, 3, true)} cm`, milieu(B, C))
      } else if (listeTypeDeQuestions[i] === 'Losange' || listeTypeDeQuestions[i] === 'Parallélogramme') {
        anim.recadre(-segment(A, B).longueur, segment(B, D).longueur / 2) // Déplace l'origine du repère (à mettre en premier obligatoirement)
        anim.pointCreer(A, { dx: -0.5, dy: -0.5, label: nomPoly.charAt(0) }) // On déplace les labels des points avec dx et dy
        anim.regleMontrer(A)
        anim.regleSegment(A, C)
        anim.pointCreer(C, { dx: 0.2, dy: -0.5, label: nomPoly.charAt(2) })

        anim.compasMontrer(A)
        anim.compasEcarterAvecRegle(segment(A, B).longueur)
        anim.regleMasquer()
        anim.compasTracerArcCentrePoint(A, B, 40)
        anim.compasEcarterAvecRegle(segment(C, B).longueur)
        anim.regleMasquer()
        anim.compasTracerArcCentrePoint(C, B, 40)
        anim.compasMasquer()

        anim.crayonMontrer()
        anim.pointCreer(B, { dx: 0.2, dy: -0.5, label: nomPoly.charAt(1) })
        anim.regleSegment(A, B)
        anim.regleSegment(C, B)
        anim.crayonMasquer()
        anim.regleMasquer()

        anim.compasMontrer(A)
        anim.compasEcarterAvecRegle(segment(A, D).longueur)
        anim.regleMasquer()
        anim.compasTracerArcCentrePoint(A, D, 40)

        anim.compasMontrer(C)
        anim.compasEcarterAvecRegle(segment(C, D).longueur)
        anim.regleMasquer()
        anim.compasTracerArcCentrePoint(C, D, 40)
        anim.compasMasquer()

        anim.crayonMontrer()
        anim.pointCreer(D, { dx: 0.2, dy: +0.5, label: nomPoly.charAt(3) })
        anim.regleSegment(A, D)
        anim.regleSegment(C, D)
        anim.crayonMasquer()
        anim.regleMasquer()

        anim.regleSegment(B, D)
        anim.regleMasquer()
        anim.textePoint(`${nomPoly.charAt(1)}${nomPoly.charAt(3)} ≃ ${stringNombre(segment(B, D).longueur, 3, true)} cm`, milieu(B, D))
      } else if (listeTypeDeQuestions[i] === 'Losange2diag' || listeTypeDeQuestions[i] === 'Carré1diag') {
        anim.recadre(-segment(A, B).longueur, segment(B, D).longueur) // Déplace l'origine du repère (à mettre en premier obligatoirement)
        anim.pointCreer(A, { dx: -0.5, dy: -0.5, label: nomPoly.charAt(0) }) // On déplace les labels des points avec dx et dy
        anim.regleMontrer(A)
        anim.regleSegment(A, C)
        anim.pointCreer(C, { dx: 0.2, dy: -0.5, label: nomPoly.charAt(2) })

        anim.regleMontrer(A)
        anim.regleRotation(segment(A, C).angleAvecHorizontale)
        anim.crayonMontrer(milieu(A, C))
        anim.pointCreer(milieu(A, C))
        anim.regleMasquer()

        anim.equerreMontrer(milieu(A, C))
        anim.equerreRotation(segment(A, C).angleAvecHorizontale)
        anim.crayonMontrer(milieu(A, C))
        anim.tracer(pointAdistance(milieu(A, C), segment(B, D).longueur / 2 + 2, segment(A, C).angleAvecHorizontale + 90))
        anim.equerreMasquer()

        anim.regleMontrer()
        anim.regleSegment(pointAdistance(milieu(A, C), segment(B, D).longueur / 2 + 2, segment(A, C).angleAvecHorizontale + 270), pointAdistance(milieu(A, C), segment(B, D).longueur / 2 + 2, segment(A, C).angleAvecHorizontale + 90))
        anim.regleMasquer()

        anim.crayonMontrer(milieu(A, C))
        anim.codageAngleDroit(C, milieu(A, C), D)

        anim.regleMontrer(milieu(A, C))
        anim.regleRotation(segment(A, C).angleAvecHorizontale + 90)
        anim.crayonMontrer(D)
        anim.pointCreer(D, { dx: 0.2, dy: +0.5, label: nomPoly.charAt(3) })

        anim.regleDeplacer(milieu(A, C))
        anim.regleRotation(segment(A, C).angleAvecHorizontale + 90 + 180)
        anim.crayonMontrer(B)
        anim.pointCreer(B, { dx: 0.2, dy: -0.5, label: nomPoly.charAt(1) })

        anim.regleDeplacer(A)
        anim.regleSegment(A, B)
        anim.regleDeplacer(B)
        anim.regleSegment(B, C)
        anim.regleDeplacer(D)
        anim.regleSegment(D, C)
        anim.regleDeplacer(A)
        anim.regleSegment(A, D)
        anim.regleMasquer()
        anim.crayonMasquer()

        anim.textePoint(`${nomPoly.charAt(3)}${nomPoly.charAt(2)} ≃ ${stringNombre(segment(A, B).longueur, 3, true)} cm`, milieu(D, C))
      }

      texte = `Construire le ${naturePoly} $${nomPoly}$`
      if (listeTypeDeQuestions[i] === 'Rectangle' || listeTypeDeQuestions[i] === 'Carré') texte += ` avec $${A.nom + B.nom} = ${texNombre(segment(A, B).longueur, 2)}~\\text{cm}$`
      if (listeTypeDeQuestions[i] === 'Rectangle') texte += ` et $${B.nom + C.nom} = ${texNombre(segment(B, C).longueur, 2)}~\\text{cm}$`
      if (listeTypeDeQuestions[i] === 'Losange') texte += ` avec $${A.nom + B.nom} = ${texNombre(segment(A, B).longueur, 2)}~\\text{cm}$ et $${A.nom + C.nom} = ${texNombre(segment(A, C).longueur, 2)}~\\text{cm}$`
      if (listeTypeDeQuestions[i] === 'Losange2diag') texte += ` avec $${A.nom + C.nom} = ${texNombre(segment(A, C).longueur, 2)}~\\text{cm}$ et $${B.nom + D.nom} = ${texNombre(segment(B, D).longueur, 2)}~\\text{cm}$`
      if (listeTypeDeQuestions[i] === 'Carré1diag') texte += ` avec $${A.nom + C.nom} = ${texNombre(segment(A, C).longueur, 2)}~\\text{cm}$`
      if (listeTypeDeQuestions[i] === 'Rectangle1diag') texte += ` avec $${A.nom + B.nom} = ${texNombre(segment(A, B).longueur, 2)}~\\text{cm}$ et $${A.nom + C.nom} = ${texNombre(segment(A, C).longueur, 2)}~\\text{cm}$`
      if (listeTypeDeQuestions[i] === 'Parallélogramme') texte += ` avec $${A.nom + C.nom} = ${texNombre(segment(A, C).longueur, 2)}~\\text{cm}$, $${A.nom + D.nom} = ${texNombre(segment(A, D).longueur, 2)}~\\text{cm}$ et $${D.nom + C.nom} = ${texNombre(segment(D, C).longueur, 2)}~\\text{cm}$`
      texte += '.<br>'
      // Les lignes ci-dessous permettent d'avoir un affichage aux dimensions optimisées
      const xmin = Math.min(A.x, B.x, C.x, D.x) - 2
      const xmax = Math.max(A.x, B.x, C.x, D.x) + 2
      const ymin = Math.min(A.y, B.y, C.y, D.y) - 2
      const ymax = Math.max(A.y, B.y, C.y, D.y) + 2
      // paramètres de la fenêtre Mathalea2d pour l'énoncé normal
      const paramsCorrection = { xmin, ymin, xmax, ymax, pixelsParCm: 20, scale: 1 }
      // On ajoute au texte de la correction, la figure de la correction
      texteCorr = mathalea2d(paramsCorrection, objetsCorrection)
      if (listeTypeDeQuestions[i] === 'Rectangle' || listeTypeDeQuestions[i] === 'Carré') texteCorr += `<br><br>${texteEnCouleur(`Pour l'auto-correction, on peut vérifier que $[${A.nom + C.nom}]$ et $[${B.nom + D.nom}]$ mesurent bien tous les deux $${texNombre(segment(A, C).longueur, 2)}~\\text{cm}$`)}.<br>`
      if (listeTypeDeQuestions[i] === 'Losange') texteCorr += `<br><br>${texteEnCouleur(`Pour l'auto-correction, on peut vérifier que $[${B.nom + D.nom}]$ mesure environ $${texNombre(segment(B, D).longueur, 2)}~\\text{cm}$`)}.<br>`
      if (listeTypeDeQuestions[i] === 'Losange2diag' || listeTypeDeQuestions[i] === 'Carré1diag') texteCorr += `<br><br>${texteEnCouleur(`Pour l'auto-correction, on peut vérifier que tous les côtés du ${naturePoly} mesure environ $${texNombre(segment(A, B).longueur, 2)}~\\text{cm}$`)}.<br>`
      if (listeTypeDeQuestions[i] === 'Rectangle1diag') texteCorr += `<br><br>${texteEnCouleur(`Pour l'auto-correction, on peut vérifier que $[${B.nom + C.nom}]$ mesure environ $${texNombre(segment(B, C).longueur, 2)}~\\text{cm}$`)}.<br>`
      if (listeTypeDeQuestions[i] === 'Parallélogramme') texteCorr += `<br><br>${texteEnCouleur(`Pour l'auto-correction, on peut vérifier que $[${B.nom + D.nom}]$ mesure environ $${texNombre(segment(B, D).longueur, 2)}~\\text{cm}$`)}.<br>`
      texteCorr += anim.htmlBouton(numeroExercice, i)

      // Si la question n'a jamais été posée, on l'enregistre
      if (this.questionJamaisPosee(i, segment(A, B).longueur, segment(B, C).longueur)) { // <- laisser le i et ajouter toutes les variables qui rendent les exercices différents (par exemple a, b, c et d)
        // Dans cet exercice, on n'utilise pas a, b, c et d mais A, B, C et D alors remplace-les !
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
}