exercices/2e/2G22-1.js

import Exercice from '../Exercice.js'
import { mathalea2d, colorToLatexOrHTML } from '../../modules/2dGeneralites.js'
import { listeQuestionsToContenu, randint, choice } from '../../modules/outils.js'
import { repere, point, labelPoint, segment, nomVecteurParPosition, texteParPosition, vecteur, homothetie, longueur, latexParPoint } from '../../modules/2d.js'

export const titre = 'Représenter un vecteur dans un repère, à partir de ses coordonnées'

/**
 * Tracer un vecteur dont on connais les coordonnées dans un repère.
 * @author Stéphane Guyon légèrement modifié par Jean-Claude Lhote
 * référence 2G22-1
 */
export const uuid = '3a3ec'
export const ref = '2G22-1'
export default function RepresenterUnVecteur () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.nbQuestions = 2
  this.nbCols = 2
  this.nbColsCorr = 2
  this.sup = 1 //
  this.nouvelleVersion = function () {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées

    for (let i = 0, r, posLabelA, posLabelB, labelA, labelB, A, B, H, h1, h2, O, I, J, j, t, k, l, s, o, ux, uy, xA, yA, xB, yB, AB, nomi, nomj, nomAB, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      xA = randint(2, 8) * choice([-1, 1])
      yA = randint(2, 8) * choice([-1, 1])
      ux = randint(3, 8) * choice([-1, 1])
      uy = randint(3, 8) * choice([-1, 1])
      xB = xA + ux
      yB = yA + uy
      while (Math.abs(xB) < 2 || Math.abs(xB) > 8) { // On s'assure de choisir des points bien placés dans le repère.
        xA = randint(3, 8) * choice([-1, 1])
        ux = randint(3, 8) * choice([-1, 1])
        xB = xA + ux
      }
      while (Math.abs(yB) < 2 || Math.abs(yB) > 8) { // Idem pour les ordonnées
        yA = randint(3, 8) * choice([-1, 1])
        uy = randint(3, 8) * choice([-1, 1])
        yB = yA + uy
      }
      A = point(xA, yA)
      B = point(xB, yB)
      AB = vecteur(A, B)
      r = repere()// On définit le repère
      posLabelA = homothetie(B, A, -0.7 / longueur(A, B), '', 'center') // pour positionner les noms des points aux extrémités proprement
      posLabelB = homothetie(A, B, -0.7 / longueur(A, B), '', 'center')
      labelA = latexParPoint('A', posLabelA, 'red', 10, 12, '')
      labelB = latexParPoint('B', posLabelB, 'red', 10, 12, '')

      H = point(xA + ux, yA)
      s = AB.representant(A) // On trace en rouge [AB]
      h1 = segment(A, H, 'blue')
      h2 = segment(B, H, 'green')
      O = point(0, 0)// On définit et on trace le point O
      o = texteParPosition('O', -0.5, -0.5, 'milieu', 'black', 1)
      I = point(1, 0)// On définit sans tracer le point I
      J = point(0, 1)// On définit sans tracer le point J
      k = vecteur(O, I).representant(O) // Variable qui trace [OI] en rouge
      j = vecteur(O, J).representant(O)// Variable qui trace [OJ] en rouge
      s.epaisseur = 2// Variable qui grossit le tracé du vecteur AB
      s.color = colorToLatexOrHTML('red')
      k.epaisseur = 2// Variable qui grossit le tracé du vecteur OI
      j.epaisseur = 2// Variable qui grossit le tracé du vecteur OJ
      h1.epaisseur = 2// Variable qui grossit le tracé bleu
      h2.epaisseur = 2// Variable qui grossit le tracé bleu
      nomi = nomVecteurParPosition('i', 0.5, -0.7, 1.5, 0)
      nomj = nomVecteurParPosition('j', -0.7, 0.5, 1.5, 0)
      nomAB = AB.representantNomme(A, 'u', 2, 'red')
      if (parseInt(this.sup) === 1) {
        l = labelPoint(A, 'red')// Variable qui trace les nom s A et B
        //  t = tracePoint(A, 'red') // Variable qui trace les points avec une croix

        texte = ` Dans un repère orthonormé $(O,\\vec i,\\vec j)$, représenter le vecteur $\\vec{u}\\begin{pmatrix}${ux} \\\\${uy}\\end{pmatrix}~$, `
        texte += `  ayant pour origine le point $A\\left(${xA};${yA}\\right)$`

        texteCorr = 'On sait qu\'un vecteur mesure un déplacement.'
        texteCorr += `<br> A partir du point $A$,  on trace donc le déplacement correspondant à $${ux}$ unités horizontalement (en bleu) puis $${uy}$ unités verticalement (en vert) pour arriver au point $B$ extrémité du vecteur $\\vec{u}$.`
        texteCorr += '<br> Voir les déplacements dans le repère et le tracé en rouge du vecteur $\\vec{u}$'
      }
      if (parseInt(this.sup) === 2) {
        texte = ` Dans un repère orthonormé $(O,\\vec i,\\vec j)$, représenter le vecteur $\\vec{u}\\begin{pmatrix}${ux} \\\\${uy}\\end{pmatrix}~$, `
        texte += `  ayant pour extrémité le point $B\\left(${xB};${yB}\\right)$`

        texteCorr = 'On sait qu\'un vecteur mesure un déplacement.'
        texteCorr += `<br> On cherche donc un point $A$,  à partir duquel en traçant le déplacement correspondant à $${ux}$ unités horizontalement (en bleu)  puis $${uy}$ unités verticalement (en vert), on arrive au point $B$.`
        texteCorr += '<br> Voir le déplacement en bleu dans le repère et le tracé en rouge du vecteur $\\vec{u}$'
        //  t = tracePoint(A, 'red') // Variable qui trace les points avec une croix
        l = labelPoint(A, B, 'red')// Variable qui trace les nom s A et B
      }
      texteCorr += mathalea2d({
        xmin: -9,
        ymin: -9,
        xmax: 9,
        ymax: 9
      }, r, t, l, k, j, s, o, nomi, nomj, nomAB, h1, h2, labelA, labelB)// On trace le graphique

      if (this.questionJamaisPosee(i, xA, yA, xB, yB)) { // 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 = ['Situations différentes ', 2, '1 :Avec un point origine\n 2 : Avec un point extrémité']
}