exercices/6e/6G23-3.js

import Exercice from '../Exercice.js'
import { listeQuestionsToContenu, randint, calcul, creerNomDePolygone, texNombre, contraindreValeur } from '../../modules/outils.js'
import { point, pointSurSegment, pointIntersectionDD, droite, segment, rotation, longueur } from '../../modules/2d.js'
import Alea2iep from '../../modules/Alea2iep.js'

// Les exports suivants sont optionnels mais au moins la date de publication semble essentielle
export const dateDePublication = '04/03/2022' // La date de publication initiale au format 'jj/mm/aaaa' pour affichage temporaire d'un tag

export const titre = 'Tracer un triangle dont on connaît une longueur et 2 angles (angles aigus et/ou obtus)'

/**
 * Tracer un triangle dont on connaît une longueur et 2 angles (angles aigus et/ou obtus)
 * @author Mickael Guironnet - Rémi Angot
 * Références 6G23-2 et 5G20-2git
 */
export const uuid = '73630'
export const ref = '6G23-3'
export default function TracerTriangle2Angles () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.consigne = ''
  this.nbQuestions = 3
  this.nbCols = 1
  this.nbColsCorr = 1
  this.typeExercice = 'IEP'
  this.sup = false
  this.sup3 = 0 // Type de question

  this.nouvelleVersion = function () {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []
    let listeDeNomsDePolygones
    if (!this.sup3) { // Si aucune liste n'est saisie
      this.sup3 = 0
    }
    if (typeof (this.sup3) === 'number') { // Si c'est un nombre c'est que le nombre a été saisi dans la barre d'adresses
      this.sup3 = contraindreValeur(0, 2, this.sup3, 0)
    } else {
      this.sup3 = contraindreValeur(0, 2, parseInt(this.sup3), 0)
    }

    for (
      let i = 0, texte, texteCorr, cpt = 0;
      i < this.nbQuestions && cpt < 50;

    ) {
      if (i % 5 === 0) listeDeNomsDePolygones = ['PQD']

      const c = calcul(randint(40, 70) / 10)
      const b = calcul(randint(40, 80) / 10)
      let ang1
      if (this.sup3 === 0) {
        ang1 = randint(20, 140)
      } else if (this.sup3 === 1) {
        ang1 = randint(20, 80)
      } else {
        ang1 = randint(90, 140)
      }
      const a = calcul(Math.sqrt(c * c + b * b - 2 * c * b * Math.cos(ang1 * Math.PI / 180.0)))
      const ang2 = calcul(180 * Math.acos((b * b - a * a - c * c) / (-2 * a * c)) / Math.PI, 0)
      let angle1, angle2
      if (randint(0, 1) === 0) {
        angle1 = ang1
        angle2 = ang2
      } else {
        angle1 = ang2
        angle2 = ang1
      }

      const p = creerNomDePolygone(3, listeDeNomsDePolygones)
      listeDeNomsDePolygones.push(p)
      texte = `Tracer un triangle $${p}$ tel que $${p[0] + p[1]}=${texNombre(c)}$ cm, $\\widehat{${p[1] + p[0] + p[2]
        }}=${angle1}\\degree$ et $\\widehat{${p[0] + p[1] + p[2]
        }}=${angle2}\\degree$.`
      texte += `<br> Mesurer $${p[0] + p[2]}$,  $${p[1] + p[2]}$ et $\\widehat{${p[0] + p[2] + p[1]}}$`
      // const A0 = point(0, 0, p[0], 'left')
      const B0 = point(c, 0, p[1], 'right')

      // const s0 = segmentAvecExtremites(A0, B0)
      // const t1 = afficheLongueurSegment(B0, A0)

      const A1 = point(B0.x + 4, 0, p[0], 'left')
      const B1 = point(A1.x + c, 0, p[1], 'right')
      const s1 = segment(A1, B1)
      s1.styleExtremites = '-|'
      // const c1 = rotation(B1, A1, angle1)
      // const C1 = pointSurSegment(c1, A1, -3)
      // const s2 = segment(A1, C1)
      // const t2 = afficheMesureAngle(B1, A1, C1)

      const A2 = point(B1.x + 4, 0, p[0], 'left')
      const B2 = point(A2.x + c, 0, p[1], 'right')
      // const s3 = segment(A2, B2)
      const c2 = rotation(B2, A2, angle1)
      const C2 = pointSurSegment(c2, A2, -3)
      // const s4 = segment(A2, C2)
      const c3 = rotation(A2, B2, -angle2)
      const C3 = pointSurSegment(c3, B2, -3)
      // const t3 = afficheMesureAngle(A2, B2, C3)
      // const s5 = segment(B2, C3)
      const d1 = droite(A2, C2)
      d1.isVisible = false
      const d2 = droite(B2, C3)
      d2.isVisible = false
      const C = pointIntersectionDD(d1, d2, p[2])
      // const l = labelPoint(A0, B0, A1, B1, A2, B2, C)

      // if (context.isHtml) {
      //   texteCorr = mathalea2d(
      //     { xmin: -1, xmax: 3 * c + 10, ymin: -1, ymax: 10 }, s0, s1, s2, s3, s4, s5, t1, t2, t3, l)
      //   texteCorr += '<br><br>'
      // } else {
      //   texteCorr = ''
      // }
      if (this.sup) {
        texteCorr = ''
      } else {
        texteCorr = `$${p[0] + p[2]}\\approx${texNombre(longueur(A2, C, 1))}$ cm et $${p[1] + p[2]}\\approx${texNombre(longueur(B2, C, 1))}$ cm`
        texteCorr += ` et $\\widehat{${p[1] + p[2] + p[0]
          }}=${180 - angle1 - angle2}\\degree$ `
      }
      const anim = new Alea2iep()
      anim.triangle1longueur2angles(p, c, angle1, angle2, true, true) // description et longueur
      texteCorr += anim.htmlBouton(this.numeroExercice, i)

      if (this.listeQuestions.indexOf(texte) === -1) {
        // Si la question n'a jamais été posée, on en crée une autre
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireCaseACocher = ["Longueurs données qu'à la fin de l'animation"]
  this.besoinFormulaire3Texte = [
    'Type de question', [
      '0 : Mélange',
      '1 : deux angles aigus',
      '2 : un angle obtus et un angle aigu'
    ].join('\n')
  ]
}