exercices/1e/1E12-1.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { listeQuestionsToContenu, randint, combinaisonListes, lettreMinusculeDepuisChiffre, premierMultipleInferieur, premierMultipleSuperieur } from '../../modules/outils.js'
import { repere, courbe } from '../../modules/2d.js'
import { calcule } from '../../modules/fonctionsMaths.js'

export const titre = 'Lecture graphique d\'éléments caractéristiques d\'un trinôme'

/**
 * @author Jean-Léon Henry (modifié par EE pour corriger exo et remplacer Repere et Courbe par Repere2 et Courbe2 (juillet 2022))
 * Faire lire sur un graphique :
 * - le signe du coefficient dominant
 * - les racines
 * - les coordonnées du sommet et/ou la valeur de l'extremum
 * - les 3 trucs précédents
 * référence 1E12-1
 */
export const uuid = 'a896e'
export const ref = '1E12-1'
export default function LireElementsCarac () {
  Exercice.call(this)
  this.nbQuestions = 5 // Nombre de questions par défaut
  this.sup = 4

  this.nouvelleVersion = function (numeroExercice) {
    this.consigne = 'Répondre à '
    this.consigne += this.nbQuestions > 1 ? 'ces questions' : 'cette question'
    this.consigne += ' par lecture graphique.'
    const pixelsParCm = 20
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    let typesDeQuestionsDisponibles
    if (this.sup < 4) typesDeQuestionsDisponibles = [parseInt(this.sup)]
    else typesDeQuestionsDisponibles = [1, 2, 3]
    const fName = []
    const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions)
    let Ymin; let Yscale; let Ymax
    let Xmin; let Xmax
    for (let i = 0, texte, texteCorr, a, b, c, x1, x2, alpha, beta, f, r, svgYmin, svgYmax, F, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      fName.push(lettreMinusculeDepuisChiffre(i + 6))
      texteCorr = ''
      a = randint(-2, 2, 0) // On prend a au hasard quoi qu'il arrive
      // Générons les coefficients du trinôme, la consigne, la correction
      switch (listeTypeDeQuestions[i]) {
        case 1: // Signe du coefficient dominant
          texte = 'Quel est le signe du coefficient dominant'
          // On choisit 2 racines entières distinctes dans [-10;10]
          x1 = randint(-10, 10)
          x2 = randint(-10, 10, x1)// Flemme de coder la gestion d'une racine double
          // On fabrique les coeffs à partir des racines
          b = -a * (x1 + x2)
          c = x1 * x2 * a

          texteCorr = `La parabole est orientée vers le ${a < 0 ? 'bas' : 'haut'}, on en déduit que le coefficient dominant de $\\mathscr{${fName[i]}}$ est ${a < 0 ? 'négatif' : 'positif'}.`
          break
        case 2: // Racines
          texte = 'Quelles sont les racines'
          // On choisit 2 racines entières distinctes dans [-10;10]
          x1 = randint(-10, 10)
          x2 = randint(-10, 10, x1)// Flemme de coder la gestion d'une racine double
          // On fabrique les coeffs à partir des racines
          b = -a * (x1 + x2)
          c = x1 * x2 * a

          texteCorr = `La courbe de $\\mathscr{${fName[i]}}$ coupe l'axe horizontal aux points $(${Math.min(x1, x2)};0)$ et $(${Math.max(x1, x2)};0)$. Les deux racines sont donc $${Math.min(x1, x2)}$ et $${Math.max(x1, x2)}$.`
          break
        case 3: // Coordonnées du sommet
          texte = 'Quelles sont les coordonnées du sommet'
          // On choisit le sommet au hasard
          alpha = randint(-5, 5)
          beta = randint(-5, 5)
          // On fabrique les coefficients
          b = -2 * a * alpha
          c = a * alpha ** 2 + beta

          texteCorr = `Le sommet, c'est-à-dire le point le plus ${a > 0 ? 'bas' : 'haut'} de la parabole, a pour coordonnées $(${alpha};${beta})$.`
          break
      }
      // Les coeffs sont générés, on peut donc créer la fonction
      f = function (x) {
        return calcule(a * x ** 2 + b * x + c)
      }
      texte += ` de la fonction polynomiale $\\mathscr{${fName[i]}}$ du second degré représentée ci-dessous ?<br>`
      /** Génération du graphique
       * a = randint(-2,2,0)
       * Q1,Q2 :
       *    deux racines dans [-9;9]
       * Q3 :
       *    le sommet dans le carré [-9;9]²
      */

      if (listeTypeDeQuestions[i] === 3) {
        Xmin = alpha - 5
        Xmax = alpha + 5
        Ymin = beta - 5
        Ymax = beta + 5
      } else {
        Xmin = Math.min(x1, x2) - 2
        Xmax = Math.max(x1, x2) + 2
        if (a < 0) {
          Ymax = Math.ceil(f(-b / (2 * a)) + 2)
          Ymin = f(Xmin)
        } else {
          Ymin = Math.floor(f(-b / (2 * a)) - 2)
          Ymax = f(Xmax)
        }
      }

      if (Ymax - Ymin < 10) Yscale = 2
      else Yscale = Math.max(1, Math.round(Math.ceil((Ymax - Ymin) / 10) / 5) * 5) * 2
      if (listeTypeDeQuestions[i] === 3) {
        // Nécessaire pour permettre la lecture graphique
        Yscale = 1
      }
      r = repere({
        xMmin: Xmin,
        yMin: premierMultipleInferieur(Yscale, Ymin),
        yMax: premierMultipleSuperieur(Yscale, Ymax),
        xMax: Xmax,
        yUnite: 1 / Yscale,
        yThickDistance: Yscale,
        grilleYDistance: Yscale,
        yLabelEcart: 0.8
      })

      svgYmin = Math.min(calcule(Ymin / Yscale), -1)
      svgYmax = Math.max(calcule(Ymax / Yscale), 1)

      F = x => a * x ** 2 + b * x + c

      texte += mathalea2d({
        xmin: Xmin - 1,
        xmax: Xmax + 1,
        ymin: svgYmin,
        ymax: svgYmax + 2,
        pixelsParCm,
        scale: 0.6
      }, r,
      courbe(F, { repere: r, xMin: Xmin, xMax: Xmax, color: 'blue', epaisseur: 1.5 }))

      if (this.questionJamaisPosee(i, a, b, c)) {
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireNumerique = ['Type de questions ', 4, '1 : Signe du coefficient dominant\n2 : Racines\n3 : Coordonnées du sommet\n4 : Mélange des trois type de questions']
}