exercices/2e/2F10-2.js

import Exercice from '../Exercice.js'
import { mathalea2d, colorToLatexOrHTML } from '../../modules/2dGeneralites.js'
import { listeQuestionsToContenu, randint, reduireAxPlusB, abs, pgcd, texteEnCouleurEtGras, texFraction, miseEnEvidence, ecritureAlgebrique, texFractionReduite } from '../../modules/outils.js'
import { repere, droite, point, tracePoint, segment, texteParPosition, latexParPoint, vecteur, translation, homothetie } from '../../modules/2d.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
import { context } from '../../modules/context.js'

export const titre = 'Lecture graphique d\'une fonction affine'
export const interactifReady = true
export const interactifType = 'mathLive'
export const amcReady = true
export const amcType = 'AMCHybride'

/**

*/
export const uuid = '93f13'
export const ref = '2F10-2'
export default function Lecturefonctionaffine () {
  Exercice.call(this)
  this.titre = titre
  this.consigne = ''
  this.nbQuestions = 3// On complète le nb de questions
  this.tailleDiaporama = 3
  this.video = ''
  this.nbCols = 1
  this.nbColsCorr = 1
  this.spacing = 1
  this.spacingCorr = 1
  this.spacingCorr = 1
  this.sup = 1

  this.nouvelleVersion = function () {
    this.listeQuestions = []
    this.listeCorrections = []
    this.autoCorrection = []
    // let typesDeQuestionsDisponibles = []
    // typesDeQuestionsDisponibles = [1, 2]// On complète selon le nb de cas dans l'exo (switch)
    const o = texteParPosition('O', -0.5, -0.5, 'milieu', 'black', 1)

    // const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions)
    this.sup = parseInt(this.sup)
    for (let i = 0, A, a, b, d, r, f, c, t, l, s1, s2, texte, texteCorr, cpt = 0;
      i < this.nbQuestions && cpt < 50;) { // on rajoute les variables dont on a besoin
      // typesDeQuestions = listeTypeDeQuestions[i]
      r = repere()// On définit le repère

      if (this.sup === 1) {
        a = randint(0, 10)
        a = a - 5// coefficient directeur
        b = randint(0, 10)
        b = b - 5// ordonnée à l'origine
        if (a === 0 && b === 0) {
          a = 1
        }// On évite la fonction nulle
        c = droite(a, -1, b)
        c.color = colorToLatexOrHTML('red')
        c.epaisseur = 2
        texte = 'Déterminer graphiquement l\'expression algébrique de la fonction affine $f$ représentée ci-dessus :<br>'
        texte += mathalea2d({
          xmin: -6,
          ymin: -6,
          xmax: 6,
          ymax: 6,
          scale: 0.5

        }, r, c, o)// On trace le graphique
        if (context.isAmc) {
          this.autoCorrection[i] = {
            enonce: texte,
            propositions: [
              {
                type: 'AMCNum',
                propositions: [{
                  texte: `$f(x)=${reduireAxPlusB(a, b)}$`,
                  statut: '',
                  reponse: {
                    texte: 'coefficient a de $y=ax+b$',
                    valeur: a,
                    param: {
                      digits: 1,
                      decimals: 0,
                      signe: true,
                      approx: 0
                    }
                  }
                }]
              },
              {
                type: 'AMCNum',
                propositions: [{
                  texte: '',
                  statut: '',
                  reponse: {
                    texte: 'valeur b de $y=ax+b$',
                    valeur: b,
                    param: {
                      digits: 1,
                      decimals: 0,
                      signe: true,
                      approx: 0
                    }
                  }
                }]
              }
            ]
          }
        } else if (this.interactif) {
          texte += '<br>$f(x) =$' + ajouteChampTexteMathLive(this, i, 'largeur25 inline')
          setReponse(this, i, `${reduireAxPlusB(a, b)}`)
        }

        texteCorr = 'On sait que l\'expression algébrique d\'une fonction affine est de la forme :$f(x)=ax+b$, avec $a$ et $b$ deux réels.<br>'
        texteCorr += 'Le premier coefficient qu\'on peut facilement lire graphiquement est $b$, l\'ordonnée à l\'origine de la droite.<br>'
        texteCorr += `On lit ici que le point $(0;${b}) \\in \\mathcal{C_f}$.<br>`
        texteCorr += `On peut alors conclure que l'ordonnée à l'origine est : $${b}$. <br>`
        texteCorr += 'On peut lire le coefficient directeur de la droite, en lisant le déplacement vertical correspondant à un déplacement horizontal d\'une unité .<br>'
        texteCorr += `On lit alors que le coefficient directeur de la droite est : $${a}$.<br>`
        texteCorr += ' On peut en déduire que l\'expression de la fonction $f$ est'

        texteCorr += `$f(x)=${reduireAxPlusB(a, b)}$<br>`
        texteCorr += mathalea2d({
          xmin: -6,
          ymin: -6,
          xmax: 6,
          ymax: 6,
          scale: 0.5
        }, r, c, o)// On trace le graphique
      }
      if (this.sup === 2) { // cas du coeff directeur fractionnaire
        a = randint(-5, 5, [0]) // numérateut coefficient directeur non nul
        b = randint(-5, 5) // ordonnée à l'origine
        d = randint(2, 5, [a, 2 * a]) // dénominateur coefficient directeur non multiple du numérateur pour éviter nombre entier
        r = repere()// On définit le repère
        c = droite(a / d, -1, b)
        c.color = colorToLatexOrHTML('red')
        c.epaisseur = 2
        texte = 'A partir de la représentation graphique de la droite ci-dessous, donner par lecture graphique son équation réduite'
        texte += mathalea2d({
          xmin: -6,
          ymin: -6,
          xmax: 6,
          ymax: 6,
          scale: 0.5

        }, r, c, o)// On trace le graphique

        texteCorr = 'On sait que l\'équation réduite d\'une droite non verticale est de la forme : $y= ax+b$ avec $a$ et $b$ deux réels non tous deux nuls.<br>'
        texteCorr += 'Le premier coefficient à lire graphiquement est $b$, l\'ordonnée à l\'origine de la droite.<br>'
        texteCorr += 'C\'est l\'ordonnée du point d\'intersection de la droite avec l\'axe des ordonnées.<br>'
        texteCorr += `On lit ici que : $A(0;${b}) \\in (d)$.<br>`
        texteCorr += `On peut alors conclure que l'ordonnée à l'origine est : $b=${b}$. <br>`
        texteCorr += 'On peut lire ensuite le coefficient directeur $a$ de la droite $(d)$.<br>'
        texteCorr += 'On sait que $a=\\dfrac{\\text{Dénivelé vertical}}{\\text{Déplacement horizontal}}$'
        texteCorr += '<br>On cherche un déplacement horizontal (en bleu) correspondant à un déplacement vertical entier (en vert).'
        texteCorr += `<br>On lit que pour un déplacement vers la droite de ${texteEnCouleurEtGras(d + ' unités', 'blue')}, il faut `
        if (a > 0) { texteCorr += 'monter de ' }
        if (a < 0) { texteCorr += 'descendre de ' }
        texteCorr += `${texteEnCouleurEtGras(Math.abs(a) + ' unités', 'green')}.`
        texteCorr += `<br>Il vient : $a=${texFraction(miseEnEvidence(a, 'green'), miseEnEvidence(d, 'blue'))}`
        f = pgcd(a, d)
        if (f !== 1) {
          if (a % d === 0) {
            texteCorr += `=${a / d}`
          } else {
            a /= f
            d /= f
            texteCorr += `=${texFraction(miseEnEvidence(a, 'green'), miseEnEvidence(d, 'blue'))}`
          }
        }
        texteCorr += '$'

        texteCorr += '<br>On peut en déduire que l\'équation réduite de la droite $(d)$ est : $y= '
        if (a === d) { texteCorr += 'x' }
        if (a === -d) { texteCorr += '-x' }
        if (a !== d & a !== -d) { texteCorr += `${texFractionReduite(a, d)}x` }

        if (b !== 0) { texteCorr += `${ecritureAlgebrique(b)}` }
        texteCorr += '$.<br>'
        if (context.isAmc) {
          this.autoCorrection[i] = {
            enonce: texte,
            propositions: [
              {
                type: 'AMCNum',
                propositions: [{
                  texte: `$${texFractionReduite(a, d)}x${ecritureAlgebrique(b)}$`,
                  statut: '',
                  reponse: {
                    texte: 'numérateur (signé) n de $y=\\dfrac{n}{d}x+b$',
                    valeur: a,
                    param: {
                      digits: 1,
                      decimals: 0,
                      signe: true,
                      approx: 0
                    }
                  }
                }]
              },
              {
                type: 'AMCNum',
                propositions: [{
                  texte: '',
                  statut: '',
                  reponse: {
                    texte: 'dénominateur d de $y=\\dfrac{n}{d}x+b$',
                    valeur: d,
                    param: {
                      digits: 1,
                      decimals: 0,
                      signe: false,
                      approx: 0
                    }
                  }
                }]
              },
              {
                type: 'AMCNum',
                propositions: [{
                  texte: '',
                  statut: '',
                  reponse: {
                    texte: 'valeur b de $y=ax+b$',
                    valeur: b,
                    param: {
                      digits: 1,
                      decimals: 0,
                      signe: true,
                      approx: 0
                    }
                  }
                }]
              }
            ]
          }
        } else if (this.interactif && !context.isAmc) {
          texte += '<br>$y =$' + ajouteChampTexteMathLive(this, i, 'largeur25 inline')
          setReponse(this, i, `${texFractionReduite(a, d)}x${ecritureAlgebrique(b)}`)
        }
        if (a > 0) {
          s1 = segment(0, b - a, -d, b - a, 'blue')
          s2 = segment(0, b - a, 0, b, 'green')
        }
        if (a < 0) {
          s1 = segment(d, b, 0, b, 'blue')
          s2 = segment(d, b, d, b - abs(a), 'green')
        }
        s2.epaisseur = 2
        s1.epaisseur = 2
        s2.styleExtremites = '->'
        s1.styleExtremites = '<-'
        A = point(0, b)

        l = latexParPoint('A', translation(A, homothetie(vecteur(-a, d), A, 0.5 / Math.sqrt(a ** 2 + d ** 2)), 'A', 'center'), 'red', 10, 10, '') // Variable qui trace les points avec une croix
        t = tracePoint(A, 'red')// Variable qui trace les nom s A et B
        t.taille = 3
        t.epaisseur = 2
        // l.color = colorToLatexOrHTML('red')
        if (a !== 0) {
          texteCorr += mathalea2d({
            xmin: -8,
            ymin: -10,
            xmax: 8,
            ymax: 10,
            scale: 0.5

          }, r, s1, s2, t, l, c, o)
        }// On trace le graphique
      }

      if (this.questionJamaisPosee(i, 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.']
}