exercices/3e/3G30.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import Decimal from 'decimal.js'
import { context } from '../../modules/context.js'
import { homothetie, codageAngle, longueur, barycentre, milieu, latexParPoint, point, polygone, rotation, codageAngleDroit, nommePolygone, segment } from '../../modules/2d.js'
import { texFraction, quatriemeProportionnelle, texNombre, texteEnCouleurEtGras, listeQuestionsToContenu, randint, creerNomDePolygone, combinaisonListes, choice } from '../../modules/outils.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
import Grandeur from '../../modules/Grandeur.js'
export const interactifReady = true
export const interactifType = 'mathLive'
export const amcReady = true
export const amcType = 'AMCOpenNum' // type de question AMC
export const dateDeModifImportante = '21/03/2022'

export const titre = 'Calculer une longueur dans un triangle rectangle en utilisant la trigonométrie'

/**
 * @author Jean-Claude Lhote à partir de 3G30-1 de Rémi Angot
 * 3G30 Exercice remplaçant l'exercice initial utilisant MG32
 * Calculer une longueur en utilisant l'un des trois rapport trigonométrique.
 * * Si this.level=4 alors seul le cosinus sera utilisé.
 * Mars 2021
 * combinaisonListes des questions par Guillaume Valmont le 23/05/2022
 */
