modules/iepMacros/transformations.js

import { longueur, homothetie, vecteur, symetrieAxiale, milieu, rotation, translation } from '../2d.js'
import { randint, stringNombre } from '../outils.js'

/**
   *
   * @param {objet} p point dont on construit l'image et qui doit être tracé.
   * @param {objet} d axe de symétrie.
   * @param {string} nom nom de l'image
   * @param {objet} options couleur et couleurCodage
   * @author Liouba Leroux et Jean-Claude Lhote
   */
export function symetrieAxialePoint (p, d, nom, { couleur = this.couleur, couleurCodage = this.couleurCodage, codage = '//' } = {}) {
  this.epaisseur = 0.5 // épaisseur et couleur de crayon de papier bien taillé pour la construction
  this.couleur = 'grey'
  if (nom === undefined || nom === '') {
    nom = p.nom + "'"
  }
  const image = symetrieAxiale(p, d, nom) // on définit le point image (pour le viser avec la règle on ajoute une apostrophe au nom)
  if (longueur(p, image) !== 0) {
    const M = milieu(p, image) // on crée le point milieu
    const N = rotation(p, M, 90)
    const D = rotation(N, M, 180)
    this.regleMasquerGraduations()
    this.perpendiculaireRegleEquerre2points3epoint(N, D, p)
    this.compasEcarter2Points(M, p)
    this.compasTracerArcCentrePoint(M, image)
    this.regleSegment(p, image)
    this.regleMasquer()
    this.equerreMasquer()
    this.segmentCodage(p, M, { codage: codage, couleur: couleurCodage })
    this.segmentCodage(image, M, { codage: codage, couleur: couleurCodage })
    this.crayonMasquer()
    this.compasMasquer()
  }
  this.pointCreer(image, { couleur: couleur, couleurLabel: couleur }) // on construit l'image
}

/**
   *
   * @param {objet} p  le point dont on veut construire l'image
   * @param {objet} centre le centre de la rotation
   * @param {number} angle l'angle de la rotation
   * @param {string} nom le nom de l'image (si pas précisé ce sera le nom de l'antécédent avec un ')
   * @param {objet} param4 options couleur et couleurCodage
   * @author Jean-Claude Lhote
   */
export const rotationPoint = function (p, centre, angle, nom, { couleur = this.couleur, couleurCodage = this.couleurCodage, codage = true } = {}) {
  this.epaisseur = 0.5 // épaisseur et couleur de crayon de papier bien taillé pour la construction
  this.couleur = 'grey'
  if (nom === undefined || nom === '') {
    nom = p.nom + "'"
  }
  const image = rotation(p, centre, angle, nom) // on définit le point image (pour le viser avec la règle on ajoute une apostrophe au nom)
  this.regleSegment(centre, p) // On trace le support du rapporteur
  this.rapporteurMontrer(centre)
  this.rapporteurTracerDemiDroiteAngle(centre, p, angle) // On trace le deuxième côté
  this.regleMasquer()
  this.rapporteurMasquer()
  this.compasEcarter2Points(centre, p) // on prend l'écartement du compas
  this.compasTracerArcCentrePoint(centre, image) // On fait l'arc qui coupe la demi-droite
  this.compasMasquer()
  this.pointCreer(image, { couleur: couleur, couleurLabel: couleur }) // On marque le point image (qui est nommé)
  if (codage) {
    if (Math.abs(angle) === 90) {
      this.codageAngleDroit(p, centre, image, { couleur: couleurCodage })
    } else {
      this.angleCodage(p, centre, image, { couleur: couleurCodage })
      this.textePoint(Math.abs(angle) + '°', translation(homothetie(rotation(p, centre, angle / 2), centre, 1.3 / longueur(centre, p)), vecteur(-0.2, 0.5)))
    }
  }
}

//   /**
//  *
//  * @param {objet} p point dont on construit l'image et qui doit être tracé.
//  * @param {objet} d axe de symétrie.
//  * @param {string} nom nom de l'image
//  * @param {objet} options couleur et couleurCodage
//  * @author Liouba Leroux et Jean-Claude Lhote
//  */
//   this.symetrieAxialePoint = function (p, d, nom, { couleur = this.couleur, couleurCodage = this.couleurCodage, codage = '//' } = {}) {
//     this.epaisseur = 0.5 // épaisseur et couleur de crayon de papier bien taillé pour la construction
//     this.couleur = 'grey'
//     if (nom === undefined || nom === '') {
//       nom = p.nom + "'"
//     }
//     const image = symetrieAxiale(p, d, nom) // on définit le point image (pour le viser avec la règle on ajoute une apostrophe au nom)
//     if (longueur(p, image) !== 0) {
//       const M = milieu(p, image) // on crée le point milieu
//       const N = rotation(p, M, 90)
//       const D = rotation(N, M, 180)
//       this.regleMasquerGraduations()
//       this.perpendiculaireRegleEquerre2points3epoint(N, D, p)
//       this.compasEcarter2Points(M, p)
//       this.compasTracerArcCentrePoint(M, image)
//       this.regleSegment(p, image)
//       this.regleMasquer()
//       this.equerreMasquer()
//       this.segmentCodage(p, M, { codage: codage, couleur: couleurCodage })
//       this.segmentCodage(image, M, { codage: codage, couleur: couleurCodage })
//       this.crayonMasquer()
//       this.compasMasquer()
//     }
//     this.pointCreer(image, { couleur: couleur, couleurLabel: couleur }) // on construit l'image
//   }

