import Exercice from '../Exercice.js'
import { mathalea2d, colorToLatexOrHTML } from '../../modules/2dGeneralites.js'
import { texcolors, combinaisonListes, choice, randint, listeQuestionsToContenu, numAlpha, calcul } from '../../modules/outils.js'
import { traceGraphiqueCartesien, segment, arc, point, rotation, motifs, tracePoint, vecteur, translation, carre, texteParPosition, repere, traceBarre, cercleCentrePoint } from '../../modules/2d.js'
import { propositionsQcm } from '../../modules/interactif/questionQcm.js'
import { context } from '../../modules/context.js'
export const titre = 'Représenter des données par un diagramme'
export const interactifReady = true
export const interactifType = 'qcm'
export const amcReady = true
export const amcType = 'AMCHybride'
/**
* Lecture de diagrammes
* @author Jean-Claude Lhote
* Référence 6S10-1
*/
export const uuid = 'adac4'
export const ref = '6S10-1'
export default function LireUnDiagramme () {
'use strict'
Exercice.call(this)
this.titre = titre
this.nbQuestions = 2
this.nbQuestionsModifiable = true
this.nbCols = 1
this.nbColsCorr = 1
this.pasDeVersionLatex = false
this.pas_de_version_HMTL = false
this.sup = 3
this.sup2 = 5
// this.sup2 = false;
this.nouvelleVersion = function () {
this.sup2 = parseInt(this.sup2)
this.listeQuestions = []
this.listeCorrections = []
this.autoCorrection = []
let typesDeQuestionsDisponibles
if (this.sup2 < 5) {
typesDeQuestionsDisponibles = [this.sup2]
} else {
typesDeQuestionsDisponibles = [1, 2, 3, 4]
}
const listeHachuresDisponibles = [0, 1, 3, 4, 5, 6, 7, 8, 9, 10]
const listeMotifs = combinaisonListes(listeHachuresDisponibles, 4)
const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions)
let N = 0
let nom
let nbAnimaux = 4 // nombre d'animaux différents dans l'énoncé
let lstAnimauxExo // liste des animaux uniquement cités dans l'exercice
let lstNombresAnimaux // liste des effectifs de chaque animal
let lstVal = [] // liste des valeurs à éviter pour les effectifs
let paramsEnonce, coef, r, lstElementGraph, g
let reponse1, reponse2, nbMin, nbMax, monQcm1, monQcm2, monQcm3
let objets
const lstAnimaux = ['Girafes', 'Zèbres', 'Gnous', 'Buffles', 'Gazelles', 'Crocodiles', 'Rhinocéros', 'Léopards', 'Guépards', 'Hyènes', 'Lycaons', 'Servals', 'Phacochères']
const lstNomParc = ['Dramve', 'Fatenmin', 'Batderfa', 'Vihi', 'Genser', 'Barbetdou', 'Dramrendu', 'Secai', 'Cipeudram', 'Cigel', 'Lisino', 'Fohenlan',
'Farnfoss', 'Kinecardine', 'Zeffari', 'Barmwich', 'Swadlincote', 'Swordbreak', 'Loshull', 'Ruyron', 'Fluasall', 'Blueross', 'Vlane']
let A, B, T, angle, a, legende, textelegende, hachures, a0, t, alpha
for (let q = 0, texte, texteCorr; q < this.nbQuestions;) {
objets = []
lstVal = []
lstAnimauxExo = []
lstNombresAnimaux = []
if (!context.isAmc) {
this.autoCorrection[q * 3] = {}
this.autoCorrection[q * 3 + 1] = {}
this.autoCorrection[q * 3 + 2] = {}
} else {
this.autoCorrection[q] = {}
}
texte = 'Dans le parc naturel de ' + choice(lstNomParc) + ', il y a beaucoup d\'animaux.<br> Voici un diagramme qui représente les effectifs de quelques espèces.<br><br>'
texteCorr = ''
switch (parseInt(this.sup)) {
case 1: nbAnimaux = 2; break
case 2: nbAnimaux = 3; break
case 3: nbAnimaux = 4; break
default: nbAnimaux = 4
}
for (let i = 0; i < nbAnimaux; i++) {
N = randint(5, 40, lstVal) // choisit un nombre entre 5 et 40 sauf dans les valeurs à éviter
lstNombresAnimaux.push(N)
lstVal = lstVal.concat([N - 2, N - 1, N, N + 1, N + 2]) // valeurs à supprimer pour éviter des valeurs proches
}
let effectiftotal = 0
for (let i = 0; i < nbAnimaux; i++) {
effectiftotal += lstNombresAnimaux[i]
}
for (let i = 0; i < nbAnimaux; i++) {
nom = choice(lstAnimaux, lstAnimauxExo) // choisit un animal au hasard sauf parmi ceux déjà utilisés
lstAnimauxExo.push(nom)
}
switch (listeTypeDeQuestions[q]) {
case 1:
A = point(0, 0)
B = point(6, 0)
T = point(7, 0)
a0 = cercleCentrePoint(A, B, 'black')
objets.push(a0)
alpha = 90
t = tracePoint(A)
t.style = '+'
objets.push(t)
for (let i = 0; i < nbAnimaux; i++) {
angle = 360 * lstNombresAnimaux[i] / effectiftotal
a = arc(rotation(B, A, alpha), A, angle, true, texcolors(i + 1), 'black', 0.7)
hachures = motifs(listeMotifs[i])
a.hachures = hachures
a.couleurDeRemplissage = colorToLatexOrHTML(texcolors(i + 1))
a.couleurDesHachures = a.couleurDeRemplissage
objets.push(a)
alpha += angle
legende = carre(translation(T, vecteur(0, 1.5 * i)), translation(T, vecteur(1, 1.5 * i)), 'black')
legende.couleurDeRemplissage = a.couleurDeRemplissage
legende.couleurDesHachures = a.couleurDesHachures
legende.hachures = hachures
legende.opaciteDeRemplissage = 0.7
textelegende = texteParPosition(lstAnimauxExo[i], 8.5, i * 1.5 + 0.5, 0, 'black', 1.5, 'gauche', false)
objets.push(legende, textelegende)
paramsEnonce = { xmin: -6.5, ymin: -6.5, xmax: 20, ymax: 6.5, pixelsParCm: 20, scale: 0.5, mainlevee: false }
}
break
case 2:
A = point(0, 0)
B = point(6, 0)
T = point(7, 0)
a0 = arc(B, A, 180, true, 'white', 'black')
objets.push(a0)
alpha = 0
t = tracePoint(A)
t.style = '+'
objets.push(t)
for (let i = 0; i < nbAnimaux; i++) {
angle = 180 * lstNombresAnimaux[i] / effectiftotal
a = arc(rotation(B, A, alpha), A, angle, true, texcolors(i + 1), 'black', 0.7)
hachures = motifs(listeMotifs[i])
a.hachures = hachures
a.couleurDeRemplissage = colorToLatexOrHTML(texcolors(i + 1))
a.couleurDesHachures = a.couleurDeRemplissage
objets.push(a)
alpha += angle
legende = carre(translation(T, vecteur(0, 1.5 * i)), translation(T, vecteur(1, 1.5 * i)), 'black')
legende.couleurDeRemplissage = a.couleurDeRemplissage
legende.couleurDesHachures = a.couleurDesHachures
legende.hachures = hachures
legende.opaciteDeRemplissage = 0.7
textelegende = texteParPosition(lstAnimauxExo[i], 8.5, i * 1.5 + 0.5, 0, 'black', 1.5, 'gauche', false)
objets.push(legende, textelegende)
paramsEnonce = { xmin: -6.5, ymin: -0.2, xmax: 20, ymax: 6.5, pixelsParCm: 20, scale: 0.5, mainlevee: false }
}
break
case 3:
coef = 1
switch (parseInt(this.sup2)) {
case 1:
coef = 1
break
case 2:
coef = 10
break
}
r = repere({
grilleX: false,
grilleY: 'pointilles',
xThickListe: [],
xLabelListe: [],
yUnite: 0.1 / coef,
yThickDistance: 10 * coef,
yMax: 60 * coef,
xMin: 0,
xMax: 10,
yMin: 0,
axeXStyle: '',
yLegende: "Nombre d'individus"
})
lstElementGraph = []
for (let i = 0; i < nbAnimaux; i++) {
objets.push(traceBarre((((r.xMax - r.xMin) / (nbAnimaux + 1)) * (i + 1)), lstNombresAnimaux[i], lstAnimauxExo[i], { unite: 0.1 / coef, couleurDeRemplissage: texcolors(i + 1), hachures: 'north east lines' }))
}
objets.push(r)
paramsEnonce = { xmin: -6.5, ymin: -3, xmax: 20, ymax: 7, pixelsParCm: 20, scale: 0.5, mainlevee: false }
break
case 4:
coef = 1
switch (parseInt(this.sup2)) {
case 1:
coef = 1
break
case 2:
coef = 10
break
}
r = repere({
grilleX: false,
grilleY: 'pointilles',
xThickListe: [],
xLabelListe: [],
yUnite: 0.1 / coef,
yThickDistance: 10 * coef,
yMax: 60 * coef,
xMin: 0,
xMax: 10,
yMin: 0,
axeXStyle: '',
yLegende: "Nombre d'individus"
})
lstElementGraph = []
for (let i = 0; i < nbAnimaux; i++) {
lstElementGraph.push([(i + 1) * 2, lstNombresAnimaux[i]])
objets.push(texteParPosition(lstAnimauxExo[i], (i + 1) * 2, -0.2, 66, 'black', 1, 'gauche'))
objets.push(segment((i + 1) * 2, -0.1, (i + 1) * 2, 0.1))
}
g = traceGraphiqueCartesien(lstElementGraph, r, {
couleurDesPoints: 'red',
couleurDuTrait: 'lightgray',
styleDuTrait: '', // plein par défaut
epaisseurDuTrait: 1,
styleDesPoints: 'o', // croix par défaut
tailleDesPoints: 3
})
objets.push(r, g)
paramsEnonce = { xmin: -6.5, ymin: -3, xmax: 20, ymax: 7, pixelsParCm: 20, scale: 0.5, mainlevee: false }
break
}
nbMin = Math.min(...lstNombresAnimaux)
nbMax = Math.max(...lstNombresAnimaux)
reponse1 = lstAnimauxExo[lstNombresAnimaux.indexOf(nbMin)]
reponse2 = lstAnimauxExo[lstNombresAnimaux.indexOf(nbMax)]
texte += mathalea2d(paramsEnonce, objets)
if (context.isAmc) {
texte += `<br>${numAlpha(0)} Quelle est l'espèce la moins nombreuse ?`
texte += `<br>${numAlpha(1)} Quelle est l'espèce la plus nombreuse ?`
texte += `<br>${numAlpha(2)} L'espèce la plus nombreuse représente ?`
}
if (!context.isAmc) {
this.autoCorrection[q * 3].propositions = []
for (let i = 0; i < nbAnimaux; i++) {
this.autoCorrection[q * 3].propositions.push({
texte: `${lstAnimauxExo[i]}`,
statut: reponse1 === lstAnimauxExo[i]
})
}
this.autoCorrection[q * 3 + 1].propositions = []
for (let i = 0; i < nbAnimaux; i++) {
this.autoCorrection[q * 3 + 1].propositions.push({
texte: `${lstAnimauxExo[i]}`,
statut: reponse2 === lstAnimauxExo[i]
})
}
this.autoCorrection[q * 3 + 2].propositions = []
this.autoCorrection[q * 3 + 2].propositions.push({
texte: 'Plus de la moitié des animaux',
statut: nbMax > effectiftotal / 2
},
{
texte: 'Moins de la moitié des animaux',
statut: nbMax < effectiftotal / 2
},
{
texte: 'La moitié des animaux',
statut: nbMax === calcul(effectiftotal / 2)
}
)
this.autoCorrection[q * 3].options = {}
this.autoCorrection[q * 3 + 1].options = {}
this.autoCorrection[q * 3 + 2].options = {}
} else {
this.autoCorrection[q].enonce = `${texte}\n`
this.autoCorrection[q].propositions = [
{
type: 'qcmMono',
propositions: [],
options: {}
},
{
type: 'qcmMono',
propositions: [],
options: {}
},
{
type: 'qcmMono',
propositions: [],
options: {}
}]
for (let i = 0; i < nbAnimaux; i++) {
this.autoCorrection[q].propositions[0].propositions.push({
texte: `${lstAnimauxExo[i]}`,
statut: reponse1 === lstAnimauxExo[i],
reponse: i === 0 ? { texte: 'a) Les moins nombreux :' } : {}
})
this.autoCorrection[q].propositions[1].propositions.push({
texte: `${lstAnimauxExo[i]}`,
statut: reponse2 === lstAnimauxExo[i],
reponse: i === 0 ? { texte: 'b) Les plus nombreux :' } : {}
})
}
this.autoCorrection[q].propositions[2].propositions = [{
texte: 'Plus de la moitié des animaux',
statut: nbMax > effectiftotal / 2,
reponse: { texte: 'c) Part de l\'espèce la plus nombreuse :' }
},
{
texte: 'Moins de la moitié des animaux',
statut: nbMax < effectiftotal / 2
},
{
texte: 'La moitié des animaux',
statut: nbMax === calcul(effectiftotal / 2)
}
]
this.autoCorrection[q].propositions[0].options = { ordered: true }
this.autoCorrection[q].propositions[1].options = { ordered: false }
}
monQcm1 = propositionsQcm(this, q * 3)
monQcm2 = propositionsQcm(this, q * 3 + 1)
monQcm3 = propositionsQcm(this, q * 3 + 2)
if (!context.isAmc) {
texte += `<br>${numAlpha(0)} Quelle est l'espèce la moins nombreuse ?` + monQcm1.texte
texte += `<br>${numAlpha(1)} Quelle est l'espèce la plus nombreuse ?` + monQcm2.texte
texte += `<br>${numAlpha(2)} L'espèce la plus nombreuse représente ...` + monQcm3.texte
texteCorr = `<br>${numAlpha(0)} L'animal le moins nombreux parmi ces espèces est : ` + monQcm1.texteCorr
texteCorr += `<br>${numAlpha(1)} L'animal le plus nombreux parmi ces espèces est : ` + monQcm2.texteCorr
texteCorr += `<br>${numAlpha(2)} L'animal le plus nombreux parmi ces espèces représente : ` + monQcm3.texteCorr
}
if (this.questionJamaisPosee(q, effectiftotal)) {
this.listeQuestions.push(texte)
this.listeCorrections.push(texteCorr)
q++
}
}
listeQuestionsToContenu(this) // On envoie l'exercice à la fonction de mise en page
}
this.besoinFormulaireNumerique = ['Nombre d\'espèces différentes', 3, '1 : Deux espèces\n2 : Trois espèces\n3 : Quatre espèces']
this.besoinFormulaire2Numerique = ['Type de diagramme', 5, '1 : Diagramme circulaire\n2 : Diagramme semi-circulaire\n3 : Diagramme en barres\n4 : Diagramme cartésien\n5 : Au hasard']
}