export const uuid = 'bd6b1'
export const ref = '3G30'
export default function CalculDeLongueur () {
  Exercice.call(this)
  this.titre = titre
  this.nbQuestions = 3
  this.nbCols = 1
  this.nbColsCorr = 1
  this.sup = false
  this.correctionDetailleeDisponible = true
  this.correctionDetaillee = false
  this.interactif = false
  if (context.isHtml) {
    this.spacing = 0
    this.spacingCorr = 0
  } else {
    this.spacing = 2
    this.spacingCorr = 2
  }

  this.nouvelleVersion = function () {
    this.consigne = ''
    this.autoCorrection = []
    this.listeQuestions = []
    this.listeCorrections = []
    let reponse
    let listeDeNomsDePolygones
    let typeQuestionsDisponibles = ['cosinus', 'sinus', 'tangente', 'invCosinus', 'invSinus', 'invTangente']
    if (this.level === 4) typeQuestionsDisponibles = ['cosinus', 'invCosinus']

    const listeTypeQuestions = combinaisonListes(typeQuestionsDisponibles, this.nbQuestions)
    for (let i = 0; i < this.nbQuestions; i++) {
      const unite = choice(['m', 'cm', 'dm', 'mm'])
      if (i % 3 === 0) listeDeNomsDePolygones = ['QD']
      const nom = creerNomDePolygone(3, listeDeNomsDePolygones)
      listeDeNomsDePolygones.push(nom)
      let texte = ''; let texteCorr = ''; const objetsEnonce = []; const objetsCorrection = []
      let ab, bc, ac

      const angleABC = randint(35, 55)
      const angleABCr = Decimal.acos(-1).div(180).mul(angleABC)
      if (!context.isHtml && this.sup) {
        texte += '\\begin{minipage}{.7\\linewidth}\n'
      }
      switch (listeTypeQuestions[i]) {
        case 'cosinus': // AB=BCxcos(B)
          bc = new Decimal(randint(10, 15))
          ab = Decimal.cos(angleABCr).mul(bc)
          ac = Decimal.sin(angleABCr).mul(bc)
          texte += `Dans le triangle $${nom}$ rectangle en $${nom[0]}$,<br> $${nom[1] + nom[2]}=${bc}$ ${unite} et $\\widehat{${nom}}=${angleABC}\\degree$.<br>`
          texte += `Calculer $${nom[0] + nom[1]}$ à $0,1$ ${unite} près.`
          break
        case 'sinus':
          bc = new Decimal(randint(10, 15))
          ab = Decimal.cos(angleABCr).mul(bc)
          ac = Decimal.sin(angleABCr).mul(bc)
          texte += `Dans le triangle $${nom}$ rectangle en $${nom[0]}$,<br> $${nom[1] + nom[2]}=${bc}$ ${unite} et $\\widehat{${nom}}=${angleABC}\\degree$.<br>`
          texte += `Calculer $${nom[0] + nom[2]}$ à $0,1$ ${unite} près.`
          break
        case 'tangente':
          ab = new Decimal(randint(7, 10))
          ac = Decimal.tan(angleABCr).mul(ab)
          bc = new Decimal(ab).div(Decimal.cos(angleABCr))
          texte += `Dans le triangle $${nom}$ rectangle en $${nom[0]}$,<br> $${nom[0] + nom[1]}=${ab}$ ${unite} et $\\widehat{${nom}}=${angleABC}\\degree$.<br>`
          texte += `Calculer $${nom[0] + nom[2]}$ à $0,1$ ${unite} près.`
          break
        case 'invCosinus':
          ab = new Decimal(randint(7, 10))
          bc = new Decimal(ab).div(Decimal.cos(angleABCr))
          ac = Decimal.sin(angleABCr).mul(bc)
          texte += `Dans le triangle $${nom}$ rectangle en $${nom[0]}$,<br> $${nom[0] + nom[1]}=${ab}$ ${unite} et $\\widehat{${nom}}=${angleABC}\\degree$.<br>`
          texte += `Calculer $${nom[1] + nom[2]}$ à $0,1$ ${unite} près.`
          break
        case 'invSinus':
          ac = new Decimal(randint(7, 10))
          bc = new Decimal(ac).div(Decimal.sin(angleABCr))
          ab = Decimal.cos(angleABCr).mul(bc)
          texte += `Dans le triangle $${nom}$ rectangle en $${nom[0]}$,<br> $${nom[0] + nom[2]}=${ac}$ ${unite} et $\\widehat{${nom}}=${angleABC}\\degree$.<br>`
          texte += `Calculer $${nom[1] + nom[2]}$ à $0,1$ ${unite} près.`
          break
        case 'invTangente':
          ac = new Decimal(randint(7, 10))
          bc = new Decimal(ac).div(Decimal.sin(angleABCr))
          ab = Decimal.cos(angleABCr).mul(bc)
          texte += `Dans le triangle $${nom}$ rectangle en $${nom[0]}$,<br> $${nom[0] + nom[2]}=${ac}$ ${unite} et $\\widehat{${nom}}=${angleABC}\\degree$.<br>`
          texte += `Calculer $${nom[0] + nom[1]}$ à $0,1$ ${unite} près.`
          break
      }

      if (!context.isHtml && this.sup) {
        texte += '\n\\end{minipage}\n'
      }
      const a = point(0, 0)
      const b = point(ab, 0)
      const c = point(0, ac)
      const p1 = polygone(a, b, c)
      // p1.isVisible = false
      const p2 = rotation(p1, a, randint(0, 360))
      const A = p2.listePoints[0]
      const B = p2.listePoints[1]
      const C = p2.listePoints[2]
      const codage = codageAngleDroit(B, A, C)
      A.nom = nom[0]
      B.nom = nom[1]
      C.nom = nom[2]
      const nomme = nommePolygone(p2, nom)
      const hypo = segment(C, B, 'blue')
      hypo.epaisseur = 2
      const codageDeAngle = codageAngle(A, B, C, 2)
      const M1 = milieu(A, B)
      const M2 = milieu(A, C)
      const M3 = milieu(B, C)
      const G = barycentre(p2)
      const m3 = homothetie(M3, G, 1 + 1.5 / longueur(G, M3), 'm3', 'center')
      const m1 = homothetie(M1, M3, 1 + 1.5 / longueur(M3, M1), 'm1', 'center')
      const m2 = homothetie(M2, M3, 1 + 1.5 / longueur(M3, M2), 'm2', 'center')
      let m4
      let t1, t2, t3
      switch (listeTypeQuestions[i]) {
        case 'cosinus': // AB=BCxcos(B)
          t3 = latexParPoint(`${bc} \\text{ ${unite}}`, m3, 'black', 120, 12, '')
          t2 = latexParPoint('?', m1, 'black', 120, 12, '')
          m4 = homothetie(G, B, 2.7 / longueur(B, G), 'B2', 'center')
          t1 = latexParPoint(`${angleABC}\\degree`, m4, 'black', 20, 12, '')
          break
        case 'sinus':
          t3 = latexParPoint(`${bc} \\text{ ${unite}}`, m3, 'black', 120, 12, '')
          t2 = latexParPoint('?', m2, 'black', 120, 12, '')
          m4 = homothetie(G, B, 2.7 / longueur(B, G), 'B2', 'center')
          t1 = latexParPoint(`${angleABC}\\degree`, m4, 'black', 100, 12, '')
          break
        case 'tangente':
          t1 = latexParPoint(`${ab} \\text{ ${unite}}`, m1, 'black', 120, 12, '')
          t2 = latexParPoint('?', m2, 'black', 120, 12, '')
          m4 = homothetie(G, B, 2.7 / longueur(B, G), 'B2', 'center')
          t3 = latexParPoint(`${angleABC}\\degree`, m4, 'black', 100, 12, '')
          break
        case 'invCosinus':
          t1 = latexParPoint(`${ab} \\text{ ${unite}}`, m1, 'black', 120, 12, '')
          t3 = latexParPoint('?', m3, 'black', 120, 12, '')
          m4 = homothetie(G, B, 2.7 / longueur(B, G), 'B2', 'center')
          t2 = latexParPoint(`${angleABC}\\degree`, m4, 'black', 100, 12, '')
          break
        case 'invSinus':
          t2 = latexParPoint(`${ac} \\text{ ${unite}}`, m2, 'black', 120, 12, '')
          t3 = latexParPoint('?', m3, 'black', 120, 12, '')
          m4 = homothetie(G, B, 2.7 / longueur(B, G), 'B2', 'center')
          t1 = latexParPoint(`${angleABC}\\degree`, m4, 'black', 100, 12, '')
          break
        case 'invTangente':
          t2 = latexParPoint(`${ac} \\text{ ${unite}}`, m2, 'black', 120, 12, '')
          t1 = latexParPoint('?', m1, 'black', 120, 12, '')
          m4 = homothetie(G, B, 2.7 / longueur(B, G), 'B2', 'center')
          t3 = latexParPoint(`${angleABC}\\degree`, m4, 'black', 100, 12, '')
          break
      }
      objetsEnonce.push(p2, codage, nomme, t1, t2, t3, codageDeAngle)
      objetsCorrection.push(p2, codage, nomme, t1, t2, t3, hypo, codageDeAngle)

      const paramsEnonce = { xmin: Math.min(A.x, B.x, C.x) - 4, ymin: Math.min(A.y, B.y, C.y) - 4, xmax: Math.max(A.x, B.x, C.x) + 2, ymax: Math.max(A.y, B.y, C.y) + 2, pixelsParCm: 20, scale: 0.37, mainlevee: true, amplitude: context.isHtml ? 0.4 : 1 }
      const paramsCorrection = { xmin: Math.min(A.x, B.x, C.x) - 4, ymin: Math.min(A.y, B.y, C.y) - 4, xmax: Math.max(A.x, B.x, C.x) + 2, ymax: Math.max(A.y, B.y, C.y) + 2, pixelsParCm: 20, scale: 0.35, mainlevee: false }
      if (!context.isHtml && this.sup) {
        texte += '\\begin{minipage}{.3\\linewidth}\n'
      }
      if (this.sup) {
        texte += mathalea2d(paramsEnonce, objetsEnonce) + '<br>'
      }
      if (!context.isHtml && this.correctionDetaillee) {
        texteCorr += '\\begin{minipage}{.4\\linewidth}\n' + mathalea2d(paramsCorrection, objetsCorrection) + '\n\\end{minipage}\n' + '\\begin{minipage}{.7\\linewidth}\n'
      }
      if (!context.isHtml && this.sup) {
        texte += '\n\\end{minipage}\n'
      }
      switch (listeTypeQuestions[i]) {
        case 'cosinus': // AB=BCxcos(B)
          texteCorr += `Dans le triangle $${nom}$ rectangle en $${nom[0]}$,<br> le cosinus de l'angle $\\widehat{${nom}}$ est défini par :<br>`
          texteCorr += `$\\cos\\left(\\widehat{${nom}}\\right)=\\dfrac{${nom[0] + nom[1]}}{${nom[1] + nom[2]}}$.<br>`
          texteCorr += 'Avec les données numériques :<br>'
          texteCorr += `$\\dfrac{\\cos\\left(${angleABC}\\degree\\right)}{\\color{red}{1}}=${texFraction(nom[0] + nom[1], bc)}$<br>`
          texteCorr += `${texteEnCouleurEtGras('Les produits en croix sont égaux, donc ', 'red')}<br>`
          texteCorr += `$${nom[0] + nom[1]}=${quatriemeProportionnelle('\\color{red}{1}', bc, `\\cos\\left(${angleABC}\\degree\\right)`)}$`
          texteCorr += `soit $${nom[0] + nom[1]}\\approx${texNombre(ab, 1)}$ ${unite}.`
          reponse = ab.toDP(1)
          break
        case 'sinus':
          texteCorr += `Dans le triangle $${nom}$ rectangle en $${nom[0]}$,<br> le sinus de l'angle $\\widehat{${nom}}$ est défini par :<br>`
          texteCorr += `$\\sin \\left(\\widehat{${nom}}\\right)=${texFraction(nom[0] + nom[2], nom[1] + nom[2])}$<br>`
          texteCorr += 'Avec les données numériques :<br>'
          texteCorr += `$\\dfrac{\\sin\\left(${angleABC}\\degree\\right)}{\\color{red}{1}}=${texFraction(nom[0] + nom[2], bc)}$<br>`
          texteCorr += `${texteEnCouleurEtGras('Les produits en croix sont égaux, donc ', 'red')}<br>`
          texteCorr += `$${nom[0] + nom[2]}=${quatriemeProportionnelle('\\color{red}{1}', bc, `\\sin\\left(${angleABC}\\degree\\right)`)}$`
          texteCorr += `soit $${nom[0] + nom[2]}\\approx${texNombre(ac, 1)}$ ${unite}.`
          reponse = ac.toDP(1)
          break
        case 'tangente':
          texteCorr += `Dans le triangle $${nom}$ rectangle en $${nom[0]}$,<br> la tangente de l'angle $\\widehat{${nom}}$ est défini par :<br>`
          texteCorr += `$\\tan \\left(\\widehat{${nom}}\\right)=${texFraction(nom[0] + nom[2], nom[0] + nom[1])}$<br>`
          texteCorr += 'Avec les données numériques :<br>'
          texteCorr += `$\\dfrac{\\tan\\left(${angleABC}\\degree\\right)}{\\color{red}{1}}=${texFraction(nom[0] + nom[2], ab)}$<br>`
          texteCorr += `${texteEnCouleurEtGras('Les produits en croix sont égaux, donc ', 'red')}<br>`
          texteCorr += `$${nom[0] + nom[2]}=${quatriemeProportionnelle('\\color{red}{1}', ab, `\\tan\\left(${angleABC}\\degree\\right)`)}$`
          texteCorr += `soit $${nom[0] + nom[2]}\\approx${texNombre(ac, 1)}$ ${unite}.`
          reponse = ac.toDP(1)
          break
        case 'invCosinus':
          texteCorr = `Dans le triangle $${nom}$ rectangle en $${nom[0]}$,<br> le cosinus de l'angle $\\widehat{${nom}}$ est défini par :<br>`
          texteCorr += `$\\cos\\left(\\widehat{${nom}}\\right)=\\dfrac{${nom[0] + nom[1]}}{${nom[1] + nom[2]}}$.<br>`
          texteCorr += 'Avec les données numériques :<br>'
          texteCorr += `$\\dfrac{\\cos\\left(${angleABC}\\degree\\right)}{\\color{red}{1}}=${texFraction(ab, nom[1] + nom[2])}$<br>`
          texteCorr += `${texteEnCouleurEtGras('Les produits en croix sont égaux, donc ', 'red')}<br>`
          texteCorr += `$${nom[1] + nom[2]}=${quatriemeProportionnelle(`\\cos\\left(${angleABC}\\degree\\right)`, ab, '\\color{red}{1}')}$`
          texteCorr += `soit $${nom[1] + nom[2]}\\approx${texNombre(bc, 1)}$ ${unite}.`
          reponse = bc.toDP(1)
          break
        case 'invSinus':
          texteCorr += `Dans le triangle $${nom}$ rectangle en $${nom[0]}$,<br> le sinus de l'angle $\\widehat{${nom}}$ est défini par :<br>`
          texteCorr += `$\\sin \\left(\\widehat{${nom}}\\right)=${texFraction(nom[0] + nom[2], nom[1] + nom[2])}$<br>`
          texteCorr += 'Avec les données numériques :<br>'
          texteCorr += `$\\dfrac{\\sin\\left(${angleABC}\\degree\\right)}{\\color{red}{1}}=${texFraction(ac, nom[1] + nom[2])}$<br>`
          texteCorr += `${texteEnCouleurEtGras('Les produits en croix sont égaux, donc ', 'red')}<br>`
          texteCorr += `$${nom[1] + nom[2]}=${quatriemeProportionnelle(`\\sin\\left(${angleABC}\\degree\\right)`, ac, '\\color{red}{1}')}$`
          texteCorr += `soit $${nom[1] + nom[2]}\\approx${texNombre(bc, 1)}$ ${unite}.`
          reponse = bc.toDP(1)
          break
        case 'invTangente':
          texteCorr += `Dans le triangle $${nom}$ rectangle en $${nom[0]}$,<br> la tangente de l'angle $\\widehat{${nom}}$ est défini par :<br>`
          texteCorr += `$\\tan \\left(\\widehat{${nom}}\\right)=${texFraction(nom[0] + nom[2], nom[0] + nom[1])}$<br>`
          texteCorr += 'Avec les données numériques :<br>'
          texteCorr += `$\\dfrac{\\tan\\left(${angleABC}\\degree\\right)}{\\color{red}{1}}=${texFraction(ac, nom[0] + nom[1])}$<br>`
          texteCorr += `${texteEnCouleurEtGras('Les produits en croix sont égaux, donc ', 'red')}<br>`
          texteCorr += `$${nom[0] + nom[1]}=${quatriemeProportionnelle(`\\tan\\left(${angleABC}\\degree\\right)`, ac, '\\color{red}{1}')}$`
          texteCorr += `soit $${nom[0] + nom[1]}\\approx${texNombre(ab, 1)}$ ${unite}.`
          reponse = ab.toDP(1)
          break
      }
      if (!context.isHtml && this.correctionDetaillee) {
        texteCorr += '\n\\end{minipage}\n'
      }
      /*****************************************************/
      // Pour AMC
      if (context.isAmc) {
        this.autoCorrection[i] = {
          enonce: texte,
          propositions: [
            {
              texte: texteCorr,
              statut: 4,
              feedback: ''
            }
          ],
          reponse: {
            texte: 'résultat',
            valeur: [ab.toDP(1)],
            param: {
              digits: 3,
              decimals: 1,
              signe: false,
              exposantNbChiffres: 0,
              exposantSigne: false,
              approx: 1
            }
          }
        }
      }
      if (context.isHtml) {
        texte += ajouteChampTexteMathLive(this, i, 'largeur25 inline longueur')
        setReponse(this, i, new Grandeur(reponse, unite), { formatInteractif: 'unites' })
      }
      this.listeQuestions.push(texte)
      this.listeCorrections.push(texteCorr)
    }
    listeQuestionsToContenu(this) // On envoie l'exercice à la fonction de mise en page
  }

  this.besoinFormulaireCaseACocher = ['Figure à main levée', false]
}