/**
   *
   * @param {objet} p  le point dont on veut construire l'image
   * @param {objet} le point de départ de la translation
   * @param {objet} le point d'arrivée de la translation
   * @param {string} nom le nom de l'image (si pas précisé ce sera le nom de l'antécédent avec un ')
   * @param {objet} param4 options couleur et couleurCodage
   * @author Jean-Claude Lhote
   */
export const translationPoint = function (p, A, B, nom, { couleur = 'black', couleurCodage = this.couleurCodage } = {}) {
  const v = vecteur(A, B)
  this.epaisseur = 0.5 // épaisseur et couleur de crayon de papier bien taillé pour la construction
  this.couleur = 'grey'
  if (nom === undefined || nom === '') {
    nom = p.nom + "'"
  }
  const image = translation(p, v, nom) // on définit le point image (pour le viser avec la règle on ajoute une apostrophe au nom)
  if (longueur(A, p) !== 0) { // si le point de départ A est l'antécédent, alors le point d'arrivée B est l'image... pas besoin de construction
    this.compasEcarter2Points(A, p)
    this.compasTracerArcCentrePoint(B, image)
    this.compasEcarter2Points(A, B)
    this.compasTracerArcCentrePoint(p, image)
  }
  this.compasMasquer()
  this.pointCreer(image, { couleur: couleur, couleurLabel: couleur })
  const choix1 = randint(0, 4)
  const choix2 = randint(0, 4, choix1)
  const marques = ['/', '//', '///', 'O', '\\\\']
  const marque1 = marques[choix1]
  const marque2 = marques[choix2]
  this.couleur = 'green'
  this.traitRapide(p, image)
  this.traitRapide(A, B)
  this.segmentCodage(p, image, { codage: marque1, couleur: couleurCodage })
  this.segmentCodage(A, B, { codage: marque1, couleur: couleurCodage })
  this.couleur = 'red'
  this.traitRapide(B, image)
  this.traitRapide(A, p)
  this.segmentCodage(B, image, { codage: marque2, couleur: couleurCodage })
  this.segmentCodage(A, p, { codage: marque2, couleur: couleurCodage })
}

/**
   *
   * @param {objet} p  le point dont on veut construire l'image
   * @param {objet} centre le centre de symétrie
   * @param {string} nom le nom de l'image (si pas précisé ce sera le nom de l'antécédent avec un ')
   * @param {objet} param3 options couleur, couleurCodage et codage
   * @author Jean-Claude Lhote
   */
export const demiTourPoint = function (p, centre, nom, { couleur = 'black', couleurCodage = this.couleurCodage, codage = '//' } = {}) {
  this.epaisseur = 0.5 // épaisseur et couleur de crayon de papier bien taillé pour la construction
  this.couleur = 'grey'
  if (nom === undefined || nom === '') {
    nom = p.nom + "'"
  }
  const image = rotation(p, centre, 180, nom) // on définit le point image (pour le viser avec la règle on ajoute une apostrophe au nom)
  this.compasEcarter2Points(centre, p)
  this.compasTracerArcCentrePoint(centre, image)
  this.compasMasquer()
  this.crayonDeplacer(p)
  this.regleSegment(p, image)
  this.couleur = couleur
  this.epaisseur = 2
  this.pointCreer(image, { couleur: couleur, couleurLabel: couleur }) // on construit l'image
  this.regleMasquer()
  this.crayonMasquer()
  this.segmentCodage(p, centre, { codage: codage, couleur: couleurCodage })
  this.segmentCodage(centre, image, { codage: codage, couleur: couleurCodage })
}

/**
   *
   * @param {objet} p polygone dont on doit construire l'image
   * @param {objet} centre de l'homothétie
   * @param {number} k rapport de l'homothétie
   * @param {array} noms tableau contenant les différents noms des sommets dans le même ordre que ceux de p. Si vide, alors on ajoute ' à ceux de p
   * @param {objet} param4 options (couleur)
   */
