exercices/2e/2F10-3.js

import Exercice from '../Exercice.js'
import { mathalea2d, colorToLatexOrHTML } from '../../modules/2dGeneralites.js'
import { listeQuestionsToContenu, randint, reduireAxPlusB, choice, ecritureAlgebrique, ecritureParentheseSiNegatif, texFractionReduite } from '../../modules/outils.js'
import { repere, droite, point, tracePoint, labelPoint, texteParPosition } from '../../modules/2d.js'
import { min, max } from 'mathjs'

export const titre = 'Représentation graphique d\'une fonction affine'

/**
* @author Stéphane Guyon
* 2F10-3
*/
export const uuid = 'c360e'
export const ref = '2F10-3'
export default function Representerfonctionaffine () {
  Exercice.call(this)
  this.titre = titre
  this.consigne = 'Représenter graphiquement ' + (this.nbQuestions === 1 ? 'la fonction affine suivante  $f$ définie' : 'les fonctions affines suivantes  $f$ définies') + ' sur $\\mathbb R$ par :'
  this.nbQuestions = 3 // On complète le nb de questions
  this.nbCols = 1
  this.nbColsCorr = 1
  this.tailleDiaporama = 3
  this.video = ''
  this.spacing = 1
  this.spacingCorr = 1
  this.sup = 1

  this.nouvelleVersion = function () {
    this.sup = parseInt(this.sup)
    this.listeQuestions = []
    this.listeCorrections = []
    // let typesDeQuestionsDisponibles = []
    // typesDeQuestionsDisponibles = [1, 2]// On complète selon le nb de cas dans l'exo (switch)

    // const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions)
    const o = texteParPosition('O', -0.5, -0.5, 'milieu', 'black', 1)
    for (let i = 0, a, b, r, c, d, tA, lA, tB, lB, xA, yA, xB, yB, f, lC, texte, texteCorr, cadre, cadreFenetreSvg, cpt = 0;
      i < this.nbQuestions && cpt < 50;) { // on rajoute les variables dont on a besoin
      // typesDeQuestions = listeTypeDeQuestions[i]
      if (this.sup === 1) {
        f = (x) => a * x + b
        a = randint(0, 3, [0]) * choice([-1, 1])// coefficient non nul a de la fonction affine
        b = randint(0, 3, [0]) * choice([-1, 1])// ordonnée à l'origine b non nulle de la fonction affine
        f = (x) => a * x + b

        xA = 0
        yA = f(xA)
        xB = randint(1, 3) * choice([-1, 1])// Abscisse de B
        yB = f(xB)// Ordonnée de B

        const A = point(xA, yA, 'A')
        const B = point(xB, yB, 'B')
        c = droite(A, B)
        c.color = colorToLatexOrHTML('red')
        c.epaisseur = 2

        cadre = {
          xMin: min(-5, xA - 1, xB - 1),
          yMin: min(-5, yA - 1, yB - 1),
          xMax: max(5, xA + 1, xB + 1),
          yMax: max(5, yA + 1, yB + 1)
        }
        // C'est bizarre mais c'est parce que dans mathAlea, les attributs n'ont pas de majuscules.
        // Donc même quand c'est le même cadre, on doit le faire.
        cadreFenetreSvg = {
          xmin: cadre.xMin,
          ymin: cadre.yMin,
          xmax: cadre.xMax,
          ymax: cadre.yMax
        }

        r = repere(cadre)

        tA = tracePoint(A, 'red') // Variable qui trace les points avec une croix
        tB = tracePoint(B, 'red') // Variable qui trace les points avec une croix
        lA = labelPoint(A, 'red')// Variable qui trace les nom s A et B
        lB = labelPoint(B, 'red')// Variable qui trace les nom s A et B

        tA.taille = 5
        tA.epaisseur = 2
        tB.taille = 5
        tB.epaisseur = 2

        texte = `$f(x)=${reduireAxPlusB(a, b)}$ <br>`
        if (a !== 0) {
          texteCorr = 'On sait que la représentation graphique d\'une fonction affine est une droite.<br>'
          texteCorr += 'Il suffit donc de déterminer les coordonnées de deux points pour pouvoir représenter $f$.<br>'
          texteCorr += `Comme $f(${xA})=${yA}$, on a  $A(${xA};${yA}) \\in \\mathcal{C_f}$.<br>`
          texteCorr += 'On cherche un deuxième point, et on prend un antécédent au hasard :<br>'
          texteCorr += `Soit $x=${xB}$ :<br>`
          texteCorr += `On calcule : $f(${xB})=${a} \\times ${ecritureParentheseSiNegatif(xB)}${ecritureAlgebrique(b)}=${yB}$.<br>`
          texteCorr += `On en déduit que $B(${xB};${yB}) \\in \\mathcal{C_f}$.`
        } else {
          texteCorr = 'On observe que $f$ est une fonction constante.<br>'
          texteCorr += `Sa représentation graphique est donc une droite parallèle à l'axe des abscisses, d'équation $y=${yA}$.<br>`
        }
        texteCorr += mathalea2d(cadreFenetreSvg,
          lA, lB, r, c, tA, tB, o)
      }

      if (this.sup === 2) { // cas du coefficient directeur fractionnaire
        a = randint(-5, 5, [0]) // numérateur coefficient directeur non nul
        b = randint(-5, 5, [0]) // ordonnée à l'origine non nulle
        d = randint(2, 5, [a, 2 * a, -a, -2 * a]) // dénominateur coefficient directeur non multiple du numérateur pour éviter nombre entier
        f = (x) => a / d * x + b
        xA = 0 // Abscisse de A
        yA = f(xA)// Ordonnée de A
        xB = d
        yB = f(xB)

        const A1 = point(xA, yA, 'A')
        const B1 = point(xB, yB, 'B')
        c = droite(A1, B1)
        c.color = colorToLatexOrHTML('red')
        c.epaisseur = 2

        cadre = {
          xMin: min(-5, xA - 1, xB - 1),
          yMin: min(-5, yA - 1, yB - 1),
          xMax: max(5, xA + 1, xB + 1),
          yMax: max(5, yA + 1, yB + 1)
        }

        cadreFenetreSvg = {
          xmin: cadre.xMin,
          ymin: cadre.yMin,
          xmax: cadre.xMax,
          ymax: cadre.yMax
        }

        texte = `$f(x)=${texFractionReduite(a, d)}x ${ecritureAlgebrique(b)}$ <br>`

        texteCorr = 'On sait que la représentation graphique d\'une fonction affine est une droite.<br>'
        texteCorr += 'Il suffit donc de déterminer les coordonnées de deux points pour pouvoir représenter $f$.<br>'
        texteCorr += `Comme $f(${xA})=${yA}$, on a : $A(${xA};${yA}) \\in \\mathcal{C_f}$.<br>`
        texteCorr += 'On cherche un deuxième point, et on prend un antécédent qui facilite les calculs :<br>'
        texteCorr += `Par exemple $x=${xB}$ :<br>`
        texteCorr += `On calcule : $f(${xB})=${texFractionReduite(a, d)} \\times ${ecritureParentheseSiNegatif(xB)}${ecritureAlgebrique(b)}=${yB}$.<br>`
        texteCorr += `On en déduit que $B(${xB};${yB}) \\in \\mathcal{C_f}$.`

        tA = tracePoint(A1, 'red') // Variable qui trace les points avec une croix
        lA = labelPoint(A1, 'red')// Variable qui trace les nom s A et B
        tB = tracePoint(B1, 'red') // Variable qui trace les points avec une croix
        lB = labelPoint(B1, 'red')// Variable qui trace les nom s A et B
        // lC = labelPoint(f, 'C_f')// Variable qui trace les nom s A et B

        r = repere(cadre)// On définit le repère
        texteCorr += mathalea2d(
          cadreFenetreSvg,
          r, c, tA, lA, tB, lB, lC, o)
        // On trace le graphique
      }

      if (this.questionJamaisPosee(i, this.sup, a, b)) {
        // Si la question n'a jamais été posée, on en créé une autre
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireNumerique = ['Types de question ', 2, '1 : Valeurs entières\n2 : Valeurs fractionnaires.']
}