exercices/6e/6G22-1.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { listeQuestionsToContenu, randint, lettreDepuisChiffre, combinaisonListes, choice } from '../../modules/outils.js'
import { point, tracePoint, longueur, codageAngle, demiDroite, texteParPoint, rotation, homothetie, angle } from '../../modules/2d.js'
import { propositionsQcm } from '../../modules/interactif/questionQcm.js'
import { context } from '../../modules/context.js'
export const interactifReady = true
export const interactifType = 'qcm'
export const amcReady = false
export const titre = 'Connaitre le vocabulaire de base des angles'

export const dateDePublication = '03/12/2022'

/**
 * Connaissance du vocabulaire de base des angles : nom, sommet, côté
 * @author Guillaume Valmont
 * 6G22-1
*/
export const uuid = 'e8d33'
export const ref = '6G22-1'
export default class VocabulaireDeBaseDesAngles extends Exercice {
  constructor () {
    super()
    this.titre = titre
    this.correctionDetailleeDisponible = true
    this.nbColsCorr = 2
    this.nbQuestions = 4
    this.nbQuestionsModifiable = false
  }

  nouvelleVersion () {
    this.listeQuestions = []
    this.listeCorrections = []
    this.autoCorrection = []
    const typeQuestionsDisponibles = ['nom', 'sommet', 'cote', 'autre']
    const listeTypeQuestions = combinaisonListes(typeQuestionsDisponibles, this.nbQuestions)
    const objets2d = []
    const xMin = -4
    const xMax = 4
    const yMin = -3
    const yMax = 3
    const distanceMin = 3
    const indiceNomA = randint(1, 26)
    const indiceNomB = randint(1, 26, [indiceNomA])
    const indiceNomC = randint(1, 26, [indiceNomA, indiceNomB])
    const A = point(randint(xMin, xMax), randint(yMin, yMax), lettreDepuisChiffre(indiceNomA))
    let B = point(randint(xMin, xMax), randint(yMin, yMax), lettreDepuisChiffre(indiceNomB))
    while (longueur(A, B) < distanceMin) {
      B = point(randint(xMin, xMax), randint(yMin, yMax), lettreDepuisChiffre(indiceNomB))
    }
    let C = point(randint(xMin, xMax), randint(yMin, yMax), lettreDepuisChiffre(indiceNomC))
    while (longueur(A, C) < distanceMin || longueur(B, C) < distanceMin || angle(A, B, C) < 10 || angle(A, B, C) > 170) {
      C = point(randint(xMin, xMax), randint(yMin, yMax), lettreDepuisChiffre(indiceNomC))
    }
    const points = [A, B, C]
    const angleABC = codageAngle(A, B, C, 2)
    const demiDroiteBA = demiDroite(B, A)
    const demiDroiteCA = demiDroite(B, C)
    objets2d.push(tracePoint(...points), texteParPoint(A.nom, rotation(A, B, -10)), texteParPoint(C.nom, rotation(C, B, 10)), texteParPoint(B.nom, homothetie(B, A, 1.2)), angleABC, demiDroiteBA, demiDroiteCA)
    // On affiche le cadre mathalea2d
    const pointsX = []
    const pointsY = []
    for (const point of points) {
      pointsX.push(point.x)
      pointsY.push(point.y)
    }
    const xmin = Math.min(...pointsX) - 2
    const xmax = Math.max(...pointsX) + 2
    const ymin = Math.min(...pointsY) - 2
    const ymax = Math.max(...pointsY) + 2
    const parametres2d = { xmin: xmin, ymin: ymin, xmax: xmax, ymax: ymax, pixelsParCm: 20, scale: 0.6 }
    this.introduction = '' + mathalea2d(parametres2d, objets2d)

    for (let i = 0, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      texte = ''
      texteCorr = ''
      // On construit les questions

      const nomDirectCorrect = '\\widehat{' + A.nom + B.nom + C.nom + '}'
      const nomIndirrectIncorrect = '\\widehat{' + B.nom + C.nom + A.nom + '}'
      let questionReponse
      switch (listeTypeQuestions[i]) {
        case 'nom':
          questionReponse =
          {
            question: `$${nomDirectCorrect}$ est :`,
            propositions: ['le sommet', 'un côté', 'le nom de l\'angle', 'rien de cela'],
            reponses: ['le nom de l\'angle'],
            explications: `C'est l'angle qui part de ${A.nom}, qui passe par ${B.nom} et qui va vers ${C.nom}`
          }
          break
        case 'sommet':
          questionReponse =
          {
            question: `$${B.nom}$ est :`,
            propositions: ['le sommet', 'un côté', 'le nom de l\'angle', 'rien de cela'],
            reponses: ['le sommet'],
            explications: 'Le sommet de l\'angle est l\'origine commune des demi-droites qui le forment.'
          }

          break
        case 'cote':
          questionReponse =
          {
            question: `$[${B.nom}${C.nom})$ est :`,
            propositions: ['le sommet', 'un côté', 'le nom de l\'angle', 'rien de cela'],
            reponses: ['un côté'],
            explications: 'Les côtés sont les demi-droites qui forment l\'angle.'
          }

          break
        case 'autre': {
          let question = ''
          let explications = ''
          switch (choice(['sommet', 'cote', 'nom'])) {
            case 'sommet':
              question = `$${A.nom}$ est :`
              explications = 'Le sommet de l\'angle est l\'origine commune des demi-droites qui le forment.'
              break
            case 'cote':
              question = `$${B.nom}${A.nom}$ est :`
              explications = 'Les côtés sont des demi-droites et se notent donc avec un crochet et une parenthèse.'
              break
            case 'nom':
              question = `$${nomIndirrectIncorrect}$ est :`
              explications = `C'est l'angle qui part de ${A.nom}, qui passe par ${B.nom} et qui va vers ${C.nom}, c'est donc l'angle $${nomDirectCorrect}$`
              break
          }
          questionReponse =
          {
            question,
            propositions: ['le sommet', 'un côté', 'le nom de l\'angle', 'rien de cela'],
            reponses: ['rien de cela'],
            explications
          }

          break
        }
      }
      const propositions = []
      for (const proposition of questionReponse.propositions) {
        let statut = false
        for (const reponse of questionReponse.reponses) {
          if (proposition === reponse) statut = true
        }
        propositions.push({
          texte: proposition,
          statut,
          feedback: ''
        })
      }
      this.autoCorrection[i] = {
        enonce: questionReponse.question,
        options: { ordered: true },
        propositions: propositions
      }
      const monQcm = propositionsQcm(this, i)
      texte += context.isAmc ? '' : questionReponse.question + '<br>'
      texte += monQcm.texte
      texteCorr += context.isAmc ? '' : questionReponse.question + '<br>'
      texteCorr += monQcm.texteCorr
      this.correctionDetaillee ? texteCorr += questionReponse.explications + '<br><br>' : texteCorr += '<br>'
      if (this.questionJamaisPosee(i, ...pointsX, ...pointsY, listeTypeQuestions[i])) {
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
}