export const homothetiePoint = function (p, centre, k, nom, { couleur = this.couleur, positionTexte = { x: 0, y: 0 } } = {}) {
  this.epaisseur = 1 // épaisseur et couleur de crayon de papier bien taillé pour la construction
  const couleurSave = this.couleur
  this.couleur = 'grey'
  let t
  if (nom === undefined || nom === '') {
    nom = p.nom + "'"
  }
  const image = homothetie(p, centre, k, nom) // on définit le point image (pour le viser avec la règle on ajoute une apostrophe au nom)
  if (k > 0) {
    t = this.textePosition(`Comme le rapport est positif alors les points ${p.nom} et ${image.nom} sont du même côté de ${centre.nom}`, positionTexte.x, positionTexte.y, { taille: 15 })
  } else {
    t = this.textePosition(`Comme le rapport est négatif alors ${centre.nom} est entre les points ${p.nom} et ${image.nom}`, positionTexte.x, positionTexte.y, { taille: 15 })
  }
  this.regleSegment(p, centre)
  const l = longueur(p, centre)
  const lprime = l * Math.abs(k)
  const t1 = this.textePosition(`La mesure de ${centre.nom}${p.nom} est ${stringNombre(l, 1)} cm et le rapport de l'homothetie est ${stringNombre(k, 3)}`, positionTexte.x, positionTexte.y - 1, { taille: 15 })
  const t2 = this.textePosition(`donc ${centre.nom}${image.nom} mesure ${stringNombre(l, 1)} cm × ${stringNombre(Math.abs(k), 3)} = ${stringNombre(lprime, 1)} cm`, positionTexte.x, positionTexte.y - 2, { taille: 15 })
  this.regleSegment(centre, image)
  this.pointCreer(image, { couleur: couleur, couleurLabel: couleur }) // on construit l'image
  this.regleMasquer()
  this.crayonMasquer()
  this.pause()
  this.texteMasquer(t1)
  this.texteMasquer(t2)
  this.texteMasquer(t)
  this.couleur = couleurSave
}
/**
   *
   * @param {objet} p le polygone qui est déjà tracé
   * @param {objet} centre le centre de la rotation
   * @param {number} angle l'angle de rotation
   * @author Jean-Claude Lhote
   * @param {objet} param4 options couleur et couleurCodage
  */
export const rotationPolygone = function (p, centre, angle, noms = [], { couleur = this.couleur, couleurCodage = this.couleurCodage } = {}) {
  let nom
  const p2 = rotation(p, centre, angle) // Pour tracer la figure image à la fin de l'animation avec polygoneRapide
  this.epaisseur = 0.5 // épaisseur et couleur de crayon de papier bien taillé pour la construction
  this.couleur = 'grey'
  let i = 0; let codage
  for (const sommet of p.listePoints) { // On répète la construction pour chaque sommet du polygone
    if (noms[i] !== undefined) {
      nom = noms[i]
    } else {
      nom = sommet.nom + "'"
    }
    if (i < 1) {
      codage = true
    } else {
      codage = false
    }
    if (longueur(centre, sommet) !== 0) {
      this.rotationPoint(sommet, centre, angle, nom, { couleur: couleur, couleurCodage: couleurCodage, codage: codage })
    }
    i++
  }
  this.epaisseur = 2
  this.couleur = couleur
  this.polygoneRapide(...p2.listePoints) // on trace le polygone image en bleu épaisseur 2
}

/**
   *
   * @param {objet} p polygone dont on construit l'image et qui doit être tracé avec ses points nommés.
   * @param {objet} d axe de symétrie.
   * @param {string} noms tableau contenant les noms des sommets dans le même ordre que p
   * @param {objet} param3 options couleur et couleurCodage
   * @author Liouba Leroux et Jean-Claude Lhote
   */
export const symetrieAxialePolygone = function (p, d, noms = [], { couleur = this.couleur, couleurCodage = this.couleurCodage } = {}) {
  let nom
  const p2 = symetrieAxiale(p, d) // Pour tracer la figure image à la fin de l'animation avec polygoneRapide
  // const N = homothetie(milieu(p.listePoints[0], p2.listePoints[0]), milieu(p.listePoints[1], p2.listePoints[1]), 1.23456) // créer unh point de l'axe de symétrie pour les alignements et les mesure d'angles
  this.epaisseur = 0.5 // épaisseur et couleur de crayon de papier bien taillé pour la construction
  this.couleur = 'grey'
  let i = 0
  const marques = ['/', '//', '///', 'O', '\\\\']
  for (const sommet of p.listePoints) { // On répète la construction pour chaque sommet du polygone
    if (noms[i] !== undefined) {
      nom = noms[i]
    } else {
      nom = sommet.nom + "'"
    }
    this.symetrieAxialePoint(sommet, d, nom, { couleur: couleur, couleurCodage: couleurCodage, codage: marques[i] })
    i++
  }
  this.compasMasquer()
  this.crayonMasquer()
  this.epaisseur = 2
  this.couleur = couleur
  this.polygoneRapide(...p2.listePoints) // on trace le polygone image en bleu épaisseur 2
  this.polygoneRapide(p2)
}

