/*
* 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 NatArc from '../types/NatArc'
import Vect from '../types/Vect'
import CArcDeCercle from './CArcDeCercle'
import { zeroAngle } from 'src/kernel/kernel'
export default CArcDeCercleDirect
/**
* Classe représentant un arc de cercle tracé dans le sens direct.
* Il peut être défini de deux façons :
* Par l'origine, un point donnant le début de l'ar et un point donnant la direction de la fin de l'arc.
* Ou par l'origine, un point donnant le début de l'arc et la valeur de l'angle au centre.
* @constructor
* @extends CArcDeCercle
* @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
* @param {boolean} masque true si l'objet est masqué.
* @param {StyleTrait} style le style de tracé.
* @param {CPt} o Le centre de l'arc.
* @param {CPt} a Le point donnant le début de l'arc.
* @param {CPt} pointFinArc Le point donnant la fin de l'arc.
* Si null c'est que l'arc est défini par son angle au centre.
* @param {CValeurAngle} angleAuCentre L'angle au centre (si pointFinArc est null)
* @returns {CArcDeCercleDirect}
*/
function CArcDeCercleDirect (listeProprietaire, impProto, estElementFinal, couleur,
masque, style, o, a, pointFinArc, angleAuCentre) {
if (arguments.length === 1) CArcDeCercle.call(this, listeProprietaire)
else {
CArcDeCercle.call(this, listeProprietaire, impProto, estElementFinal, couleur, masque, style)
this.o = o
this.a = a
this.pointFinArc = pointFinArc
this.angleAuCentre = angleAuCentre
}
}
CArcDeCercleDirect.prototype = new CArcDeCercle()
CArcDeCercleDirect.prototype.constructor = CArcDeCercleDirect
CArcDeCercleDirect.prototype.superClass = 'CArcDeCercle'
CArcDeCercleDirect.prototype.className = 'CArcDeCercleDirect'
CArcDeCercleDirect.prototype.getClone = function (listeSource, listeCible) {
const ind1 = listeSource.indexOf(this.o)
const ind2 = listeSource.indexOf(this.a)
let ptFinArc = null
let angleAuCentreClone = null
if (this.pointFinArc === null) { angleAuCentreClone = this.angleAuCentre.getClone(listeSource, listeCible) } else {
const ind3 = listeSource.indexOf(this.pointFinArc)
ptFinArc = listeCible.get(ind3, 'CPt')
}
const ind4 = listeSource.indexOf(this.impProto)
return new CArcDeCercleDirect(listeCible, listeCible.get(ind4, 'CImplementationProto'),
this.estElementFinal, this.couleur, this.masque, this.style.getClone(), listeCible.get(ind1, 'CPt'),
listeCible.get(ind2, 'CPt'), ptFinArc, angleAuCentreClone)
}
CArcDeCercleDirect.prototype.path = function () {
const u = new Vect(this.centreX, this.centreY, this.origine_x, this.origine_y)
const v = new Vect()
u.tourne(this.valeurAngleAuCentre, v)
const xf = this.centreX + v.x
const yf = this.centreY + v.y
const largearcflag = (this.valeurAngleAuCentre >= 0) ? '0 ' : '1 '
return 'M ' + this.origine_x.toString() + ' ' + this.origine_y + 'A' + this.rayon + ',' +
this.rayon + ' 0 ' + largearcflag + ' 0 ' + xf.toString() + ',' + yf.toString()
}
CArcDeCercleDirect.prototype.abscisseCurviligne = function (ang) {
let angrot, difang
angrot = this.valeurAngleAuCentre
if (angrot === 0) return 0
if (angrot < 0) angrot = angrot + 2 * Math.PI
difang = ang - this.ang1
if (difang < 0) difang = difang + 2 * Math.PI
return difang / angrot
}
CArcDeCercleDirect.prototype.surArc = function (xt, yt) {
const w = new Vect(this.centreX, this.centreY, xt, yt)
const ang = w.angleRad()
if (zeroAngle(ang - this.ang1) || zeroAngle(ang - this.ang2)) return true
if (this.ang1 <= this.ang2) return ((ang >= this.ang1) && (ang <= this.ang2))
else return ((ang <= this.ang2) || (ang >= this.ang1))
}
CArcDeCercleDirect.prototype.natureArc = function () {
return NatArc.ArcDirect
}