exercices/4e/4I1.js

import Exercice from '../Exercice.js'
import { mathalea2d, colorToLatexOrHTML } from '../../modules/2dGeneralites.js'
import { listeQuestionsToContenu, shuffle, calcul, texteEnCouleur, combinaisonListes } from '../../modules/outils.js'
import { scratchblock } from '../../modules/scratchblock.js'
import { allerA, avance, baisseCrayon, creerLutin, leveCrayon, tournerD } from '../../modules/2dLutin.js'

export const titre = 'Dessiner avec scratch'

/**
 * * Dessiner selon un programme scratch
 * * 4Algo1-0
 * @author Sébastien Lozano
 * mise à plat du big ouaille suite au passage à la V2
 * implémentation fonction scratchblock par Jean-Claude Lhote
 * la fonction gère la sortie Latex ou html du code scratch
 */

export const uuid = '33c9a'
export const ref = '4I1'
export default function TracerAvecScratch () {
  'use strict'
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.consigne = 'Laquelle des 4 figures ci-dessous va être tracée avec le script fourni ?'

  this.nbCols = 1
  this.nbColsCorr = 1

  this.listePackages = 'scratch3'
  this.typeExercice = 'Scratch'

  let typesDeQuestionsDisponibles
  this.nbQuestions = 3
  this.debug = false

  this.nouvelleVersion = function () {
    if (this.debug) {
      typesDeQuestionsDisponibles = [1, 2, 3, 4, 5]
    } else {
      typesDeQuestionsDisponibles = [1, 2, 3, 4, 5]
    };

    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    const fenetreMathalea2D = { xmin: -10, ymin: -15, xmax: 60, ymax: 2, pixelsParCm: 10, scale: 0.2 }
    const pixelsParCm = fenetreMathalea2D.pixelsParCm * 5 / 100
    //    var unitesLutinParCm = 100;

    const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions) // Tous les types de questions sont posées mais l'ordre diffère à chaque "cycle"
    // let listeTypeDeQuestions = combinaisonListesSansChangerOrdre(typesDeQuestionsDisponibles, this.nbQuestions) // Tous les types de questions sont posées --> à remettre comme ci dessus

    for (let i = 0, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      // une fonction pour gérer la sortie HTML/LaTeX
      // code est un string contenant le code svg ou tikz

      // une fonction pour dire le nom du polygone
      function myPolyName (n) {
        const sortie = {
          name: '',
          nameParSommets: '',
          nbPas: ''
        }
        switch (n) {
          case 2:
            sortie.name = 'segment'
            sortie.nameParSommets = 'AB'
            sortie.nbPas = 400
            break
          case 3:
            sortie.name = 'triangle équilatéral'
            sortie.nameParSommets = 'ABC'
            sortie.nbPas = 400
            break
          case 4:
            sortie.name = 'carré'
            sortie.nameParSommets = 'ABCD'
            sortie.nbPas = 400
            break
          case 5:
            sortie.name = 'pentagone régulier'
            sortie.nameParSommets = 'ABCDE'
            sortie.nbPas = 300
            break
          case 6:
            sortie.name = 'hexagone régulier'
            sortie.nameParSommets = 'ABCDEF'
            sortie.nbPas = 250
            break
          case 7:
            sortie.name = 'heptagone régulier'
            sortie.nameParSommets = 'ABCDEFG'
            sortie.nbPas = 200
            break
          case 8:
            sortie.name = 'octogone régulier'
            sortie.nameParSommets = 'ABCDEFGH'
            sortie.nbPas = 200
            break
          case 9:
            sortie.name = 'ennéagone régulier'
            sortie.nameParSommets = 'ABCDEFGHI'
            sortie.nbPas = 200
            break
        }
        return sortie
      }

      // une fonction pour renvoyer une situation
      // n définit le nombre de côtés du polygone régulier
      function mySituation (n) {
        const situations = [
          { // polygones réguliers
            nbCotes: n,
            nom: myPolyName(n).name,
            codeScratch: `\\begin{scratch}
\\blockinit{quand \\greenflag est cliqué}
\\blockpen{stylo en position d'écriture} 
\\blockrepeat{répéter \\ovalnum{${n}} fois}
{
\\blockmove{avancer de \\ovalnum{${myPolyName(n).nbPas}} pas}
\\blockmove{tourner \\turnright{} de \\ovaloperator{\\ovalnum{360}/\\ovalnum{${n}}} degrés}
}
\\end{scratch}`,
            fig: '',
            fig_corr: ''
          }
        ]

        let tabAbsDemLutin2
        if (n === 6) {
          tabAbsDemLutin2 = [0, 3 * myPolyName(n).nbPas, 6 * myPolyName(n).nbPas, 9 * myPolyName(n).nbPas]
        } else if (n === 8) {
          tabAbsDemLutin2 = [0, 4 * myPolyName(n).nbPas, 8 * myPolyName(n).nbPas, 12 * myPolyName(n).nbPas]
        } else {
          tabAbsDemLutin2 = [0, 2 * myPolyName(n).nbPas, 4 * myPolyName(n).nbPas, 6 * myPolyName(n).nbPas]
        };
        // on mélange tout ça !
        tabAbsDemLutin2 = shuffle(tabAbsDemLutin2)
        // Les figures de l'énoncé
        // le lutin2  trace le cadre en pointillés
        const lutin2 = creerLutin()
        lutin2.color = colorToLatexOrHTML('black')
        lutin2.pointilles = 5
        allerA(fenetreMathalea2D.xmin * pixelsParCm, fenetreMathalea2D.ymax * pixelsParCm, lutin2)
        baisseCrayon(lutin2)
        allerA(fenetreMathalea2D.xmax * pixelsParCm, fenetreMathalea2D.ymax * pixelsParCm, lutin2)
        allerA(fenetreMathalea2D.xmax * pixelsParCm, fenetreMathalea2D.ymin * pixelsParCm, lutin2)
        allerA(fenetreMathalea2D.xmin * pixelsParCm, fenetreMathalea2D.ymin * pixelsParCm, lutin2)
        allerA(fenetreMathalea2D.xmin * pixelsParCm, fenetreMathalea2D.ymax * pixelsParCm, lutin2)
        leveCrayon(lutin2)
        // le lutin2 fait la bonne figure
        lutin2.pointilles = false
        lutin2.color = colorToLatexOrHTML('blue')
        allerA(tabAbsDemLutin2[0], 0, lutin2)
        baisseCrayon(lutin2)
        for (let k = 1; k < n + 1; k++) {
          avance(myPolyName(n).nbPas, lutin2)
          tournerD(calcul(360 / n, 2), lutin2)
        };
        // le lutin2 fait un polygone régulier avec un côté de plus
        leveCrayon(lutin2)
        allerA(tabAbsDemLutin2[1], 0, lutin2)
        baisseCrayon(lutin2)
        for (let k = 1; k < n + 1 + 1; k++) {
          avance(myPolyName(n + 1).nbPas, lutin2)
          tournerD(calcul(360 / (n + 1), 2), lutin2)
        };

        // le lutin2 fait un polygone régulier avec un côté de moins
        leveCrayon(lutin2)
        allerA(tabAbsDemLutin2[2], 0, lutin2)
        baisseCrayon(lutin2)
        for (let k = 1; k < n; k++) {
          avance(myPolyName(n - 1).nbPas, lutin2)
          tournerD(calcul(360 / (n - 1), 2), lutin2)
        };

        // le lutin2 fait une figure ouverte à n côtés
        leveCrayon(lutin2)
        allerA(tabAbsDemLutin2[3], 0, lutin2)
        baisseCrayon(lutin2)
        for (let k = 1; k < n + 1; k++) {
          avance(myPolyName(n).nbPas, lutin2)
          tournerD(calcul((360 / n) - 10, 2), lutin2)
        };
        allerA(tabAbsDemLutin2[3], 0, lutin2)

        const mesAppelsEnonce = [
          lutin2
        ]
        situations[0].fig = mathalea2d(
          fenetreMathalea2D,
          mesAppelsEnonce
        )

        // les figures de la correction
        // le lutin3  trace le cadre
        const lutin3 = creerLutin()
        lutin3.color = colorToLatexOrHTML('black')
        lutin3.pointilles = 5
        allerA(fenetreMathalea2D.xmin * pixelsParCm, fenetreMathalea2D.ymax * pixelsParCm, lutin3)
        baisseCrayon(lutin3)
        allerA(fenetreMathalea2D.xmax * pixelsParCm, fenetreMathalea2D.ymax * pixelsParCm, lutin3)
        allerA(fenetreMathalea2D.xmax * pixelsParCm, fenetreMathalea2D.ymin * pixelsParCm, lutin3)
        allerA(fenetreMathalea2D.xmin * pixelsParCm, fenetreMathalea2D.ymin * pixelsParCm, lutin3)
        allerA(fenetreMathalea2D.xmin * pixelsParCm, fenetreMathalea2D.ymax * pixelsParCm, lutin3)
        leveCrayon(lutin3)
        // le lutin3 fait la bonne figure
        lutin3.pointilles = false
        lutin3.color = colorToLatexOrHTML('green')
        allerA(tabAbsDemLutin2[0], 0, lutin3)
        baisseCrayon(lutin3)
        for (let k = 1; k < n + 1; k++) {
          avance(myPolyName(n).nbPas, lutin3)
          tournerD(calcul(360 / n, 2), lutin3)
        };
        // le lutin3 fait un polygone régulier avec un côté de plus
        lutin3.color = colorToLatexOrHTML('red')
        leveCrayon(lutin3)
        allerA(tabAbsDemLutin2[1], 0, lutin3)
        baisseCrayon(lutin3)
        for (let k = 1; k < n + 1 + 1; k++) {
          avance(myPolyName(n + 1).nbPas, lutin3)
          tournerD(calcul(360 / (n + 1), 2), lutin3)
        };

        // le lutin3 fait un polygone régulier avec un côté de moins
        leveCrayon(lutin3)
        allerA(tabAbsDemLutin2[2], 0, lutin3)
        baisseCrayon(lutin3)
        for (let k = 1; k < n; k++) {
          avance(myPolyName(n - 1).nbPas, lutin3)
          tournerD(calcul(360 / (n - 1), 2), lutin3)
        };

        // le lutin3 fait une figure ouverte à n côtés
        leveCrayon(lutin3)
        allerA(tabAbsDemLutin2[3], 0, lutin3)
        baisseCrayon(lutin3)
        for (let k = 1; k < n + 1; k++) {
          avance(myPolyName(n).nbPas, lutin3)
          tournerD(calcul((360 / n) - 10, 2), lutin3)
        };
        allerA(tabAbsDemLutin2[3], 0, lutin3)

        const mesAppelsCorr = [
          lutin3
        ]
        situations[0].fig_corr = mathalea2d(
          fenetreMathalea2D,
          mesAppelsCorr
        )

        const enonces = []
        enonces.push({
          enonce: `
          ${scratchblock(situations[0].codeScratch)}
          <br> 
          ${situations[0].fig}
          `,
          question: '',
          correction: `
          <br> Les figures rouges sont erronées.
          <br> La figure tracée par le programme a ${situations[0].nbCotes} côtés de même longueur et ${situations[0].nbCotes} angles de même mesure, c'est un ${situations[0].nom}.
          <br>${texteEnCouleur('La bonne figure est donc la figure verte.')}
          <br><br>
          ${situations[0].fig_corr}
          `
        })

        return enonces
      }

      const enonces = []
      enonces.push(mySituation(3)[0])
      enonces.push(mySituation(4)[0])
      enonces.push(mySituation(5)[0])
      enonces.push(mySituation(6)[0])
      enonces.push(mySituation(8)[0])
      switch (listeTypeDeQuestions[i]) {
        case 1:
          texte = `${enonces[0].enonce}`
          if (this.debug) {
            texte += '<br>'
            texte += `<br> =====CORRECTION======<br>${enonces[0].correction}`
            texteCorr = ''
          } else {
            texteCorr = `${enonces[0].correction}`
          };
          break
        case 2:
          texte = `${enonces[1].enonce}`
          if (this.debug) {
            texte += '<br>'
            texte += `<br> =====CORRECTION======<br>${enonces[1].correction}`
            texteCorr = ''
          } else {
            texteCorr = `${enonces[1].correction}`
          };
          break
        case 3:
          texte = `${enonces[2].enonce}`
          if (this.debug) {
            texte += '<br>'
            texte += `<br> =====CORRECTION======<br>${enonces[2].correction}`
            texteCorr = ''
          } else {
            texteCorr = `${enonces[2].correction}`
          };
          break
        case 4:
          texte = `${enonces[3].enonce}`
          if (this.debug) {
            texte += '<br>'
            texte += `<br> =====CORRECTION======<br>${enonces[3].correction}`
            texteCorr = ''
          } else {
            texteCorr = `${enonces[3].correction}`
          };
          break
        case 5:
          texte = `${enonces[4].enonce}`
          if (this.debug) {
            texte += '<br>'
            texte += `<br> =====CORRECTION======<br>${enonces[4].correction}`
            texteCorr = ''
          } else {
            texteCorr = `${enonces[4].correction}`
          };
          break
      };

      if (this.listeQuestions.indexOf(texte) === -1) { // 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)
  }
}