exercices/4e/4G20.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenu, randint, combinaisonListes, calcul, creerNomDePolygone, arrondi } from '../../modules/outils.js'
import { point, polygone, nommePolygone, rotation, similitude, codageAngleDroit, afficheLongueurSegment, longueur } from '../../modules/2d.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
import Grandeur from '../../modules/Grandeur.js'
import { RedactionPythagore } from './_pythagore.js'
export const titre = 'Calculer une longueur avec le théorème de Pythagore'
export const amcType = 'AMCOpenNum' // Question numérique
export const amcReady = true // Il reste à gérer les options numériques
export const interactifReady = true
export const interactifType = 'mathLive'

// Il existait une version MG32 cf le commit aba9446 https://github.com/mathalea/mathalea/commit/aba9446cb809c140f599c9a6ebd83dea0176da0f

/**
 * Exercices sur le théorème de Pythagore avec MathALEA2D
 * @author Rémi Angot (Factorisation de la rédaction de Pythagore par Eric Elter )
 * 4G20
 */
export const uuid = 'bd660'
export const ref = '4G20'
export default function Pythagore2D () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.amcReady = amcReady
  this.amcType = amcType
  this.interactifReady = interactifReady
  this.interactifType = interactifType
  this.nbQuestions = 3
  this.nbCols = 3
  this.nbColsCorr = 1
  this.sup2 = 3
  this.typeDeQuestion = 'Calculer :'
  this.video = 'M9sceJ8gzNc'
  this.besoinFormulaire2Numerique = ['Côté', 3, '1 : Hypoténuse\n2 : Côté de l\'angle droit\n3 : Mélange']

  this.nouvelleVersion = function () {
    if (this.sup) {
      this.sup = parseInt(this.sup)
    }
    if (this.sup2) {
      this.sup2 = parseInt(this.sup2)
    }
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []
    let listeTypeDeQuestions = []
    if (this.sup2 === 1) {
      listeTypeDeQuestions = ['BC']
    } else if (this.sup2 === 2) {
      listeTypeDeQuestions = ['AB', 'AC']
    } else {
      listeTypeDeQuestions = ['AB', 'BC', 'AC']
    }
    let listeDeNomsDePolygones = []
    let reponse
    if (this.sup === 1) {
      this.consigne = ((context.vue !== 'diap' && this.nbQuestions > 1) ? 'Dans chaque cas, donner' : 'Donner') + " l'égalité de Pythagore."
    } else if (this.sup === 2) {
      this.consigne = ((context.vue !== 'diap' && this.nbQuestions > 1) ? 'Dans chaque cas, compléter' : 'Compléter') + " l'égalité en utilisant le théorème de Pythagore."
    } else {
      this.consigne = ((context.vue !== 'diap' && this.nbQuestions > 1) ? 'Dans chaque cas, calculer' : 'Calculer') + ' la longueur manquante (si nécessaire, l\'arrondir au millimètre près).'
    }
    listeTypeDeQuestions = combinaisonListes(listeTypeDeQuestions, this.nbQuestions)
    for (let i = 0, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      if (i % 5 === 0) listeDeNomsDePolygones = ['QD']
      texte = ''
      texteCorr = ''
      const A1 = point(0, 0)
      const B1 = point(calcul(randint(22, 50) / 10), 0)
      const C1 = similitude(B1, A1, 90, calcul(randint(22, 50) / 10) / longueur(A1, B1))
      const p1 = polygone(A1, B1, C1)
      p1.isVisible = false
      const p2 = rotation(p1, A1, randint(0, 360))
      const A = p2.listePoints[0]
      const B = p2.listePoints[1]
      const C = p2.listePoints[2]
      const codage = codageAngleDroit(B, A, C)
      const xmin = Math.min(A.x, B.x, C.x) - 1
      const ymin = Math.min(A.y, B.y, C.y) - 1
      const xmax = Math.max(A.x, B.x, C.x) + 1
      const ymax = Math.max(A.y, B.y, C.y) + 1
      const nomDuPolygone = creerNomDePolygone(3, listeDeNomsDePolygones)
      listeDeNomsDePolygones.push(nomDuPolygone)
      const nomme = nommePolygone(p2, nomDuPolygone)
      const affAB = afficheLongueurSegment(B, A)
      const affAC = afficheLongueurSegment(A, C)
      const affBC = afficheLongueurSegment(C, B)
      const longueurAB = longueur(A, B, 1)
      const longueurAC = longueur(A, C, 1)
      const longueurBC = longueur(B, C, 1)
      const mesObjetsATracer = [codage, p2, nomme]

      if (this.typeDeQuestion === 'Calculer :' && listeTypeDeQuestions[i] === 'AB') {
        mesObjetsATracer.push(affAC, affBC)
      }
      if (this.typeDeQuestion === 'Calculer :' && listeTypeDeQuestions[i] === 'BC') {
        mesObjetsATracer.push(affAC, affAB)
      }
      if (this.typeDeQuestion === 'Calculer :' && listeTypeDeQuestions[i] === 'AC') {
        mesObjetsATracer.push(affAB, affBC)
      }

      if (!context.isHtml) { texte = '~\\\\' }
      texte += mathalea2d({ xmin, xmax, ymin, ymax, scale: 0.6, style: 'display: block' }, mesObjetsATracer)
      if (this.sup === 2) {
        if (listeTypeDeQuestions[i] === 'AB') {
          texte += `<br>$${A.nom + B.nom}^2=\\ldots$`
          setReponse(this, i, [
            `${B.nom + C.nom}^2-${A.nom + C.nom}^2`,
            `${C.nom + B.nom}^2-${A.nom + C.nom}^2`,
            `${B.nom + C.nom}^2-${C.nom + A.nom}^2`,
            `${C.nom + B.nom}^2-${C.nom + A.nom}^2`
          ], { formatInteractif: 'texte' })
        }
        if (listeTypeDeQuestions[i] === 'BC') {
          texte += `<br>$${B.nom + C.nom}^2=\\ldots$`
          setReponse(this, i, [
            `${A.nom + B.nom}^2+${A.nom + C.nom}^2`,
            `${B.nom + A.nom}^2+${A.nom + C.nom}^2`,
            `${A.nom + B.nom}^2+${C.nom + A.nom}^2`,
            `${B.nom + A.nom}^2+${C.nom + A.nom}^2`,
            //
            `${A.nom + C.nom}^2+${A.nom + B.nom}^2`,
            `${A.nom + C.nom}^2+${B.nom + A.nom}^2`,
            `${C.nom + A.nom}^2+${A.nom + B.nom}^2`,
            `${C.nom + A.nom}^2+${B.nom + A.nom}^2`
          ], { formatInteractif: 'texte' })
        }
        if (listeTypeDeQuestions[i] === 'AC') {
          setReponse(this, i, [
            `${B.nom + C.nom}^2-${A.nom + B.nom}^2`,
            `${C.nom + B.nom}^2-${A.nom + B.nom}^2`,
            `${B.nom + C.nom}^2-${B.nom + A.nom}^2`,
            `${C.nom + B.nom}^2-${B.nom + A.nom}^2`
          ], { formatInteractif: 'texte' })
          texte += `<br>$${A.nom + C.nom}^2=\\ldots$`
        }
      }
      if (!context.isHtml && !context.isAmc && i !== this.nbQuestions - 1) { texte += '\\columnbreak' } // pour la sortie LaTeX sauf la dernière question

      // texteCorr = `Le triangle $${nomDuPolygone}$ est rectangle en $${A.nom}$ donc d'après le théorème de Pythagore, on a : `
      // texteCorr += `$${B.nom + C.nom}^2=${A.nom + B.nom}^2+${A.nom + C.nom}^2$`
      if (this.typeDeQuestion === '' && this.sup === 1) {
        setReponse(this, i, [
        `${B.nom + C.nom}^2=${A.nom + B.nom}^2+${A.nom + C.nom}^2`,
        `${C.nom + B.nom}^2=${A.nom + B.nom}^2+${A.nom + C.nom}^2`,
        `${B.nom + C.nom}^2=${B.nom + A.nom}^2+${A.nom + C.nom}^2`,
        `${C.nom + B.nom}^2=${B.nom + A.nom}^2+${A.nom + C.nom}^2`,
        `${B.nom + C.nom}^2=${A.nom + B.nom}^2+${C.nom + A.nom}^2`,
        `${C.nom + B.nom}^2=${A.nom + B.nom}^2+${C.nom + A.nom}^2`,
        `${B.nom + C.nom}^2=${B.nom + A.nom}^2+${C.nom + A.nom}^2`,
        `${C.nom + B.nom}^2=${B.nom + A.nom}^2+${C.nom + A.nom}^2`,
        //
        `${B.nom + C.nom}^2=${A.nom + C.nom}^2+${A.nom + B.nom}^2`,
        `${C.nom + B.nom}^2=${A.nom + C.nom}^2+${A.nom + B.nom}^2`,
        `${B.nom + C.nom}^2=${A.nom + C.nom}^2+${B.nom + A.nom}^2`,
        `${C.nom + B.nom}^2=${A.nom + C.nom}^2+${B.nom + A.nom}^2`,
        `${B.nom + C.nom}^2=${C.nom + A.nom}^2+${A.nom + B.nom}^2`,
        `${C.nom + B.nom}^2=${C.nom + A.nom}^2+${A.nom + B.nom}^2`,
        `${B.nom + C.nom}^2=${C.nom + A.nom}^2+${B.nom + A.nom}^2`,
        `${C.nom + B.nom}^2=${C.nom + A.nom}^2+${B.nom + A.nom}^2`,
        // en commençant par la somme
        `${A.nom + B.nom}^2+${A.nom + C.nom}^2=${B.nom + C.nom}^2`,
        `${A.nom + B.nom}^2+${A.nom + C.nom}^2=${C.nom + B.nom}^2`,
        `${B.nom + A.nom}^2+${A.nom + C.nom}^2=${B.nom + C.nom}^2`,
        `${B.nom + A.nom}^2+${A.nom + C.nom}^2=${C.nom + B.nom}^2`,
        `${A.nom + B.nom}^2+${C.nom + A.nom}^2=${B.nom + C.nom}^2`,
        `${A.nom + B.nom}^2+${C.nom + A.nom}^2=${C.nom + B.nom}^2`,
        `${B.nom + A.nom}^2+${C.nom + A.nom}^2=${B.nom + C.nom}^2`,
        `${B.nom + A.nom}^2+${C.nom + A.nom}^2=${C.nom + B.nom}^2`,
        //
        `${A.nom + C.nom}^2+${A.nom + B.nom}^2=${B.nom + C.nom}^2`,
        `${A.nom + C.nom}^2+${A.nom + B.nom}^2=${C.nom + B.nom}^2`,
        `${A.nom + C.nom}^2+${B.nom + A.nom}^2=${B.nom + C.nom}^2`,
        `${A.nom + C.nom}^2+${B.nom + A.nom}^2=${C.nom + B.nom}^2`,
        `${C.nom + A.nom}^2+${A.nom + B.nom}^2=${B.nom + C.nom}^2`,
        `${C.nom + A.nom}^2+${A.nom + B.nom}^2=${C.nom + B.nom}^2`,
        `${C.nom + A.nom}^2+${B.nom + A.nom}^2=${B.nom + C.nom}^2`,
        `${C.nom + A.nom}^2+${B.nom + A.nom}^2=${C.nom + B.nom}^2`], { formatInteractif: 'texte' })
      }
      if (this.sup === 2) {
        if (listeTypeDeQuestions[i] === 'AB') {
          texteCorr += ` d'où $${A.nom + B.nom}^2=${B.nom + C.nom}^2-${A.nom + C.nom}^2$.`
        }
        if (listeTypeDeQuestions[i] === 'BC') {
          texteCorr += '.'
        }
        if (listeTypeDeQuestions[i] === 'AC') {
          texteCorr += ` d'où $${A.nom + C.nom}^2=${B.nom + C.nom}^2-${A.nom + B.nom}^2$.`
        }
      }
      let redaction
      if (this.typeDeQuestion === 'Calculer :') {
        if (listeTypeDeQuestions[i] === 'AB') {
          reponse = arrondi(Math.sqrt(longueurBC ** 2 - longueurAC ** 2), 1)
          redaction = RedactionPythagore(A.nom, B.nom, C.nom, false, reponse, longueurAC, longueurBC)
        } else if (listeTypeDeQuestions[i] === 'BC') {
          reponse = arrondi(Math.sqrt(longueurAB ** 2 + longueurAC ** 2), 1)
          redaction = RedactionPythagore(A.nom, B.nom, C.nom, true, longueurAB, longueurAC, reponse)
        } else { // listeTypeDeQuestions[i] === 'AC'
          reponse = arrondi(Math.sqrt(longueurBC ** 2 - longueurAB ** 2), 1)
          redaction = RedactionPythagore(A.nom, C.nom, B.nom, false, reponse, longueurAB, longueurBC)
        }
        texteCorr = redaction[0]
        texte += this.interactif ? (`$${A.nom + C.nom} ${redaction[1]}$` + ajouteChampTexteMathLive(this, i, 'largeur25 inline nospacebefore unites[longueurs]')) : ''
        context.isAmc ? setReponse(this, i, reponse) : setReponse(this, i, new Grandeur(reponse, 'cm'), { formatInteractif: 'unites', precision: 0.001 })

        if (context.isAmc) {
          this.autoCorrection[i].propositions = [{ statut: 3, texte: texteCorr }]
          this.autoCorrection[i].enonce = 'Calculer la longueur manquante.\\\\' + texte
        }
      } else {
        reponse = []
        const hypotenuse = [`${B.nom + C.nom}^2`, `${C.nom + B.nom}^2`]
        const cote1 = [`${B.nom + A.nom}^2`, `${A.nom + B.nom}^2`]
        const cote2 = [`${C.nom + A.nom}^2`, `${A.nom + C.nom}^2`]
        for (let j = 0; j < 2; j++) {
          for (let k = 0; k < 2; k++) {
            for (let m = 0; m < 2; m++) {
              reponse.push(hypotenuse[j] + '=' + cote1[k] + '+' + cote2[m])
              reponse.push(hypotenuse[j] + '=' + cote2[m] + '+' + cote1[k])
              reponse.push(cote1[k] + '+' + cote2[m] + '=' + hypotenuse[j])
              reponse.push(cote2[m] + '+' + cote1[k] + '=' + hypotenuse[j])
            }
          }
        }

        setReponse(this, i, reponse)
        texte += ajouteChampTexteMathLive(this, i)
      }

      if (this.listeQuestions.indexOf(texte) === -1) {
        // Si la question n'a jamais été posée, on en créé une autre
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
}