objets/CPointLieLieuParVar.js

/*
 * MathGraph32 Javascript : Software for animating online dynamic mathematics figures
 * https://www.mathgraph32.org/
 * @Author Yves Biton (yves.biton@sesamath.net)
 * @License: GNU AGPLv3 https://www.gnu.org/licenses/agpl-3.0.html
 */
import { distancePointPoint, MAX_VALUE } from '../kernel/kernel'
import CPointLieLieuAncetre from './CPointLieLieuAncetre'
export default CPointLieLieuParVar

/**
 * Point lié à un lieu de points généré par une variable
 * @constructor
 * @param {CListeObjets} listeProprietaire  La liste propriétaire de l'objet
 * @param {CImplementationProto} impProto  null ou pointe sur la construction propriétaire de l'objet.
 * @param {boolean} estElementFinal  true si l'objet est un objet final de construction
 * @param {Color} couleur  La couleur de l'objet
 * @param {boolean} nomMasque  true si le nom de l'objet est masqué
 * @param {number} decX  Decalage horizontal du nom
 * @param {number} decY  Decalage vertical du nom
 * @param {boolean} masque  true si l'objet est masque
 * @param {string} nom  Le nom eventuel de l'objet
 * @param {number} tailleNom  Indice de la taille du nom (voir Fonte)
 * @param {MotifPoint} motif  Le motif du point
 * @param {boolean} marquePourTrace  true si le point est marqué pour la trace
 * @param {boolean} fixed  true si punaisé
 * @param {number} abscisse  L'abscisse du point sur le lieu
 * @param {CLieuDeBase} lieuAssocie  Le lieu auquel le point est lié
 * @returns {void}
 */
function CPointLieLieuParVar (listeProprietaire, impProto, estElementFinal,
  couleur, nomMasque, decX, decY, masque, nom, tailleNom,
  motif, marquePourTrace, fixed, abscisse, lieuAssocie) {
  if (arguments.length === 1) CPointLieLieuAncetre.call(this, listeProprietaire)
  else {
    CPointLieLieuAncetre.call(this, listeProprietaire, impProto, estElementFinal, couleur, nomMasque,
      decX, decY, masque, nom, tailleNom, motif, marquePourTrace, fixed, abscisse, lieuAssocie)
  }
}
CPointLieLieuParVar.prototype = new CPointLieLieuAncetre()
CPointLieLieuParVar.prototype.constructor = CPointLieLieuParVar
CPointLieLieuParVar.prototype.superClass = 'CPointLieLieuAncetre'
CPointLieLieuParVar.prototype.className = 'CPointLieLieuParVar'

CPointLieLieuParVar.prototype.getClone = function (listeSource, listeCible) {
  const ind1 = listeSource.indexOf(this.lieuAssocie)
  const ind2 = listeSource.indexOf(this.impProto)
  return new CPointLieLieuParVar(listeCible, listeCible.get(ind2, 'CImplementationProto'),
    this.estElementFinal, this.couleur, this.nomMasque, this.decX, this.decY, this.masque, this.nom,
    this.tailleNom, this.motif, this.marquePourTrace, this.fixed, this.abscisse,
    listeCible.get(ind1, 'CLieuParVariable'))
}

CPointLieLieuParVar.prototype.positionne = function (infoRandom, dimfen) {
  this.existe = this.lieuAssocie.existe
  if (!this.existe) return
  const vari = this.lieuAssocie.variableGeneratrice
  const ptGenerateurTrace = this.lieuAssocie.pointATracer
  // On mémorise la valeur actuelle de la variable qui génère le lieu auquel le point est lié
  const ancienneAbscisse = vari.valeurActuelle
  vari.donneValeur(this.abscisse)
  this.lieuAssocie.listeElementsAncetres.positionne(infoRandom, dimfen)
  this.existe = ptGenerateurTrace.existe
  if (!this.existe) return
  CPointLieLieuAncetre.prototype.placeEn.call(this, ptGenerateurTrace.x, ptGenerateurTrace.y)
  vari.donneValeur(ancienneAbscisse)
  this.lieuAssocie.listeElementsAncetres.positionne(infoRandom, dimfen)
  CPointLieLieuAncetre.prototype.positionne.call(this, infoRandom, dimfen) // Ajout version 4.6.4
}

CPointLieLieuParVar.prototype.abscisseMaximale = function () {
  return this.lieuAssocie.variableGeneratrice.valeurMini
}

CPointLieLieuParVar.prototype.abscisseMinimale = function () {
  return this.lieuAssocie.variableGeneratrice.valeurMaxi
}

CPointLieLieuParVar.prototype.testDeplacement = function (dimfen, xtest, ytest, pointr, abscr) {
  let abscisseMini, abscisseMaxi, w, dis, indDistMini, i, d
  const vari = this.lieuAssocie.variableGeneratrice
  const info = this.lieuAssocie.infoLieu
  abscisseMini = vari.valeurMini
  abscisseMaxi = vari.valeurMaxi
  // On ordonne l'abscisse minimale et maximale
  if (abscisseMini > abscisseMaxi) {
    w = abscisseMini
    abscisseMini = abscisseMaxi
    abscisseMaxi = w
  }
  // Modification pour la version 1.9.5
  const pas = (abscisseMaxi - abscisseMini) / (info.nombreDePoints - 1)
  dis = MAX_VALUE
  indDistMini = 0
  for (i = 0; i < info.nombreDePoints; i++) {
    d = distancePointPoint(xtest, ytest, this.lieuAssocie.absPoints[i],
      this.lieuAssocie.ordPoints[i])
    if (d < dis) {
      dis = d
      indDistMini = i
    }
  }
  abscr.setValue(abscisseMini + indDistMini * pas)
  // Il est inutile ici de donner des valeurs à pointr qui n'est pas utilisé par l'outil correspondant
  return true
}