objets/CLigneBrisee.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 NatObj from '../types/NatObj'
import { cens, round3dg } from '../kernel/kernel'
import CLignePolygonaleAncetre from './CLignePolygonaleAncetre'
export default CLigneBrisee

/**
 * Classe représentant une ligne brisée.
 * @constructor
 * @extends CLignePolygonaleAncetre
 * @param {CListeObjets} listeProprietaire  La liste propriétaire.
 * @param {CImplementationProto} impProto  null ou la construction propriétaire.
 * @param {boolean} estElementFinal  true si élément final de construction.
 * @param {Color} couleur  La couleur.
 * @param {boolean} masque  true si l'objet est masqué.
 * @param {StyleTrait} style  Le style du tracé.
 * @param {CNoeudPointeurSurPoint[]} colPoints  Tableau de CNoeudPointeurSurPoint qui donne les sommets.
 * @returns {CLigneBrisee}
 */
function CLigneBrisee (listeProprietaire, impProto, estElementFinal, couleur, masque, style, colPoints) {
  if (arguments.length === 1) CLignePolygonaleAncetre.call(this, listeProprietaire)
  else {
    CLignePolygonaleAncetre.call(this, listeProprietaire, impProto, estElementFinal, couleur,
      masque, style, colPoints)
  }
}
CLigneBrisee.prototype = new CLignePolygonaleAncetre()
CLigneBrisee.prototype.constructor = CLigneBrisee
CLigneBrisee.prototype.superClass = 'CLignePolygonaleAncetre'
CLigneBrisee.prototype.className = 'CLigneBrisee'

CLigneBrisee.prototype.getClone = function (listeSource, listeCible) {
  const colClone = new Array(this.nombrePoints)
  for (let i = 0; i < this.nombrePoints; i++) {
    const noeud = this.colPoints[i]
    colClone[i] = noeud.getClone(listeSource, listeCible)
  }
  const ind1 = listeSource.indexOf(this.impProto)
  return new CLigneBrisee(listeCible, listeCible.get(ind1, 'CImplementationProto'),
    this.estElementFinal, this.couleur, this.masque, this.style.getClone(), colClone)
}
CLigneBrisee.prototype.abscisseMinimale = function () {
  return 0
}
CLigneBrisee.prototype.abscisseMaximale = function () {
  return 1
}
CLigneBrisee.prototype.getNature = function () {
  return NatObj.NLigneBrisee
}
CLigneBrisee.prototype.confonduAvec = function (p) {
  let ptp1, ptp2, i

  if (p.className === this.className) {
    const nombrePoints = this.nombrePoints
    if (nombrePoints !== p.nombrePoints) return false
    // On regarde si une ligne brisée formée des mêmes points
    // a déjà été crée dans le même sens
    let confondu = true
    for (i = 0; i < this.nombrePoints; i++) {
      ptp1 = this.colPoints[i].pointeurSurPoint
      ptp2 = p.colPoints[i].pointeurSurPoint
      confondu = confondu && (ptp1 === ptp2)
    }
    // ou dans le sens inverse
    if (!confondu) {
      confondu = true
      for (i = 0; i < nombrePoints; i++) {
        ptp1 = this.colPoints[i].pointeurSurPoint
        ptp2 = p.colPoints[nombrePoints - i - 1].pointeurSurPoint
        confondu = confondu && (ptp1 === ptp2)
      }
    }
    return confondu
  } else return false
}
CLigneBrisee.prototype.createg = function () {
  let points = ''
  // Pour un polygone, le dernier point est le même que le premier mais pas pour svg
  for (let i = 0; i < this.nombrePoints; i++) {
    points += round3dg(this.absPoints[i]) + ',' + round3dg(this.ordPoints[i]) + ' '
  }
  let style = ''
  const stroke = this.style.stroke
  if (stroke.length !== 0) style += 'stroke-dasharray:' + stroke + ';'
  const strokewidth = this.style.strokeWidth
  style += 'stroke-width:' + strokewidth + ';'
  // style += "stroke:"+this.couleur.rgb()+";"; Modifié version 4.9.9.4
  // style += 'stroke:' + this.color + ';' // Modifié version 6.9.1
  style += 'stroke:' + this.color + ';opacity:' + this.couleur.opacity + ';'
  style += 'fill:none'
  return cens('polyline', {
    points,
    style,
    // Ligne suivante modifiée version 6.5.2
    // 'pointer-events': 'none'
    'pointer-events': this.pointerevents
  })
}
// Version JavaScript : trace est spécifique pour CPolygone et CLigneBrisee
CLigneBrisee.prototype.trace = function (svg) {
  const g = this.createg()
  g.setAttribute('id', this.id)
  svg.appendChild(g)
  this.g = g
}
CLigneBrisee.prototype.update = function (svg) {
  const oldg = this.g
  const g = this.createg()
  svg.replaceChild(g, oldg)
  g.setAttribute('id', this.id)
  this.g = g
  if (this.cbmap) this.resetEventListeners() // Ajout version 6.5.2
}
CLigneBrisee.prototype.chaineDesignation = function () {
  return 'desLigneBrisee'
}