exercices/3e/3G31-1.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenu, randint, creerNomDePolygone, texNombre, choice } from '../../modules/outils.js'
import { point, labelPoint, polygone, similitude, codageAngleDroit, codageAngle, afficheMesureAngle, afficheLongueurSegment, longueur, angle, texteSurSegment } from '../../modules/2d.js'
import { radians, degres } from '../../modules/fonctionsMaths.js'

export const titre = 'Calculer toutes les mesures d\'angle d\'une figure complexe'

/**
 * Deux triangles rectangles accolés, on connaît deux longueurs et un angle, il faut déterminer tous les autres angles
 * @author Rémi Angot
 * 3G31-1
 * Février 2021
*/
export const uuid = '35e0b'
export const ref = '3G31-1'
export default function CalculDAngleFigureComplexe () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.consigne = 'Calculer la mesure de tous les angles de cette figure.'
  this.nbQuestions = 1
  this.nbQuestionsModifiable = false
  this.nbCols = 1 // Uniquement pour la sortie LaTeX
  this.nbColsCorr = 1 // Uniquement pour la sortie LaTeX
  this.spacingCorr = 3
  this.correctionDetailleeDisponible = true
  context.isHtml ? this.correctionDetaillee = true : this.correctionDetaillee = false
  // this.sup = 1; // Niveau de difficulté
  // this.tailleDiaporama = 3; // Pour les exercices chronométrés. 50 par défaut pour les exercices avec du texte
  this.video = '' // Id YouTube ou url

  this.nouvelleVersion = function () {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées

    const typesDeQuestion = choice(['BA-AD-BAC', 'BA-AD-ACB'])
    let texte, texteCorr

    const B = point(0, 0, '', 'below')
    const A = point(randint(4, 7), 0, '', 'below')
    const C = point(0, randint(3, 7, longueur(A, B)), '', 'above') // On exclue AB pour ne pas avoir un triangle isocèle
    const t1 = polygone([A, B, C])
    const t1c = polygone([A, B, C], 'blue')
    t1c.epaisseur = 3
    const c1 = codageAngleDroit(A, B, C)
    const D = similitude(C, A, -90, randint(7, 12, 10) / 10, '', 'right') // On exclue 10 pour ne pas avoir un triangle isocèle
    const t2 = polygone([C, A, D])
    const t2c = polygone([C, A, D], 'blue')
    t2c.epaisseur = 3
    const c2 = codageAngleDroit(C, A, D)
    const nom = creerNomDePolygone(4, 'QD')
    A.nom = nom[0]
    B.nom = nom[1]
    C.nom = nom[2]
    D.nom = nom[3]
    const labels = labelPoint(A, B, C, D)
    const BA = longueur(B, A)
    const AD = longueur(A, D, 1)
    const BAC = Math.round(angle(B, A, C))
    let AC = BA / Math.cos(radians(BAC))
    let ACD = Math.round(degres(Math.atan(AD / AC)))
    let a1 = afficheMesureAngle(B, A, C, 'black', 1, BAC + '°')
    const a2 = afficheLongueurSegment(A, B)
    const a3 = afficheLongueurSegment(D, A)
    const a4 = afficheLongueurSegment(A, C)
    const a5 = codageAngle(A, C, D, 1.2)
    a5.epaisseur = 2
    const ACB = Math.round(angle(A, C, B))

    const objetsMathalea = [t1, t2, c1, c2, labels]

    switch (typesDeQuestion) { // Suivant le type de question, le contenu sera différent
      case 'BA-AD-BAC':
        if (this.sup) {
          objetsMathalea.push(a1, a2, a3)
        }
        texte = mathalea2d({ xmin: -1, ymin: -1, xmax: D.x + 1, ymax: Math.max(C.y, D.y) + 1 }, objetsMathalea)
        if (!this.sup) {
          texte += `<br>On a $${B.nom + A.nom} = ${texNombre(BA, 1)}$ cm, $${A.nom + D.nom} = ${texNombre(AD, 1)}$ cm et $\\widehat{${B.nom + A.nom + C.nom}}=${BAC}°$.`
        }
        texteCorr = ''
        if (this.correctionDetaillee) {
          const texte1 = texteSurSegment('hypoténuse', C, A)
          const texte2 = texteSurSegment('adjacent', A, B, 'black', 1)
          texteCorr += mathalea2d({ xmin: -1, ymin: -2, xmax: D.x + 1, ymax: Math.max(C.y, D.y) + 1 }, t1c, t2, c1, c2, a1, a2, labels, texte1, texte2)
          texteCorr += '<br>'
        }
        texteCorr += `$${C.nom + B.nom + A.nom}$ est rectangle en $${B.nom}$ donc $\\cos\\left(\\widehat{${B.nom + A.nom + C.nom}}\\right)=\\dfrac{${B.nom + A.nom}}{${A.nom + C.nom}}\\quad$ `
        texteCorr += `soit $\\quad\\cos(${BAC}°)=\\dfrac{${texNombre(BA, 1)}}{${A.nom + C.nom}}\\quad$ et $\\quad ${A.nom + C.nom}=\\dfrac{${texNombre(BA, 1)}}{\\cos(${BAC}°)}\\approx${texNombre(AC, 1)}$ cm.`
        if (this.correctionDetaillee) {
          const texte3 = texteSurSegment('adjacent', C, A)
          const texte4 = texteSurSegment('opposé', A, D, 'black')
          texteCorr += '<br><br>' + mathalea2d({ xmin: -1, ymin: -1, xmax: D.x + 1, ymax: Math.max(C.y, D.y) + 1 }, t1, t2c, c1, c2, a3, a4, a5, labels, texte3, texte4)
        }
        texteCorr += `<br><br>$${C.nom + A.nom + D.nom}$ est rectangle en $${A.nom}$ donc $\\tan\\left(\\widehat{${A.nom + C.nom + D.nom}}\\right)=\\dfrac{${A.nom + D.nom}}{${A.nom + C.nom}}\\quad$ `
        texteCorr += `soit $\\quad\\tan\\left(\\widehat{${A.nom + C.nom + D.nom}}\\right)\\approx\\dfrac{${texNombre(AD, 1)}}{${texNombre(AC, 1)}}\\quad$ et $\\quad\\widehat{${A.nom + C.nom + D.nom}}=\\text{arctan}\\left(\\dfrac{${texNombre(AD, 1)}}{${texNombre(AC, 1)}}\\right)\\approx${ACD}$°.`
        texteCorr += `<br><br>La somme des angles d'un triangle est égale à 180° donc $\\widehat{${B.nom + C.nom + A.nom}}=180°-90°-${BAC}°=${90 - BAC}°$.`
        texteCorr += `<br>De même, $\\widehat{${C.nom + D.nom + A.nom}}\\approx 180°-90°-${ACD}°\\approx${90 - ACD}°$.`
        break
      case 'BA-AD-ACB':
        AC = BA / Math.sin(radians(ACB))
        ACD = Math.round(degres(Math.atan(AD / AC)))
        a1 = afficheMesureAngle(A, C, B, 'black', 1, ACB + '°')
        if (this.sup) {
          objetsMathalea.push(a1, a2, a3)
        }
        texte = mathalea2d({ xmin: -1, ymin: -1, xmax: D.x + 1, ymax: Math.max(C.y, D.y) + 1 }, objetsMathalea)
        if (!this.sup) {
          texte += `<br>On a $${B.nom + A.nom} = ${texNombre(BA, 1)}$ cm, $${A.nom + D.nom} = ${texNombre(AD, 1)}$ cm et $\\widehat{${A.nom + C.nom + B.nom}}=${ACB}°$.`
        }
        texteCorr = ''
        if (this.correctionDetaillee) {
          const texte1 = texteSurSegment('hypoténuse', C, A)
          const texte2 = texteSurSegment('opposé', A, B, 'black', 1)
          texteCorr += mathalea2d({ xmin: -1, ymin: -2, xmax: D.x + 1, ymax: Math.max(C.y, D.y) + 1 }, t1c, t2, c1, c2, a1, a2, labels, texte1, texte2)
          texteCorr += '<br>'
        }
        texteCorr += `$${C.nom + B.nom + A.nom}$ est rectangle en $${B.nom}$ donc $\\sin\\left(\\widehat{${A.nom + C.nom + B.nom}}\\right)=\\dfrac{${B.nom + A.nom}}{${A.nom + C.nom}}\\quad$ `
        texteCorr += `soit $\\quad\\sin(${ACB}°)=\\dfrac{${texNombre(BA, 1)}}{${A.nom + C.nom}}\\quad$ et $\\quad ${A.nom + C.nom}=\\dfrac{${texNombre(BA, 1)}}{\\sin(${ACB}°)}\\approx${texNombre(AC, 1)}$ cm.`
        if (this.correctionDetaillee) {
          const texte3 = texteSurSegment('adjacent', C, A)
          const texte4 = texteSurSegment('opposé', A, D, 'black')
          texteCorr += '<br><br>' + mathalea2d({ xmin: -1, ymin: -1, xmax: D.x + 1, ymax: Math.max(C.y, D.y) + 1 }, t1, t2c, c1, c2, a3, a4, a5, labels, texte3, texte4)
        }
        texteCorr += `<br><br>$${C.nom + A.nom + D.nom}$ est rectangle en $${A.nom}$ donc $\\tan\\left(\\widehat{${A.nom + C.nom + D.nom}}\\right)=\\dfrac{${A.nom + D.nom}}{${A.nom + C.nom}}\\quad$ `
        texteCorr += `soit $\\quad\\tan\\left(\\widehat{${A.nom + C.nom + D.nom}}\\right)\\approx\\dfrac{${texNombre(AD, 1)}}{${texNombre(AC, 1)}}\\quad$ et $\\quad\\widehat{${A.nom + C.nom + D.nom}}=\\text{arctan}\\left(\\dfrac{${texNombre(AD, 1)}}{${texNombre(AC, 1)}}\\right)\\approx${ACD}$°.`
        texteCorr += `<br><br>La somme des angles d'un triangle est égale à 180° donc $\\widehat{${B.nom + C.nom + A.nom}}=180°-90°-${BAC}°=${90 - BAC}°$.`
        texteCorr += `<br>De même, $\\widehat{${C.nom + D.nom + A.nom}}\\approx 180°-90°-${ACD}°\\approx${90 - ACD}°$.`
        break
    }
    this.listeQuestions.push(texte)
    this.listeCorrections.push(texteCorr)
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireCaseACocher = ['Figure codée']
}