File: /home/mmtprep/public_html/mathzen.mmtprep.com/assets/Spline-RTcaFHGe.js.map
{"version":3,"file":"Spline-RTcaFHGe.js","sources":["../../src/lib/mathFonctions/Spline.js"],"sourcesContent":["import { abs, acos, polynomialRoot, round } from 'mathjs'\n\nimport { colorToLatexOrHTML, ObjetMathalea2D } from '../../modules/2dGeneralites.js'\nimport FractionEtendue from '../../modules/FractionEtendue.js'\nimport { egal, randint } from '../../modules/outils.js'\nimport { Courbe } from '../2d/courbes.js'\nimport { point, tracePoint } from '../2d/points.js'\nimport { Segment } from '../2d/segmentsVecteurs.js'\nimport { choice } from '../outils/arrayOutils'\nimport { signesFonction, variationsFonction } from './etudeFonction.js'\nimport { MatriceCarree } from './MatriceCarree.js'\nimport { rationnalise } from './outilsMaths.js'\nimport { Polynome } from './Polynome.js'\nimport Decimal from 'decimal.js'\nimport { rangeMinMax } from '../outils/nombres'\n\n/**\n * Une fonction pour créer une Spline aléatoire\n * @param {number} n\n * @param {boolean} noeudsVisibles\n * @param {number} xMin\n * @param {number} step\n * @returns {Array<{x: number, y:number, deriveeGauche:number, deriveeDroit:number, isVisible:boolean}>}\n */\nexport function noeudsSplineAleatoire (n, noeudsVisibles, xMin = -n / 2, y0 = 0, step = 2) {\n const noeuds = []\n const isVisible = noeudsVisibles\n\n let y = y0\n let deriveeDroit = Math.cos(Math.random() * Math.PI) * randint(1, 2)\n for (let x = xMin; x < -xMin + 1; x += step) {\n const y0 = y\n noeuds.push({ x, y, deriveeGauche: deriveeDroit, deriveeDroit, isVisible })\n do {\n y = y + choice([-1, 1]) * randint(1, 2)\n } while (y > 5 || y < -5)\n do {\n deriveeDroit = Math.cos(Math.random() * Math.PI) * randint(0, 2)\n } while (deriveeDroit * (y - y0) < 0)\n }\n return noeuds\n}\n\n/**\n * Une fonction pour créer un nuage de noeuds différents d'un nuage passé en argument avec certaines options\n * @param {Array<{x: number, y:number, deriveeGauche:number, deriveeDroit:number, isVisible:boolean}>} noeudsF\n * @param {objet} options\n * @param {boolean} [options.symetrieH]\n * @param {boolean} [options.symetrieV]\n * @param {number} [options.echangeNoeuds]\n * @param {number} [options.decalVertical]\n * @param {number} [options.decalHorizontal]\n * @return {Array<{x: number, y:number, deriveeGauche:number, deriveeDroit:number, isVisible:boolean}>}\n */\nexport function modifieNoeuds (noeudsF, options) {\n const noeudsG = noeudsF.map(el => Object.assign({}, { x: el.x, y: el.y, deriveeGauche: el.deriveeGauche, deriveeDroit: el.deriveeDroit, isVisible: el.isVisible }))\n const nbNoeuds = noeudsF.length\n if (options.symetrieH) {\n for (let i = nbNoeuds; i > 0; i--) {\n noeudsG[nbNoeuds - i] = {\n x: noeudsF[nbNoeuds - i].x,\n y: noeudsF[i - 1].y,\n deriveeGauche: noeudsF[i - 1].deriveeDroit,\n deriveeDroit: noeudsF[i - 1].deriveeGauche,\n isVisible: noeudsF[i - 1].isVisible\n }\n }\n }\n if (options.symetrieV) {\n for (let i = 0; i < nbNoeuds; i++) {\n noeudsG[i] = {\n x: noeudsG[i].x,\n y: -noeudsG[i].y,\n deriveeGauche: -noeudsG[i].deriveeGauche,\n deriveeDroit: -noeudsG[i].deriveeDroit,\n isVisible: noeudsG[i].isVisible\n }\n }\n }\n if (options.echangeNoeuds) {\n const indices = rangeMinMax(0, nbNoeuds - 1)\n // le nombre de modifications doit être pair car on va échanger 2 par 2 et il doit y en avoir moins que nbNoeuds.\n const nbModifs = options.echangeNoeuds ?? 2 * Math.round(randint(2, nbNoeuds) / 2)\n const indiceDepartArrivee = []\n for (let i = 0, cpt = 0; i < nbModifs / 2 && cpt < 50;) {\n const choix1 = choice(indices, indiceDepartArrivee)\n const choix2 = choice(indices, indiceDepartArrivee)\n if (choix1 != null && choix2 != null) {\n indiceDepartArrivee.push(choix1, choix2)\n i++\n }\n cpt++\n }\n for (let i = 0; i < indiceDepartArrivee.length; i += 2) { // on va de 2 en 2 car les indices impairs sont les indices d'arrivée\n const depart = indiceDepartArrivee[i]\n const arrivee = indiceDepartArrivee[i + 1]\n // on n'échange que si l'indice du noeud concerné est avant celui d'arrivée\n const noeudInter = {\n x: noeudsG[arrivee].x,\n y: noeudsG[depart].y,\n deriveeGauche: noeudsG[depart].deriveeGauche,\n deriveeDroit: noeudsG[depart].deriveeDroit,\n isVisible: noeudsG[depart].isVisible\n }\n noeudsG[depart] = {\n x: noeudsG[depart].x,\n y: noeudsG[arrivee].y,\n deriveeGauche: noeudsG[arrivee].deriveeGauche,\n deriveeDroit: noeudsG[arrivee].deriveeDroit,\n isVisible: noeudsG[arrivee].isVisible\n }\n noeudsG[arrivee] = {\n x: noeudInter.x,\n y: noeudInter.y,\n deriveeGauche: noeudInter.deriveeGauche,\n deriveeDroit: noeudInter.deriveeDroit,\n isVisible: noeudInter.isVisible\n }\n }\n }\n if (options.decalVertical) {\n const offset = Number.isInteger(options.decalVertical) ? options.decalVertical : randint(-2, 2, 0)\n for (let i = 0; i < noeudsG.length; i++) {\n noeudsG[i] = {\n x: noeudsG[i].x,\n y: noeudsG[i].y + offset,\n deriveeGauche: noeudsG[i].deriveeGauche,\n deriveeDroit: noeudsG[i].deriveeDroit,\n isVisible: noeudsG[i].isVisible\n }\n }\n }\n if (options.decalHorizontal) {\n const offset = Number.isInteger(options.decalVertical) ? options.decalVertical : randint(-2, 2, 0)\n for (let i = 0; i < noeudsG.length; i++) {\n noeudsG[i] = {\n x: noeudsG[i].x + offset,\n y: noeudsG[i].y,\n deriveeGauche: noeudsG[i].deriveeGauche,\n deriveeDroit: noeudsG[i].deriveeDroit,\n isVisible: noeudsG[i].isVisible\n }\n }\n }\n return noeudsG\n}\n/**\n * Les noeuds sont des objets : {x,y, nombreDerive} attention à les donner dans l'ordre des x croissants\n * @author Jean-Claude Lhote\n */\nexport class Spline {\n /**\n * Passer au moins deux noeuds, sinon ça ne peut pas fonctionner d'où la valeur par défaut...\n * @param {Array<{x: number, y:number, deriveeGauche:number, deriveeDroit:number, isVisible:boolean}>} noeuds la liste des noeuds avec leurs nombres dérivés\n */\n constructor (noeuds) {\n this.polys = []\n\n if (noeuds == null || !Array.isArray(noeuds) || noeuds.length < 2) { // on ne peut pas interpoler une courbe avec moins de 2 noeuds\n window.notify('Spline : nombre de noeuds insuffisant', { noeuds })\n noeuds = [{ x: -3, y: -5, deriveeGauche: 0, deriveeDroit: 2, isVisible: false }, { x: 3, y: 0, deriveeGauche: -2, deriveeDroit: -2, isVisible: false }]\n }\n if (!trieNoeuds(noeuds)) {\n window.notify('Il y a un problème avec ces noeuds (peut-être un doublon ?) ', { noeuds })\n return\n } // les noeuds comportent une anomalie : deux valeur de x identiques\n\n for (let i = 0; i < noeuds.length - 1; i++) {\n const x0 = noeuds[i].x\n const y0 = noeuds[i].y\n const d0 = noeuds[i].deriveeDroit\n const x1 = noeuds[i + 1].x\n const y1 = noeuds[i + 1].y\n const d1 = noeuds[i + 1].deriveeGauche\n const matrice = new MatriceCarree([\n [x0 ** 3, x0 ** 2, x0, 1],\n [x1 ** 3, x1 ** 2, x1, 1],\n [3 * x0 ** 2, 2 * x0, 1, 0],\n [3 * x1 ** 2, 2 * x1, 1, 0]\n ])\n if (matrice.table.filter(ligne => ligne.filter(nombre => isNaN(nombre)).length !== 0).length > 0) {\n window.notify('Spline : Système impossible à résoudre il y a un problème avec les données ', {\n x0,\n y0,\n x1,\n y1,\n d0,\n d1\n })\n return\n }\n const determinant = matrice.determinant()// c'est maintenant une FractionEtendue !\n if (determinant.valeurDecimale === 0) {\n window.notify('Spline : impossible de trouver un polynome ici car la matrice n\\'est pas inversible, il faut revoir vos noeuds : ', {\n noeudGauche: noeuds[i],\n noeudDroit: noeuds[i + 1]\n })\n return\n }\n const matriceInverse = matrice.inverse()\n const vecteur = [y0, y1, d0, d1]\n this.polys.push(new Polynome({\n isUseFraction: true,\n coeffs: matriceInverse.multiplieVecteur(vecteur).reverse()\n }))\n }\n this.noeuds = [...noeuds]\n this.n = this.noeuds.length\n this.x = this.noeuds.map((noeud) => noeud.x)\n this.y = this.noeuds.map((noeud) => noeud.y)\n this.visibles = this.noeuds.map((noeud) => noeud.isVisible) // On récupère la visibilité des noeuds pour la courbe\n this.n = this.y.length // on a n valeurs de y et donc de x, soit n-1 intervalles numérotés de 1 à n-1.\n // this.step = step // on en a besoin pour la dérivée...\n this.fonctions = this.#convertPolyFunction()\n }\n\n pointsOfSpline (nbPoints) {\n const points = []\n const stepPoints = (this.x[this.x.length - 1] - this.x[0]) / nbPoints // on fait 50 points ça devrait suffir...\n let x = this.x[0]\n do {\n points.push({ x, y: this.#image(x) })\n x += stepPoints\n } while (x <= this.x[this.x.length - 1])\n points.push({ x: this.x[this.x.length - 1], y: this.#image(this.x[this.x.length - 1]) })\n return points\n }\n\n /**\n * convertit les polynomes en fonctions\n * @returns {Function[]}\n */\n #convertPolyFunction () {\n const f = []\n for (let i = 0; i < this.n - 1; i++) {\n f.push(this.polys[i].fonction)\n }\n return f\n }\n\n /**\n * une méthode pour ajouter deux splines... et retourner une nouvelle spline !\n * Attention ! il faut que les deux splines aient exactement le même nombre de noeuds, et que les abscisses de ces noeuds soient les mêmes !\n * @param {Spline} s\n * @param {boolean} opposite\n */\n add (s, opposite) {\n if (this.n !== s.n) {\n throw Error('Veuillez vous assurer de donner deux splines compatibles')\n }\n if (this.x.filter(el => s.x.includes(el)).length !== this.n) {\n throw Error('Veuillez vous assurer de donner deux splines compatibles')\n }\n const noeuds = []\n for (let i = 0; i < this.n; i++) {\n const x = this.x[i]\n const y = this.y[i] + (opposite ? -1 : 1) * s.y[i]\n const deriveeGauche = this.noeuds[i].deriveeGauche + (opposite ? -1 : 1) * s.noeuds[i].deriveeGauche\n const deriveeDroit = this.noeuds[i].deriveeDroit + (opposite ? -1 : 1) * s.noeuds[i].deriveeDroit\n const isVisible = this.noeuds[i].isVisible && s.noeuds[i].isVisible\n noeuds.push({ x, y, deriveeGauche, deriveeDroit, isVisible })\n }\n return new Spline(noeuds)\n }\n\n /**\n * retourne les solutions de f(x) = y sur son domaine de définition\n * @param {number} y\n * @returns {number[]}\n */\n solve (y) {\n // On a eu des soucis plus loin dans polynome.add(-y) donc on s'assure que y est bien un number.\n const yArg = y\n y = Number(y)\n if (!isNaN(y)) {\n const antecedents = []\n for (let i = 0; i < this.polys.length; i++) {\n const polEquation = this.polys[i].add(-y) // Le polynome dont les racines sont les antécédents de y\n // Algebrite n'aime pas beaucoup les coefficients decimaux...\n try {\n const liste = polynomialRoot(...polEquation.monomes)\n for (const valeur of liste) {\n let arr\n if (typeof valeur === 'number') {\n arr = round(valeur, 3)\n } else { // complexe !\n const module = valeur.toPolar().r\n if (module < 1e-5) { // module trop petit pour être complexe, c'est 0 !\n arr = 0\n } else {\n const argument = valeur.arg()\n if (abs(argument) < 0.01 || abs((abs(argument) - acos(-1))) < 0.001) { // si l'argument est proche de 0 ou de Pi ou de -Pi\n arr = round(valeur.re, 3) // on prend la partie réelle\n } else {\n arr = null // c'est une vraie racine complexe, du coup, on prend null\n }\n }\n }\n if (arr !== null && arr >= this.x[i] && arr <= this.x[i + 1]) {\n if (!antecedents.includes(arr)) {\n antecedents.push(arr)\n }\n }\n }\n } catch (e) {\n window.notify('Erreur dans Spline.solve()' + e.message, { valeur_de_y: y })\n }\n }\n return antecedents\n } else {\n window.notify(`Spline.solve() a reçu un truc bizarre à la place d'un nombre : ${yArg} !`, { valeurArgument: yArg })\n }\n }\n\n /**\n * retourne un array décrivant les variations de la Spline sur son domaine de déf\n * à améliorer... la fonction variationsFonctions ne travaille pas proprement. on peut faire beaucoup mieux avec Spline\n * @returns {*[]|null}\n */\n variations (step) {\n return variationsFonction(this.derivee, this.noeuds[0].x, this.noeuds[this.n - 1].x, step ?? new FractionEtendue(1, 100))\n }\n\n /**\n * retourne les signes pris par la Spline sur son domaine de déf\n * à améliorer... la fonction signesFonctions ne travaille pas proprement. on peut faire beaucoup mieux avec Spline\n * @returns {T[]}\n */\n signes (step) {\n return signesFonction(this.fonction, this.noeuds[0].x, this.noeuds[this.n - 1].x, step ?? new FractionEtendue(1, 10), 0.001)\n }\n\n /**\n * retourne le nombre d'antécédents entiers trouvés pour une valeur y donnée\n * @param {number} y\n * @returns {number}\n */\n nombreAntecedentsEntiers (y) {\n const solutions = this.solve(y)\n const solutionsEntieres = solutions.filter(sol => Number.isInteger(sol))\n return solutionsEntieres.length\n }\n\n /**\n * retourne le nombre d'antécédents de y\n * @param {number} y\n * @returns {number}\n */\n nombreAntecedents (y) {\n const solutions = this.solve(y)\n return solutions.length\n }\n\n nombreAntecedentsMaximum (yMin, yMax, yentier = true, entiers = true) {\n let nbMax = 0\n for (let k = yMin; k < yMax; k += (yentier ? 1 : 0.1)) {\n if (entiers) {\n nbMax = Math.max(nbMax, this.nombreAntecedentsEntiers(k))\n } else {\n nbMax = Math.max(nbMax, this.nombreAntecedents(k))\n }\n }\n return nbMax\n }\n\n /**\n * Retourne une valeur de y (si trouvée) pôur laquelle il y a exactement n antécédents\n * @param {number} n\n * @param {number} yMin\n * @param {number} yMax\n * @returns {string|*}\n */\n trouveYPourNAntecedents (n, yMin, yMax, yEntier = true, antecedentsEntiers = true) {\n const candidats = []\n if (Number.isInteger(yMin) && Number.isInteger(yMax)) {\n if (yEntier) {\n for (let y = yMin; y <= yMax; y++) {\n if ((antecedentsEntiers && this.nombreAntecedentsEntiers(y) === n && this.nombreAntecedents(y) === n) || (!antecedentsEntiers && this.nombreAntecedents(y) === n)) {\n candidats.push(y)\n }\n }\n } else {\n // ici, on n'a pas trouvé avec y entier entre xMin et yMax, on recommence avec un pas de 0.1\n for (let y = yMin; y <= yMax; y += 0.1) {\n if ((antecedentsEntiers && this.nombreAntecedentsEntiers(y) === n && this.nombreAntecedents(y) === n) || (!antecedentsEntiers && this.nombreAntecedents(y) === n)) {\n candidats.push(y)\n }\n }\n }\n } else {\n window.notify('trouveYPourNAntecedentsEntiers() appelé avec des valeurs incorrectes', { n, yMin, yMax })\n }\n if (candidats.length < 1) {\n window.notify('trouveYPourNAntecedents() : Je n\\'ai rien trouvé !', { n, yMin, yMax })\n }\n return choice(candidats) // normalement, il ne devrait jamais retourner cette valeur.\n }\n\n /**\n * retourne les min et max pour un repère contenant la courbe si ceux-ci sont sur des noeuds (c'est vivement consseillé)\n * Ne fonctionne pas si yMax ou yMin sont atteints entre deux noeuds\n * @returns {{yMin: number, yMax: number, xMax: number, xMin: number}}\n */\n trouveMaxes () {\n if (Array.isArray(this.noeuds) && this.noeuds.length > 0) {\n const xMin = Math.ceil(Math.min(...this.noeuds.map(el => el.x)))\n const yMin = Math.ceil(Math.min(...this.noeuds.map(el => el.y)))\n const xMax = Math.floor(Math.max(...this.noeuds.map(el => el.x)))\n const yMax = Math.floor(Math.max(...this.noeuds.map(el => el.y)))\n return { xMin, xMax, yMin, yMax }\n }\n }\n\n /**\n * retourne le minimum et le maximum de la fonction\n * @returns {{yMin: number, yMax: number}}\n */\n amplitude () {\n let yMin = 1000\n let yMax = -1000\n const derivees = this.derivees\n for (let i = 0; i < this.x.length - 1; i++) {\n const derivee = derivees[i]\n let maxLocal, minLocal\n if (derivee.deg === 2) {\n const a = Number(derivee.monomes[2])\n const b = Number(derivee.monomes[1])\n const c = Number(derivee.monomes[0])\n const delta = b ** 2 - 4 * a * c\n if (delta < 0) { // la dérivée ne s'annule pas donc la fonction est monotone du signe de a\n if (a > 0) { // la fonction est croissante don le max est atteint en x[i+1]\n maxLocal = this.y[i + 1]\n minLocal = this.y[i]\n } else {\n maxLocal = this.y[i]\n minLocal = this.y[i + 1]\n }\n } else if (delta === 0) { // la dérivée s'annule une seule fois mais il faut vérifier que c'est sur l'intervalle x[i] x[i+1]\n const racine = -b / 2 / a\n if (racine > this.x[i] && racine < this.x[i]) { // ça peut encore être un max ou un min !\n if (a > 0) { // c'est un minimum\n maxLocal = Math.max(this.y[i], this.y[i + 1])\n minLocal = this.#image(racine)\n } else { // c'est un maximum\n maxLocal = this.#image(racine)\n minLocal = Math.min(this.y[i], Number(this.y[i + 1]))\n }\n } else { // la racine n'est pas dans cet intervalle, donc la dérivée est monotone ici\n maxLocal = Math.max(this.y[i], Number(this.y[i + 1]))\n minLocal = Math.min(this.y[i], Number(this.y[i + 1]))\n }\n } else { // delta >0 deux racines !\n const ptiDelta = Math.sqrt(delta)\n const r1 = a > 0 ? (-b - ptiDelta) / 2 / a : (-b + ptiDelta) / 2 / a\n const r2 = a > 0 ? (-b + ptiDelta) / 2 / a : (-b - ptiDelta) / 2 / a\n if (this.x[i] < r1 && r1 < this.x[i + 1]) { // r1 est dans l'intervalle\n if (this.x[i] < r2 && r2 < this.x[i + 1]) { // r2 aussi !\n if (a > 0) { // croissant puis decroissant puis croissant : le max est soit en r1 soit en x[i+1]\n maxLocal = Math.max(this.#image(r1), this.y[i + 1])\n minLocal = Math.min(this.y[i], this.#image(r2))\n } else { // a<0 décroissant puis croissant puis décroissant\n minLocal = Math.min(this.#image(r1), this.y[i + 1])\n maxLocal = Math.max(this.y[i], this.#image(r2))\n }\n } else { // r1 est dedans mais pas r2\n if (a > 0) { // on a un max en r1 et le min est soit en x[i] soit en x[i+1]\n maxLocal = this.#image(r1)\n minLocal = Math.min(this.y[i], this.y[i + 1])\n } else { // minimum en r1, max en x[i] ou x[i+1]\n minLocal = this.#image(r1)\n maxLocal = Math.max(Number(this.y[i], this.y[i + 1]))\n }\n }\n } else { // r1 n'est pas dans l'intervalle mais peut-être r2 y est\n if (this.x[i] < r2 && r2 < this.x[i + 1]) {\n if (a > 0) { // on a le min en r2 et le max en x[i] ou en x[i+1]\n minLocal = this.#image(r2)\n maxLocal = Math.max(this.x[i], this.y[i + 1])\n } else { // on a le max en r2 et le min en x[i] ou en x[i+1]\n maxLocal = this.#image(r2)\n minLocal = Math.min(this.x[i], this.y[i + 1])\n }\n } else { // ni r1, ni r2 ne sont dans l'intervalle. La fonction est monotone\n if (a > 0) {\n if (r2 < this.x[i] || r1 > this.x[i + 1]) { // strictement croissante\n maxLocal = this.y[i + 1]\n minLocal = this.y[i]\n } else { // normalemennt r1<x[i] et r2>x[i+1] strictement décroissante\n maxLocal = this.y[i]\n minLocal = this.y[i + 1]\n }\n } else {\n if (r2 < this.x[i] || r1 > this.x[i + 1]) { // strictement décroissante\n maxLocal = this.y[i]\n minLocal = this.y[i + 1]\n } else { // normalemennt r1<x[i] et r2>x[i+1] strictement croissante\n maxLocal = this.y[i + 1]\n minLocal = this.y[i]\n }\n }\n }\n }\n }\n } else if (derivees[i].deg === 1) { // derivée affine, monotone croissante ou décroissante selon le signe de derivee[i].monomes[1]\n const a = derivees[i].monomes[1]\n if (a > 0) {\n maxLocal = this.y[i + 1]\n minLocal = this.y[i]\n } else {\n maxLocal = this.y[i]\n minLocal = this.y[i + 1]\n }\n } else { // constante !\n minLocal = this.y[i]\n maxLocal = this.y[i]\n }\n yMin = Math.min(yMin, minLocal)\n yMax = Math.max(yMax, maxLocal)\n }\n return { yMin, yMax }\n }\n\n /**\n * fournit la fonction à passer pour simuler une fonction mathématique du type (x)=>f(x)\n * @returns {function(*): number|*}\n */\n get fonction () {\n return x => this.#image(rationnalise(x))\n }\n\n /**\n * Retourne l'image de x par la fonction\n * @param {number} x\n * @returns {number}\n */\n #image (x) {\n if (typeof x !== 'number') {\n if (x instanceof FractionEtendue) {\n x = x.valeurDecimale\n } else if (x instanceof Decimal) {\n x = x.toNumber()\n }\n }\n let trouveK = false\n let k = 0\n for (let i = 0; i < this.n - 1; i++) {\n if (x >= this.x[i] && x <= this.x[i + 1]) {\n k = i\n trouveK = true\n break\n }\n }\n if (!trouveK) {\n const intervalle = `D = [${this.x[0]} ; ${this.x[this.n - 1]}]`\n window.notify('Spline: la valeur de x fournie n\\'est pas dans lìntervalle de définition de la fonction', {\n x,\n intervalle\n })\n return NaN\n } else {\n return this.fonctions[k](x)\n }\n }\n\n /**\n * retourne un array de polynomes dérivés (degré 2) de ceux de la Spline utilisé par derivee() pour définir la dérivée pour tout x du domaine\n * la fonction est continue, mais les dérivées à gauche et à droite des noeuds ne seront pas identiques\n * donc on ne peut pas en faire une Spline.\n */\n get derivees () {\n const derivees = []\n for (let i = 0; i < this.polys.length; i++) {\n derivees.push(this.polys[i].derivee())\n }\n return derivees\n }\n\n /**\n * retourne une fonction dérivée de la spline sur son domaine de définition\n */\n get derivee () {\n const intervalles = []\n for (let i = 0; i < this.noeuds.length - 1; i++) {\n intervalles.push({ xG: this.noeuds[i].x, xD: this.noeuds[i + 1].x })\n }\n return (x) => {\n const index = intervalles.findIndex((intervalle) => x >= intervalle.xG && x <= intervalle.xD)\n return this.derivees[index].image(rationnalise(x))\n }\n }\n\n /** retourne une spline construite avec les valeurs dérivées aux noeuds de la spline.\n * Il faut impérativement que cette fonction soit continue donc les nombre dérivés à gauche et à droite en chacun des noeuds doivent être égaux !\n */\n get splineDerivee () {\n const noeudsDerivee/** Array<{x: number, y:number, deriveeGauche:number, deriveeDroit:number, isVisible:boolean}> */ = []\n for (const noeud of this.noeuds) {\n noeudsDerivee.push({ x: noeud.x, y: noeud.deriveeGauche, deriveeGauche: 0, deriveeDroit: 0, isVisible: noeud.isVisible })\n }\n return new Spline(noeudsDerivee)\n }\n\n /**\n * crée l'objet mathalea2d correspondant à la courbe tracée\n * @param {Repere} repere\n * @param {number} step\n * @param {string} color\n * @param {number} epaisseur\n * @param {boolean} ajouteNoeuds\n * @param {Object} optionsNoeuds\n * @returns {Trace}\n */\n courbe ({\n repere,\n step = 0.1,\n color = 'black',\n epaisseur = 1,\n ajouteNoeuds = false,\n optionsNoeuds = {}\n } = {}) {\n return new Trace(this, {\n repere,\n step,\n color,\n epaisseur,\n ajouteNoeuds,\n optionsNoeuds\n })\n }\n}\n\n/**\n * un raccourcis pour new Spline(noeuds)\n * @param {Array<{x: number, y:number, deriveeGauche:number, deriveeDroit:number, isVisible:boolean}>} noeuds\n * @returns {Spline}\n */\nexport function spline (noeuds) {\n return new Spline(noeuds)\n}\n\n/**\n * Fonction qui trie des noeuds pour Spline afin de les remettre dans l'ordre des x croissant\n * @param {Array<{x: number, y:number,nombreDerive:number}>} noeuds\n * @author Jean-Claude Lhote\n */\nexport function trieNoeuds (noeuds) {\n let xInter, yInter, dGaucheInter, dDroitInter, isVisibleInter\n for (let i = 0; i < noeuds.length - 1; i++) {\n for (let j = i + 1; j < noeuds.length; j++) {\n if (noeuds[i].x > noeuds[j].x) {\n xInter = noeuds[i].x\n yInter = noeuds[i].y\n dGaucheInter = noeuds[i].deriveeGauche\n dDroitInter = noeuds[i].deriveeDroit\n isVisibleInter = noeuds[i].isVisible\n noeuds[i].x = noeuds[j].x\n noeuds[i].y = noeuds[j].y\n noeuds[i].deriveeGauche = noeuds[j].deriveeGauche\n noeuds[i].deriveeDroit = noeuds[j].deriveeDroit\n noeuds[i].isVisible = noeuds[j].isVisible\n noeuds[j].x = xInter\n noeuds[j].y = yInter\n noeuds[j].deriveeGauche = dGaucheInter\n noeuds[j].deriveeDroit = dDroitInter\n noeuds[j].isVisible = isVisibleInter\n } else if (egal(noeuds[i].x, noeuds[j].x)) {\n return false\n }\n }\n }\n return true\n}\n\n/**\n * @class\n * crée la courbe de la spline (objet mathalea2d)\n */\nexport class Trace extends ObjetMathalea2D {\n /**\n * @param {Spline | SplineCatmullRom}spline La splineCatmulRom ou Spline dont on veut la Trace\n * @param {Repere} repere le repère associé\n * @param {number} step le pas entre deux points\n * @param {string} color la couleur\n * @param {number} epaisseur son épaisseur\n * @param {boolean} ajouteNoeuds si true, des points sont ajoutés aux endroits des noeuds\n * @param {Object} optionsNoeud\n */\n constructor (spline, {\n repere,\n step = 0.1,\n color = 'black',\n epaisseur = 1,\n ajouteNoeuds = true,\n optionsNoeuds = {}\n } = {}) {\n super()\n const objets = []\n const { xMin, xMax, yMin, yMax } = spline.trouveMaxes()\n this.bordures = [xMin, yMin, xMax, yMax]\n for (let i = 0; i < spline.n - 1; i++) {\n if (spline.polys[i].deg > 1) {\n objets.push(new Courbe(spline.fonctions[i], {\n repere,\n epaisseur,\n color,\n step,\n xMin: spline.x[i],\n xMax: spline.x[i + 1]\n }))\n } else {\n const s = new Segment(spline.x[i] * repere.xUnite, spline.y[i] * repere.yUnite, spline.x[i + 1] * repere.xUnite, spline.fonctions[i](spline.x[i + 1]) * repere.yUnite, color)\n s.epaisseur = epaisseur\n objets.push(s)\n }\n if (ajouteNoeuds && spline.visibles[i]) {\n const noeud = point(spline.x[i], spline.y[i])\n const traceNoeud = tracePoint(noeud)\n if (optionsNoeuds) {\n if (optionsNoeuds.color) {\n traceNoeud.color = colorToLatexOrHTML(optionsNoeuds.color)\n traceNoeud.couleurDeRemplissage = colorToLatexOrHTML(optionsNoeuds.color)\n }\n if (optionsNoeuds.epaisseur) {\n traceNoeud.epaisseur = optionsNoeuds.epaisseur\n }\n if (optionsNoeuds.style) {\n traceNoeud.style = optionsNoeuds.style\n }\n if (optionsNoeuds.taille) {\n traceNoeud.taille = optionsNoeuds.taille\n }\n }\n objets.push(traceNoeud)\n }\n }\n if (ajouteNoeuds && spline.visibles[spline.n - 1]) {\n const noeud = point(spline.x[spline.n - 1], spline.y[spline.n - 1])\n const traceNoeud = tracePoint(noeud)\n if (optionsNoeuds) {\n if (optionsNoeuds.color) {\n traceNoeud.color = colorToLatexOrHTML(optionsNoeuds.color)\n traceNoeud.couleurDeRemplissage = colorToLatexOrHTML(optionsNoeuds.color)\n }\n if (optionsNoeuds.epaisseur) {\n traceNoeud.epaisseur = optionsNoeuds.epaisseur\n }\n if (optionsNoeuds.style) {\n traceNoeud.style = optionsNoeuds.style\n }\n if (optionsNoeuds.taille) {\n traceNoeud.taille = optionsNoeuds.taille\n }\n }\n objets.push(traceNoeud)\n }\n this.svg = function (coeff) {\n let code = ''\n for (const objet of objets) {\n code += '\\n\\t' + objet.svg(coeff)\n }\n return code\n }\n this.tikz = function () {\n let code = ''\n for (const objet of objets) {\n code += '\\n\\t' + objet.tikz()\n }\n return code\n }\n }\n}\n"],"names":["noeudsSplineAleatoire","n","noeudsVisibles","xMin","y0","step","noeuds","isVisible","y","deriveeDroit","randint","x","choice","_Spline","__privateAdd","_convertPolyFunction","_image","trieNoeuds","i","x0","d0","x1","y1","d1","matrice","MatriceCarree","ligne","nombre","matriceInverse","vecteur","Polynome","noeud","__privateMethod","convertPolyFunction_fn","nbPoints","points","stepPoints","image_fn","s","opposite","el","deriveeGauche","yArg","antecedents","polEquation","liste","polynomialRoot","valeur","arr","round","argument","abs","acos","e","variationsFonction","FractionEtendue","signesFonction","sol","yMin","yMax","yentier","entiers","nbMax","k","yEntier","antecedentsEntiers","candidats","xMax","derivees","derivee","maxLocal","minLocal","a","b","c","delta","racine","ptiDelta","r1","r2","rationnalise","intervalles","index","intervalle","noeudsDerivee","repere","color","epaisseur","ajouteNoeuds","optionsNoeuds","Trace","f","Decimal","trouveK","Spline","spline","xInter","yInter","dGaucheInter","dDroitInter","isVisibleInter","j","egal","ObjetMathalea2D","objets","Courbe","Segment","point","traceNoeud","tracePoint","colorToLatexOrHTML","coeff","code","objet"],"mappings":"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"}