File: /home/mmtprep/public_html/mathzen.mmtprep.com/assets/2dAnimation-JCSf4hAJ.js.map
{"version":3,"file":"2dAnimation-JCSf4hAJ.js","sources":["../../src/modules/2dAnimation.js"],"sourcesContent":["/**\n * Rend visible un element d'après son id\n * @param {number} id id propre à un objet MathALEA2d\n * @example montrerParDiv(s2.id) // Affiche l'objet s2\n * @author Rémi Angot\n */\n\nimport { affiniteOrtho, homothetie, rotation, symetrieAxiale } from '../lib/2d/transformations.js'\nimport { fixeBordures, ObjetMathalea2D } from './2dGeneralites.js'\n\n// JSDOC Validee par EE Juin 2022\nexport function montrerParDiv (id) {\n if (document.getElementById(id)) {\n document.getElementById(id).style.visibility = 'visible'\n } else {\n console.log(id + ' n\\'existe pas et ne peut pas être rendu visible.')\n }\n}\n\n/**\n * Rend invisible un element d'après son id\n * @param {number} id id propre à un objet MathALEA2d\n * @example cacherParDiv(s2.id) // Cache l'objet s2\n * @author Rémi Angot\n */\n// JSDOC Validee par EE Juin 2022\nexport function cacherParDiv (id) {\n if (document.getElementById(id)) {\n document.getElementById(id).style.visibility = 'hidden'\n } else {\n console.log(id + ' n\\'existe pas et ne peut pas être caché.')\n }\n}\n\n/**\n * Masque un objet pendant t0 secondes puis l'affiche pendant (t-t0) secondes avant de recommencer r fois ce cycle en tout\n * @param {ObjetMathalea2D} objet Objet MathALEA2d masqué puis affiché\n * @param {number} [t0=1] Temps en secondes avant l'apparition.\n * @param {number} [t=5] Temps à partir duquel l'animation recommence.\n * @param {string} [r='Infinity'] Nombre de répétitions (infini si ce n'est pas un nombre).\n * @example afficherTempo(ob1)\n * // Affiche ob1 au bout de 1 seconde, pendant 4 secondes puis le masque. Ce cycle est répété indéfiniment.\n * @example afficherTempo(ob1,2,9,10)\n * // Sur un cycle de 9 secondes, affiche ob1 au bout de 2 seconde puis le masque en fin de cycle. Ce cycle est répété 10 fois.\n */\n// JSDOC Validee par EE Juin 2022\nexport function afficherTempo (objet, t0 = 1, t = 5, r = 'Infinity') {\n let compteur = 1 // Nombre d'animations\n const checkExist = setInterval(function () {\n if (document.getElementById(objet.id)) {\n clearInterval(checkExist)\n cacherParDiv(objet.id)\n if (r === 1) { // On le montre au bout de t0 et on ne le cache plus\n setTimeout(function () { montrerParDiv(objet.id) }, t0 * 1000)\n } else {\n const cacheRepete = setInterval(function () { cacherParDiv(objet.id) }, t * 1000) // On cache tous les t s\n setTimeout(function () {\n montrerParDiv(objet.id) // On attend t0 pour montrer\n const montreRepete = setInterval(function () {\n montrerParDiv(objet.id)\n compteur++\n if (typeof r === 'number') {\n if (compteur >= r) {\n clearInterval(cacheRepete)\n clearInterval(montreRepete)\n }\n }\n }, t * 1000) // On montre tous les t s (vu qu'on a décalé de t0)\n }, t0 * 1000) // Fin de l'animation en boucle\n }\n }\n }, 100) // vérifie toutes les 100ms que le div existe\n}\n\n/**\n * Affiche un objet pendant t0 secondes puis le cache pendant (t-t0) secondes avant de recommencer r fois ce cycle en tout\n * @param {ObjetMathalea2D} objet Objet MathALEA2d affiché puis masqué\n * @param {number} [t0=1] Temps en secondes avant l'apparition\n * @param {number} [t=5] Temps à partir duquel l'animation recommence\n * @param {string} [r='Infinity'] Nombre de répétitions (infini si ce n'est pas un nombre)\n * @example cacherTempo(figure1)\n * // Affiche figure1 pendant 1 seconde, puis le cache pendant 4 secondes et recommence ce cycle indéfiniment.\n * @example cacherTempo(figure1,2,8,3)\n * // Affiche figure1 pendant 2 secondes, puis le cache pendant 6 secondes et recommence ce cycle 3 fois en tout.\n * @author Eric Elter\n */\n// JSDOC Validee par EE Juin 2022\nexport function cacherTempo (objet, t0 = 1, t = 5, r = 'Infinity') {\n let compteur = 1 // Nombre d'animations\n const checkExist = setInterval(function () {\n if (document.getElementById(objet.id)) {\n clearInterval(checkExist)\n montrerParDiv(objet.id)\n if (r === 1) { // On le cache au bout de t0 et on ne le montre plus\n setTimeout(function () { cacherParDiv(objet.id) }, t0 * 1000)\n } else {\n const montreRepete = setInterval(function () { montrerParDiv(objet.id) }, t * 1000) // On cache tous les t s\n setTimeout(function () {\n cacherParDiv(objet.id) // On attend t0 pour montrer\n const cacheRepete = setInterval(function () {\n cacherParDiv(objet.id)\n compteur++\n if (typeof r === 'number') {\n if (compteur >= r) {\n clearInterval(cacheRepete)\n clearInterval(montreRepete)\n }\n }\n }, t * 1000) // On montre tous les t s (vu qu'on a décalé de t0)\n }, t0 * 1000) // Fin de l'animation en boucle\n }\n }\n }, 100) // vérifie toutes les 100ms que le div existe\n}\n\n/**\n * Masque une suite d'objets puis les affiche un par un, de t secondes en t secondes avant de recommencer r fois, tApresDernier secondes après l'affichage de tous les objets\n * @param {ObjetMathalea2D[]} objets Liste d'objets MathALEA2d masqués puis affichés\n * @param {number} [t = 1] Temps en secondes entre l'apparition de chaque objet\n * @param {string} [r = 'Infinity'] Nombre de répétitions (infini si ce n'est pas un nombre).\n * @param {number} [tApresDernier = 5] Temps, après l'affichage du dernier objet, à partir duquel l'animation recommence.\n * @example afficherUnParUn([s1,s2])\n * // Affiche s1 au bout de 1 seconde, puis s2 après 1 nouvelle seconde, puis les masque après 5 secondes. Ce cycle est répété indéfiniment.\n * @example afficherUnParUn([s1,s2],2,9,10)\n * // Affiche s1 au bout de 2 secondes, puis s2 après 2 nouvelles secondes, puis les masque après 10 secondes. Ce cycle est répété en tout 9 fois.\n * @author Rémi Angot\n */\n// JSDOC Validee par EE Juin 2022\nexport function afficherUnParUn (objets, t = 1, r = 'Infinity', tApresDernier = 5) {\n let t0 = t\n const tf = objets.length * t + tApresDernier\n for (const objet of objets) {\n afficherTempo(objet, t0, tf, r)\n t0 += t\n }\n}\n\n/*\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%% LES TRANSFORMATIONS ANIMÉES %%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n*/\n\n/**\n * Fait apparaître une liste d'objets de façon animée.\n * @param {ObjetMathalea2D[]} liste liste d'objets à faire apparaître\n * @param {number} [dur = 2] Durée de l'animation en secondes\n * @param {number} [pourcentage = 0.5] Pourcentage de la durée à partir de laquelle les objets sont visibles\n * @param {number|string} [repeat = 'indefinite'] Nombre de répétitions de l'animation, peut être un entier.\n * @author Rémi Angot\n */\n// JSDOC Non Validee EE Juin 2022 (non testée)\nfunction ApparitionAnimee (liste, dur = 2, pourcentage = 0.5, repeat = 'indefinite') {\n ObjetMathalea2D.call(this, { })\n this.svg = function (coeff) {\n let code = '<g> '\n if (Array.isArray(liste)) {\n for (const objet of liste) {\n code += '\\n' + objet.svg(coeff)\n }\n } else {\n // si ce n'est pas une liste\n code += '\\n' + liste.svg(coeff)\n }\n code += `<animate attributeType=\"CSS\"\n attributeName=\"visibility\"\n from=\"hidden\"\n to=\"hidden\"\n values=\"hidden;visible;hidden\"\n keyTimes=\"0; ${pourcentage}; 1\"\n dur=\"${dur}\"\n repeatCount=\"${repeat}\"/>`\n code += '</g>'\n return code\n }\n}\n/**\n * Fait apparaître une liste d'objets de façon animée\n * @param {ObjetMathalea2D[]} liste liste d'objets à faire apparaître\n * @param {number} [dur = 2] Durée de l'animation en secondes\n * @param {number} [pourcentage = 0.5] Pourcentage de la durée à partir de laquelle les objets sont visibles\n * @param {number|string} [repeat = 'indefinite'] Nombre de répétitions de l'animation, peut être un entier\n * @return {ApparitionAnimee}\n * @example Fonction non utilisée donc pas d'exemple, fonction non testée, peut être bugguée\n * @author Rémi Angot\n */\n// JSDOC Non Validee EE Juin 2022 (impossible à tester car non utilisée)\nexport function apparitionAnimee (liste, dur = 2, pourcentage = 0.5, repeat = 'indefinite') {\n return new ApparitionAnimee(liste, dur, pourcentage, repeat)\n}\n/**\n * translationAnimee(s,v) //Animation de la translation de vecteur v pour s\n * translationAnimee([a,b,c],v) //Animation de la translation de vecteur v pour les objets a, b et v\n *\n * @author Rémi Angot\n */\nfunction TranslationAnimee (liste, v, animation = 'begin=\"0s\" dur=\"2s\" repeatCount=\"indefinite\"') {\n ObjetMathalea2D.call(this, { })\n this.svg = function (coeff) {\n let code = '<g> '\n if (Array.isArray(liste)) {\n for (const objet of liste) {\n code += '\\n' + objet.svg(coeff)\n }\n } else {\n // si ce n'est pas une liste\n code += '\\n' + liste.svg(coeff)\n }\n if (Array.isArray(v)) {\n code += '<animateMotion path=\"M 0 0 l'\n for (const vecteur of v) {\n code += ` ${vecteur.xSVG(coeff)} ${vecteur.ySVG(coeff)} `\n }\n code += `${animation} />`\n } else {\n code += `<animateMotion path=\"M 0 0 l ${v.xSVG(coeff)} ${v.ySVG(coeff)} \" ${animation} />`\n }\n code += '</g>'\n return code\n }\n}\nexport function translationAnimee (...args) {\n return new TranslationAnimee(...args)\n}\n\n/**\n * rotationAnimee(s,O,a) //Animation de la rotation de centre O et d'angle a pour s\n * rotationAnimee([a,b,c],O,a) //Animation de la rotation de centre O et d'angle a pour les objets a, b et c\n *\n * @author Rémi Angot\n */\nfunction RotationAnimee (\n liste,\n O,\n angle,\n animation = 'begin=\"0s\" dur=\"2s\" repeatCount=\"indefinite\"'\n) {\n ObjetMathalea2D.call(this, { })\n if (!Array.isArray(liste)) liste = [liste]\n const bordures = fixeBordures([liste, liste.map(el => rotation(el, O, angle))])\n this.bordures = [bordures.xmin, bordures.ymin, bordures.xmax, bordures.ymax]\n this.svg = function (coeff) {\n let code = '<g> '\n if (Array.isArray(liste)) {\n for (const objet of liste) {\n code += '\\n' + objet.svg(coeff)\n }\n } else {\n // si ce n'est pas une liste\n code += '\\n' + liste.svg(coeff)\n }\n\n code += `<animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 ${O.xSVG(coeff)} ${O.ySVG(coeff)}\"\n to=\"${-angle} ${O.xSVG(coeff)} ${O.ySVG(coeff)}\"\n ${animation}\n />`\n code += '</g>'\n return code\n }\n}\nexport function rotationAnimee (...args) {\n return new RotationAnimee(...args)\n}\n/**\n * homothetieAnimee(s,O,k) //Animation de la homothetie de centre O et de rapport k pour s\n * homothetieAnimee([a,b,c],O,k) //Animation de la homothetie de centre O et de rapport k pour les objets a, b et v\n *\n * @author Rémi Angot\n */\nfunction HomothetieAnimee (\n p,\n O,\n k,\n animation = 'begin=\"0s\" dur=\"2s\" repeatCount=\"indefinite\"'\n) {\n ObjetMathalea2D.call(this, { })\n const bordures = k > 1\n ? fixeBordures([O, homothetie(p, O, k)])\n : fixeBordures([O, p])\n this.bordures = [bordures.xmin, bordures.ymin, bordures.xmax, bordures.ymax]\n if (k > 1) {\n this.bordures = homothetie(p, O, k).bordures\n }\n this.bordures = homothetie(p, O, k).bordures\n this.svg = function (coeff) {\n const binomesXY1 = p.binomesXY(coeff)\n const p2 = homothetie(p, O, k)\n p2.isVisible = false\n const binomesXY2 = p2.binomesXY(coeff)\n const code = `<polygon stroke=\"${p.color[0]}\" stroke-width=\"${p.epaisseur}\" fill=\"${p.couleurDeRemplissage[0]}\" >\n <animate attributeName=\"points\" ${animation}\n from=\"${binomesXY1}\"\n to=\"${binomesXY2}\"\n />\n </polygon>`\n return code\n }\n}\nexport function homothetieAnimee (...args) {\n return new HomothetieAnimee(...args)\n}\n\n/**\n * symetrieAnimee(s,d) //Animation de la symetrie d'axe (d) pour s\n * symetrieAnimee([a,b,c],d) //Animation de la symetrie d'axe (d) pour les objets a, b et v\n *\n * @author Rémi Angot\n */\nfunction SymetrieAnimee (\n p,\n d,\n animation = 'begin=\"0s\" dur=\"2s\" repeatCount=\"indefinite\"'\n) {\n ObjetMathalea2D.call(this, { })\n const bordures = fixeBordures([p, symetrieAxiale(p, d)])\n this.bordures = [bordures.xmin, bordures.ymin, bordures.xmax, bordures.ymax]\n this.svg = function (coeff) {\n const binomesXY1 = p.binomesXY(coeff)\n const p2 = symetrieAxiale(p, d)\n p2.isVisible = false\n const binomesXY2 = p2.binomesXY(coeff)\n const code = `<polygon stroke=\"${p.color[0]}\" stroke-width=\"${p.epaisseur}\" fill=\"${p.couleurDeRemplissage[0]}\" >\n <animate attributeName=\"points\" ${animation}\n from=\"${binomesXY1}\"\n to=\"${binomesXY2}\"\n />\n </polygon>`\n return code\n }\n}\nexport function symetrieAnimee (...args) {\n return new SymetrieAnimee(...args)\n}\n\nfunction AffiniteOrthoAnimee (\n p,\n d,\n k,\n animation = 'begin=\"0s\" dur=\"2s\" repeatCount=\"indefinite\"'\n) {\n ObjetMathalea2D.call(this, { })\n const bordures = fixeBordures([p, affiniteOrtho(p, d, k)])\n this.bordures = [bordures.xmin, bordures.ymin, bordures.xmax, bordures.ymax]\n this.svg = function (coeff) {\n const binomesXY1 = p.binomesXY(coeff)\n const p2 = affiniteOrtho(p, d, k)\n p2.isVisible = false\n const binomesXY2 = p2.binomesXY(coeff)\n const code = `<polygon stroke=\"${p.color[0]}\" stroke-width=\"${p.epaisseur}\" fill=\"${p.couleurDeRemplissage[0]}\" >\n <animate attributeName=\"points\" ${animation}\n from=\"${binomesXY1}\"\n to=\"${binomesXY2}\"\n />\n </polygon>`\n return code\n }\n}\nexport function affiniteOrthoAnimee (...args) {\n return new AffiniteOrthoAnimee(...args)\n}\n"],"names":["montrerParDiv","id","cacherParDiv","afficherTempo","objet","t0","t","r","compteur","checkExist","cacheRepete","montreRepete","cacherTempo","ApparitionAnimee","liste","dur","pourcentage","repeat","ObjetMathalea2D","coeff","code","apparitionAnimee","TranslationAnimee","v","animation","vecteur","translationAnimee","args","RotationAnimee","O","angle","bordures","fixeBordures","el","rotation","rotationAnimee","SymetrieAnimee","p","d","symetrieAxiale","binomesXY1","p2","binomesXY2","symetrieAnimee"],"mappings":"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"}