exercices/1e/1G10.js

import Exercice from '../Exercice.js'
import { listeQuestionsToContenu, combinaisonListes, shuffle, contraindreValeur } from '../../modules/outils.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { context } from '../../modules/context.js'
import { valeursTrigo } from '../../modules/fonctionsMaths.js'
import { cercleTrigo } from '../../modules/2d.js'
export const titre = 'Valeurs remarquables du cosinus et sinus'
export const interactifReady = true
export const interactifType = 'mathLive'
// Les exports suivants sont optionnels mais au moins la date de publication semble essentielle
export const dateDePublication = '16/04/2022' // La date de publication initiale au format 'jj/mm/aaaa' pour affichage temporaire d'un tag
export const dateDeModifImportante = '' // Une date de modification importante au format 'jj/mm/aaaa' pour affichage temporaire d'un tag
/** import { valeursTrigo } from './../../modules/fonctionsMaths';
import { rangeMinMax } from './../../../../build/modules/outils';
import { contraindreValeur } from './../../../../www/build/modules/outils';

 * donner les valeurs remarquables du cosinus et du sinus avec trois niveaux :
 * 1 : quart de cercle trigo, 2 : avec les angles associés, 3 : avec les angles modulo 2kpi.
 * @author Stéphane Guyon - Jean Claude Lhote - Loïc Geeraerts
 * Référence 1G10
*/

export const uuid = '4e684'
export const ref = '1G10'
export default class CosEtsin extends Exercice { // Héritage de la classe Exercice()
  constructor () {
    super()
    this.consigne = 'Déterminer la valeur exacte de :'
    this.nbQuestions = 3 // Nombre de questions par défaut
    this.nbCols = 2 // Uniquement pour la sortie LaTeX
    this.nbColsCorr = 2 // Uniquement pour la sortie LaTeX
    this.video = '' // Id YouTube ou url
    this.sup = 1 // difficulté par défaut
    this.sup2 = '-1,1'
    this.besoinFormulaireNumerique = ['Niveau de difficulté', 3, '1 : Quart de cercle trigo\n2 : Avec les angles associés \n3 : Avec en plus des angles modulo k × 360']
    this.besoinFormulaire2Texte = ['Valeurs de k', 'Valeurs entières non nulles séparées par des virgules']
    // TODO: ajouter tangente avec paramètre caché
    // TODO: ajouter cercle trigonométrique
    // TODO: solutionnaire détaillé
    // TODO: Peut-être mettre en paramètre l'étendue des modulos pour avoir un contrôle sur le niveau de difficulté
  }

  nouvelleVersion (numeroExercice) {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []
    let mesAnglesAleatoires = []
    this.sup = contraindreValeur(1, 3, this.sup, 1)
    let listeK = [-1, 1]
    if (this.sup === 3) {
      listeK = this.sup2.split(',')
      for (let k = 0; k < listeK.length; k++) {
        const n = parseInt(listeK[k])
        if (n !== 0 && listeK.indexOf(n) === -1) {
          listeK[k] = n
        }
      }
    }
    const mesAngles = valeursTrigo({ associes: true, modulos: listeK })
    if (this.nbQuestions > 10 && this.sup === 1) this.nbQuestions = 10 // on bride car il n'y a que 10 question différentes au niveau 1
    else if (this.nbQuestions > 26 && this.sup === 2) this.nbQuestions = 26 // Le bridage est un peu plus large pour le niveau 2
    else if (this.nbQuestions > 126) this.nbQuestions = 126 // là c'est carrément l'opulence avec le niveau 3 !
    if (this.sup === 1) {
      mesAnglesAleatoires = shuffle(mesAngles.liste1)
    }
    if (this.sup === 2) {
      mesAnglesAleatoires = shuffle(mesAngles.liste2)
    }
    if (this.sup === 3) {
      mesAnglesAleatoires = shuffle(mesAngles.liste3)
    }

    const typeQuestionsDisponibles = []
    for (let i = 0; i < mesAnglesAleatoires.length; i++) {
      typeQuestionsDisponibles.push(['cos', mesAnglesAleatoires[i]])
      typeQuestionsDisponibles.push(['sin', mesAnglesAleatoires[i]])
    }

    const listeTypeQuestions = combinaisonListes(typeQuestionsDisponibles, this.nbQuestions)
    for (let i = 0, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 127;) {
      const monAngle = listeTypeQuestions[i][1]

      texte = `$\\${listeTypeQuestions[i][0]}\\left(${monAngle.radians}\\right)$`
      texte += ajouteChampTexteMathLive(this, i, 'largeur15 inline', { texte: ' = ' })
      texteCorr = `$\\${listeTypeQuestions[i][0]}\\left(${monAngle.radians}\\right)`
      let valeurFonction = ''
      // listeTypeQuestions[i][0] contient 'cos' ou 'sin', donc ça permet d'atteindre la propriété souhaitée dans l'objet Angle.
      // monAngle[listeTypeQuestions[i][0]] fait référence à monAngle.cos ou à monAngle.sin selon la valeur de listeTypeQuestions[i][0].

      setReponse(this, i, monAngle[listeTypeQuestions[i][0]], { formatInteractif: 'calcul' })
      // dans quelques cas, les valeurs de cos et sin sont multiples et contenues dans une liste avec en premier '1/2', en deuxième la valeur décimale '0.5'
      valeurFonction = Array.isArray(monAngle[listeTypeQuestions[i][0]]) ? monAngle[listeTypeQuestions[i][0]][0] : monAngle[listeTypeQuestions[i][0]]
      texteCorr += `=${valeurFonction}$`

      texteCorr += '<br><br>'
      texteCorr += cercleTrigo(monAngle, listeTypeQuestions[i][0])

      // Si la question n'a jamais été posée, on l'enregistre
      if (this.questionJamaisPosee(i, listeTypeQuestions[i][0][0], listeTypeQuestions[i][1].radians)) { // On regarde l'angle en radian et le type de fonction
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)

        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this) // On envoie l'exercice à la fonction de mise en page
    if (!context.isHtml) {
      this.canEnonce = 'Donner la valeur exacte de ' + this.listeQuestions[0] + '.'
      this.correction = this.listeCorrections[0]
      this.canReponseACompleter = ''
    }
  }
}