XMath : plus de maths !
Par -Alexandre LEGOUT aka LAlex- le 23 juin 2005, 11:36 - AS2 - Lien permanent
Pour mes besoins en calculs mathématiques, certaines fonctions ou optimisations m'étaient nécessaires. C'est pourquoi j'ai crée la classe XMath, qui aurait du a priori étendre la classe Math. Seulement, la classe Math étant composée uniquement de propriétes et de méthodes statiques, l'héritage se faisait mal, et m'obligeait à jongler entre les classes XMath et Math...
Mais c'était sans compter sur le __resolve que j'ai appliqué sur ma classe, me permettant ainsi de ne manipuler qu'une seule classe.
La voici. Evidemment, comme toujours, je suis ouvert à toute proposition d'amélioration! ![]()
/**
Utilisation :
* Extended Math class
* @class XMath
* @version 0.1
* @author <a href="http://www.lalex.com/">LAlex</a>
* @since 2005-06-22
* @about The class is dynamic to be able to use __resolve...
*/
dynamic class com.lalex.math.XMath {
// Cosinus and sinus of round values in degree
private static var __COS:Array = new Array();
private static var __SIN:Array = new Array();
// 2*PI
// Can be used for radians modulos
private static var __2PI:Number = 2*Math.PI;
/**
* "Simple" cosinus
* @param n Round value in degrees
* @return Cosinus of the degree value, with 2 decimals
*/
public static function simpleCos(n:Number):Number {
return __COS[n];
}
/**
* "Simple" sinus
* @param n Round value in degrees
* @return Sinus of the degree value, with 2 decimals
*/
public static function simpleSin(n:Number):Number {
return __SIN[n];
}
/**
* Return 2*Math.PI value
*/
public static function get PI2():Number {
return __2PI;
}
/**
* Initilisation of the XMath static properties
*/
private static function __init() {
for (var i:Number = 0 ; i<360 ; i++) {
__COS[i] = Math.round(Math.cos(Deg2Rad(i))*100)/100;
__SIN[i] = Math.round(Math.sin(Deg2Rad(i))*100)/100;
}
}
/**
* Launch initialisation
*/
private static var __initSinCos = __init();
/**
* Convert a degree value to radians
* @param deg Degree value
* @return Radian value
*/
public static function Deg2Rad(deg:Number):Number {
return deg*Math.PI/180;
}
/**
* Convert a radian value to degrees
* @param rad Radian value
* @return Degree value
*/
public static function Rad2Deg(rad:Number):Number {
return rad*180/Math.PI;
}
/**
* Return a modulo of a value
* @param a Numeric value
* @param mod Modulo (optional) Default 360
* @return value >=0 and <mod
*/
public static function modulo(a:Number, mod:Number):Number {
if (!mod) {
mod = 360;
}
return ((a%mod+mod)%mod);
}
/**
* Return a numeric value with a defined number of decimals
* @param n Numeric value
* @param d Number of décimals (default 0)
* @return "Rounded" value
*/
public static function roundTo(n:Number, d:Number):Number {
switch(d) {
case 2:
return Math.round(n*100)/100;
case 1:
return Math.round(n*10)/10;
case 0:
case undefined:
return Math.round(n);
default:
var puis:Number = Math.pow(10, d);
return Math.round(n*puis)/puis;
}
}
/**
* Return the property or method of the Math class
* if not found in the XMath class
*/
private static function __resolve(p:String) {
if (typeof Math[p] == "function")
return function() { return Math[p].apply(null, arguments); }
else
return Math[p];
}
}import com.lalex.math.XMath;
trace(XMath.simpleCos(120)); // 0.5
trace(XMath.cos(XMath.PI2)); //0
Commentaires
pourquoi l'obligation du dynamic pour utiliser __resolve ?
Je ne suis pas fan de __resolve dans ce cas.
Ca fonctionne, mais on pert la vérification de la syntaxe et la complétion automatique.
Qu'est-ce qui ne fonctionne pas dans l'héritage ?
essaye d'hériter Math, tu verras
Quitte à optimiser un max, l'une des première choses à faire n'est-elle pas de mettre Math.PI/180 dans une __CONSTANTE ?
SuperDevy> Certainement, mais étant donné que Math.PI n'est utilisée qu'une seule fois dans chaque méthode, je ne sais pas si ca vaut vraiment le coup d'enlever la gestion du PI à la classe Math...
Parce que sinon le compilateur n'est pas d'accord pour nous laisser utiliser une méthode qui n'est pas déclarée dans la classe... a moins d'hériter de Math, mais ca n'enlèverai pas la necessité d'utiliser le résolve, donc autant éviter...
c'est vrai que dans mon test, j'hérite de Math ET j'utilise __resolve
c'est si génant ?
d'un coté, ca ne me gène pas qu'il y ait un dynamic lol
neo> C'est pas génant, mais utiliser un héritage qui ne sert à rien, c'est inutile...
Salut,
Et poster tout ça en double sur le wikiMB ça te dit ^^ ?
niko> Ce n'est qu'un premier jet... Je mettrai une bibliothèque mathématique complete sur le wiki un des ces 4!
Euh c'est pas plus simple de faire
return a%mod;@samsam> Essaie avec -240...
C'est le seul moyen de gérer les nombres négatifs:)
Je veux des exercices en denombrement.
les maths sont fantastique
Salut , j'ai besoin des sujet sur les fonction logarithme neperien et exponentielle
exos sur le plan médiateur
J'ai besoin des exercices et des probèmes sur les fonctions logarithme néperien et exponantielle.
De plus si je peu avoir aussi des anciens sujet des bac passée.
Fil des commentaires de ce billet