/**
   *
   * @param {objet} p polygone dont on construit l'image
   * @param {objet} A point de départ de la translation
   * @param {objet} B point d'arrivée de la translation
   * @param {string} noms tableau contenant les noms des sommets dans le même ordre que p
 * @param {objet} param3 options couleur et couleurCodage
 * @author Jean-Claude Lhote
*/
export const translationPolygone = function (p, A, B, noms = [], { couleur = this.couleur, couleurCodage = this.couleurCodage, codage = 'O' } = {}) {
  let nom
  const v = vecteur(A, B)
  const p2 = translation(p, v) // Pour tracer la figure image à la fin de l'animation avec polygoneRapide
  this.epaisseur = 0.5 // épaisseur et couleur de crayon de papier bien taillé pour la construction
  this.couleur = 'grey'
  let i = 0
  for (const sommet of p.listePoints) { // On répète la construction pour chaque sommet du polygone
    if (noms[i] !== undefined) {
      nom = noms[i]
    } else {
      nom = sommet.nom + "'"
    }
    this.translationPoint(sommet, A, B, nom, { couleur: couleur, couleurCodage: couleurCodage, codage: codage })
  }
  this.epaisseur = 2
  this.couleur = couleur
  this.polygoneRapide(...p2.listePoints) // on trace le polygone image en bleu épaisseur 2
  this.polygoneRapide(p2)
  i++
}
/**
   *
   * @param {objet} p  le polygone dont on veut construire l'image qui doit être tracé
   * @param {objet} centre le centre de symétrie
   * @param {array} noms les noms des sommets images (si pas précisé ce sera le nom de l'antécédent avec un ')
   * @param {objet} param3 options couleur et couleurCodage
   * @author Jean-Claude Lhote
   */
export const demiTourPolygone = function (p, centre, noms = [], { couleur = this.couleur, couleurCodage = this.couleurCodage } = {}) {
  const p2 = rotation(p, centre, 180) // Pour tracer la figure image à la fin de l'animation avec polygoneRapide
  this.epaisseur = 0.5 // épaisseur et couleur de crayon de papier bien taillé pour la construction
  this.couleur = 'grey'
  let nom
  let i = 0
  const marques = ['/', '//', '///', 'O', '\\\\']
  for (const sommet of p.listePoints) { // On répète la construction pour chaque sommet du polygone
    if (noms[i] !== undefined) {
      nom = noms[i]
    } else {
      nom = sommet.nom + "'"
    }
    this.demiTourPoint(sommet, centre, nom, { couleur: couleur, couleurCodage: couleurCodage, codage: marques[i] })
    i++
  }
  this.epaisseur = 2
  this.couleur = couleur
  this.polygoneRapide(...p2.listePoints) // on trace le polygone image en bleu épaisseur 2
  this.polygoneRapide(p2)// figure svg de l'exercice
}

/**
   *
   * @param {objet} p polygone dont on doit construire l'image
   * @param {objet} centre de l'homothétie
   * @param {number} k rapport de l'homothétie
   * @param {array} noms tableau contenant les différents noms des sommets dans le même ordre que ceux de p. Si vide, alors on ajoute ' à ceux de p
   * @param {objet} param4 options (couleur)
   */
export const homothetiePolygone = function (p, centre, k, noms = [], { couleur = this.couleur } = {}) {
  let nom
  const p2 = homothetie(p, centre, k) // Pour tracer la figure image à la fin de l'animation avec polygoneRapide
  this.epaisseur = 1 // épaisseur et couleur de crayon de papier bien taillé pour la construction
  this.couleur = 'grey'
  const t = this.textePosition('Comme k est ' + (k >= 0 ? 'positif' : 'négatif') + ' alors ' + (k >= 0 ? 'les figures sont du même côté de ' + centre.nom : centre.nom + ' est entre les figures'), 0, 0, { taille: 15 })
  let i = 0
  for (const sommet of p.listePoints) { // On répète la construction pour chaque sommet du polygone
    if (noms[i] !== undefined) {
      nom = noms[i]
    } else {
      nom = sommet.nom + "'"
    }
    this.homothetiePoint(sommet, centre, k, nom, { couleur: couleur })
    i++
  }
  this.epaisseur = 2
  this.couleur = couleur
  this.polygoneRapide(...p2.listePoints) // on trace le polygone image en bleu épaisseur 2
  this.texteMasquer(t)
}