import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { randint, listeQuestionsToContenu, combinaisonListes, texteExposant, texteGras, stringNombre, texNombre, range1, contraindreValeur, compteOccurences, choice, nombreDeChiffresDe, nombreDeChiffresDansLaPartieDecimale } from '../../modules/outils.js'
import { point3d, vecteur3d, cylindre3d, sphere3d } from '../../modules/3d.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
import Decimal from 'decimal.js'
import Grandeur from '../../modules/Grandeur.js'
import { context } from '../../modules/context.js'
export const interactifReady = true
export const interactifType = 'mathLive'
export const amcReady = true
export const amcType = 'AMCNum'
export const titre = 'Volume d\'une boule'
/**
* Calculer le volume d'une boule
* @author Erwan DUPLESSY (AMC par EE)
* 3G42
* date : 2021/02/09
*/
export const uuid = '8c803'
export const ref = '3G42'
export default function VolumeBoule () {
Exercice.call(this)
this.titre = titre
this.interactifReady = interactifReady
this.interactifType = interactifType
this.amcReady = amcReady
this.amcType = amcType
// this.consigne = 'On arrondira les résultats à ' + nombreDecimal(0.1) + ` ${choixUnites}` + texteExposant(3) + '. <br>'
this.video = 'YQF7CBY-uEk'
this.nbQuestions = 3 // Ici le nombre de questions
this.sup = '1-2-4'
const unites = ['km', 'hm', 'dam', 'm', 'dm', 'cm', 'mm']
// c'est ici que commence le code de l'exercice cette fonction crée une copie de l'exercice
this.nouvelleVersion = function () {
// la variable numeroExercice peut être récupérée pour permettre de différentier deux copies d'un même exo
// Par exemple, pour être certain de ne pas avoir les mêmes noms de points en appelant 2 fois cet exo dans la même page
this.listeQuestions = [] // tableau contenant la liste des questions
this.listeCorrections = []
this.autoCorrection = []
let listeTypeDeQuestions = []
if (!this.sup) { // Si aucune liste n'est saisie
listeTypeDeQuestions = range1(4)
} else {
if (!isNaN(this.sup)) { // Si c'est un nombre c'est qu'il y a qu'un problème
listeTypeDeQuestions[0] = contraindreValeur(1, 5, parseInt(this.sup), 4)
} else {
listeTypeDeQuestions = this.sup.split('-')// Sinon on créé un tableau à partir des valeurs séparées par des -
for (let i = 0; i < listeTypeDeQuestions.length; i++) { // on a un tableau avec des strings : ['1', '1', '2']
listeTypeDeQuestions[i] = contraindreValeur(1, 5, parseInt(listeTypeDeQuestions[i]), 5) // parseInt en fait un tableau d'entiers
}
}
}
if (compteOccurences(listeTypeDeQuestions, 5)) listeTypeDeQuestions = range1(4)
listeTypeDeQuestions = combinaisonListes(listeTypeDeQuestions, this.nbQuestions)
for (let i = 0, r, d, A, rayon, O, B, OO, o, R, s, c, texte, texteCorr, reponse, cpt = 0; i < this.nbQuestions && cpt < 50;) {
texte = '' // Nous utilisons souvent cette variable pour construire le texte de la question.
texteCorr = '' // Idem pour le texte de la correction.
const choixUnites = choice(unites)
switch (listeTypeDeQuestions[i]) {
case 1:
r = randint(2, 30)
reponse = new Decimal(r).pow(3).mul(Decimal.acos(-1)).mul(4).div(3).toDP(1)
texte += 'Calculer le volume' + (context.isAmc ? `, en ${choixUnites}` + texteExposant(3) + ',' : '') + ` d'une boule de rayon ${r} ${choixUnites}. Arrondir au dixième. `
texteCorr += 'Le volume d\'une boule est donné par la formule : $V = \\dfrac{4}{3}\\pi r^3$. <br>'
texteCorr += `On a donc : $V = \\dfrac{4}{3} \\times \\pi \\times (${r} \\text{ ${choixUnites}})^3$. <br>`
texteCorr += texteGras('Le volume de la boule est donc environ : ' + stringNombre(reponse, 1) + ` ${choixUnites}` + texteExposant(3) + '. <br>')
break
case 2:
d = randint(2, 30)
reponse = new Decimal(d).pow(3).mul(Decimal.acos(-1)).mul(4).div(3).toDP(1)
texte += 'Calculer le volume' + (context.isAmc ? `, en ${choixUnites}` + texteExposant(3) + ',' : '') + ` d'une boule de diamètre ${2 * d} ${choixUnites}. Arrondir au dixième. `
texteCorr += 'Le volume d\'une boule est donné par la formule : $V = \\dfrac{4}{3}\\pi r^3$. <br>'
texteCorr += `Le rayon de la boule est la moitié de son diamètre soit : ${d} ${choixUnites}. <br>`
texteCorr += `On a donc : $V = \\dfrac{4}{3} \\times \\pi \\times (${d} \\text{ ${choixUnites}})^3$. <br>`
texteCorr += texteGras('Le volume de la boule est donc environ : ' + stringNombre(reponse, 1) + ` ${choixUnites}` + texteExposant(3) + '. <br>')
break
case 3:
A = randint(2, 30)
texte += 'Calculer le volume' + (context.isAmc ? `, en ${choixUnites}` + texteExposant(3) + ',' : '') + ` d'une boule d'aire ${A} cm². Arrondir au dixième.`
texteCorr += 'Le volume d\'une boule est donné par la formule : $V = \\dfrac{4}{3}\\pi r^3$. <br>'
texteCorr += 'Il faut donc trouver le rayon de la boule. <br>'
texteCorr += 'L\'aire d\'une boule est donnée par la formule : $A = 4\\pi r^2$. <br>'
texteCorr += `On a donc l'égalité : $${A} = 4\\pi r^2$. `
texteCorr += `On en déduit : $r^2 = \\dfrac{${A}}{4\\pi}$. <br>`
texteCorr += `Et, comme $r$ est positif : $r=\\sqrt{\\dfrac{${A}}{4\\pi}}$. <br>`
rayon = new Decimal(A).div(Decimal.acos(-1).mul(4)).sqrt()
reponse = Decimal.acos(-1).mul(4 * rayon ** 3).div(3).toDP(1)
texteCorr += 'On obtient donc une valeur approchée de $r$ : $r \\approx ' + texNombre(rayon, 2) + '$. <br>'
texteCorr += 'On a donc : $V \\approx \\dfrac{4}{3} \\times \\pi \\times (' + texNombre(rayon, 2) + ` \\text{ ${choixUnites}})^3$. <br>`
texteCorr += texteGras('Le volume de la boule est donc environ : ' + stringNombre(reponse, 1) + ` ${choixUnites}` + texteExposant(3) + '. <br>')
break
case 4:
rayon = randint(2, 30)
texte += `Une boîte cylindrique de ${2 * rayon} ${choixUnites} de diamètre et de ${2 * rayon} ${choixUnites} de hauteur contient une boule de diamètre ${2 * rayon} ${choixUnites}. <br>`
texte += 'Calculer le volume' + (context.isAmc ? `, en ${choixUnites}` + texteExposant(3) + ',' : '') + ' dans la boîte laissée libre par la boule. Arrondir au dixième.'
texteCorr += 'Représentons la situation par un petit schéma : <br>'
O = point3d(0, 0, 0)
B = point3d(2.5, 0, 0)
OO = point3d(0, 0, 5)
o = point3d(0, 0, 2.5)
R = vecteur3d(O, B)
s = sphere3d(o, 2.5, 'blue', 'blue', 4, 'gray', 10, 'gray')
c = cylindre3d(O, OO, R, R, 'black', false)
reponse = Decimal.acos(-1).mul(2 * rayon ** 3).div(3).toDP(1)
texteCorr += '<br>' + mathalea2d({ xmin: -5, max: 9, ymin: -1.5, ymax: 6, scale: 0.8 }, ...s.c2d, ...c.c2d) + '<br>'
texteCorr += 'Méthode : on calcule le volume du cylindre auquel on va retrancher le volume de la boule. <br>'
texteCorr += 'Le volume du cylindre est : $V_c = \\pi r^2 h$ ; et celui de la boule est : $V_b = \\dfrac{4}{3}\\pi r^3$. <br>'
texteCorr += `Le rayon du cylindre est la moitié de son diamètre, soit ${rayon} ${choixUnites}, et sa hauteur est ${2 * rayon} ${choixUnites}. <br>`
texteCorr += `Le rayon de la boule est la moitié de son diamètre soit : ${rayon} ${choixUnites}. <br>`
texteCorr += `Ici, le volume du cylindre est donc : $V_c = \\pi \\times (${rayon} \\text{ ${choixUnites}})^2 \\times (${2 * rayon}\\text{ ${choixUnites}})$. <br>`
texteCorr += `Le volume de la boule est : $V_b = \\dfrac{4}{3} \\times \\pi \\times (${rayon} \\text{ ${choixUnites}})^3$. <br>`
texteCorr += `Le volume cherché est donc donné par : $\\pi \\times (${rayon} \\text{ ${choixUnites}})^2 \\times (${2 * rayon}\\text{ ${choixUnites}}) - \\dfrac{4}{3} \\times \\pi \\times (${rayon} \\text{ ${choixUnites}})^3$. <br>`
texteCorr += texteGras('Le volume cherché est environ : ' + stringNombre(reponse, 1) + ` ${choixUnites}` + texteExposant(3) + '. <br>')
break
}
setReponse(this, i, new Grandeur(reponse.toNumber(), `${choixUnites}^3`), { formatInteractif: 'unites' })
texte += ajouteChampTexteMathLive(this, i, 'largeur15 inline unites[Longueurs,Aires,Volumes]')
if (context.isAmc) {
this.autoCorrection[i] = {
enonce: texte,
propositions: [{ texte: texteCorr, statut: 0 }],
reponse: {
texte: '',
valeur: reponse.toNumber(),
param: { digits: nombreDeChiffresDe(reponse.toNumber()), decimals: nombreDeChiffresDansLaPartieDecimale(reponse.toNumber()), signe: false, exposantNbChiffres: 0, exposantSigne: false, approx: 0 }
}
}
}
if (this.listeQuestions.indexOf(texte) === -1) {
// Si la question n'a jamais été posée, on la stocke dans la liste des questions
this.listeQuestions.push(texte)
this.listeCorrections.push(texteCorr)
i++
}
cpt++
}
listeQuestionsToContenu(this) // On envoie l'exercice à la fonction de mise en page
}
// this.besoinFormulaireNumerique = ['Type de questions', 5, '1 : À partir du rayon\n2 : À partir du rayon ou du diamètre\n3 : À partir du rayon, du diamètre ou de l\'aire\n4 : À partir du rayon, du diamètre, de l\'aire ou en résolvant un problème\n5 : Mélange']
this.besoinFormulaireTexte = ['Choix des problèmes', 'Nombres séparés par des tirets\n1 : À partir du rayon\n2 : À partir du diamètre\n3 : À partir de l\'aire\n4 : En résolvant un problème\n5 : Mélange']
} // Fin de l'exercice.