begin process at 2012 02 08 09:28:53
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Flash / Flash MX

 > 

Scripts

 > 

ActionScript

 > 

Problème de math (égalité refusée), Deux valeurs égales sont considérées comme différentes


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème de math (égalité refusée), Deux valeurs égales sont considérées comme différentes

mardi 10 avril 2007 à 11:03:09 | Problème de math (égalité refusée), Deux valeurs égales sont considérées comme différentes

Darkrats

Bonjour à tous.

Pour ceux qui voyagent aussi sur le forum Media-box, ce message vous sera peut-être famillié.

J'ai un gros problème, voyez-vous, j'ai un script qui déconne et je n'en comprends pas la raison.

Voici le problème :
J'ai fait un script qui me permet d'obtenir le coefficient angulaire et le terme indépendant d'une droite passant par deux points donnés.
Code :
function equationDroite(aInitial:Array, aFinal:Array):Object{
        var objet        :Object        = new Object();
        if((aInitial[1] - aFinal[1]) == 0){
            objet.orientation            = "horizontal";
            objet.coefficientAngulaire    = 0;
            objet.termeIndependant        = aFinal[1];
        }else if((aFinal[0] - aInitial[0]) == 0){
            objet.orientation            = "vertical";
            objet.coefficientAngulaire    = 0;
            objet.termeIndependant        = aFinal[0];
        }else{
           
 
objet.orientation            = "oblique";
            // Calcul du coéfficiant angulaire de la droite
            objet.coefficientAngulaire    = (aInitial[1] - aFinal[1])/(aInitial[0] - aFinal[0]);
            // Calcul du terme indépendant de la droite
            objet.termeIndependant        = aInitial[1] - aInitial[0]*objet.coefficientAngulaire;
        }
        var var1    :Number    = Math.floor(aFinal[0]*objet.coefficientAngulaire);
        var var2    :Number    = Math.floor(aFinal[1] - objet.termeIndependant);
        // Vérification des valeurs trouvées
        if(typeof(objet.coefficientAngulaire) != "number" || typeof(objet.termeIndependant) != "number"){
            trace("erreur 1");
        }else if(    objet.orientation == "oblique" &&
                    aFinal[1] != ((aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant)){
            trace("erreur 2");

        }else{
            return(objet);
        }
    }

Fin Code (en bleu foncé : le code d'où peut provenir le problème, en gris : le code supplémentaire mais qui n'est pas concerné c'est juste pour info et enfin en rouge/rose : la vérification qui déconne)

Lorsque je le teste, pas de problème.

Sauf (bhein vi sinon je posterais pas), pour certaines valeurs
Par exemple, quand je teste cette fonction avec les valeurs : aInitial = [0, 0] et aFinal = [19.25, 350]
Il me renvoit "erreur 2".

J'ai essayé de savoir quel étaient les différents résultats et j'obtiens ceci :
((aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant) = 5.6843418860808e-14

Or, lorsque je lui demande les informations morceaux par morceaux j'obtiens :
aFinal[0]*objet.coefficientAngulaire = 350 et objet.termeIndependant = 0;

J'ai essayé de mettre un Math.floor au cas où le problème viendrait de mauvaises approximations mais j'ai beau tout faire, il veut pas lâcher !
Il continue de me refuser ma condition ... mais le plus bizarre, c'est que ce n'est pas systématique et que si on regarde c'est correct.
Parce que quand j'analyse les termes séparés, j'obtiens bien : 350 et 350 et quand je soustraits les termes entre eux, il me renvoit la valeur 5.6843418860808e-14 alors que (si je ne suis pas trop nul en math) 350 - 350 devrait me donner 0, non ?

Ce terme "5.6843418860808e-14" est en plus considéré comme un chiffre (pourtant chuis pas bigleux, y a bien une lettre et un - ... je penche pour un exposant -14 mais chuis pas sûr ... )

Quelqu'un aurait une suggestion ?

J'ai bien envie de bazarder ma vérification mais je tenais à faire ma fonction le plus proprement possible

Pour info, les chiffres utilisés viennent d'autres scripts mais j'ai isolé le problème ... ce qui explique les valeurs décimales dans mes coordonnées.

Merci d'avance à tous les fous qui prendront un peu de temps pour décortiquer ce bazard.

--------- Darkrats ---------
la loi est dure mais c'est la loi
 -------- Infograpix --------
mardi 10 avril 2007 à 18:20:36 | Re : Problème de math (égalité refusée), Deux valeurs égales sont considérées comme différentes

kingcobra

Salut Ben, déjà y'a un truc trop bisarre dans ton code : Tu dis aInitial = [0, 0] et aFinal = [19.25, 350] mais ensuite tu fais des calculs sur des tableaux et des flottants... Par exemple cette ligne, je ne sais même pas comment elle fait pour marcher. Tu multiplies un tableau avec un coefficient ?!! aFinal[0]*objet.coefficientAngulaire = 350; Si flash parle en adresse de tableau, c'est normal que tu ais des résultats tout bisarre. Je m'y penche un peu plus tout à l'heure.

KiNgCoBrA
mardi 10 avril 2007 à 18:23:11 | Re : Problème de math (égalité refusée), Deux valeurs égales sont considérées comme différentes

kingcobra

OOOps autant pour moi je pensais que c'était des tableau à 2 dimensions...

KiNgCoBrA
mardi 10 avril 2007 à 18:36:08 | Re : Problème de math (égalité refusée), Deux valeurs égales sont considérées comme différentes

kingcobra

Donc, j'ai testé ta fonction (ça t'aidera peut être) :

Executé avec : equationDroite([0, 0],[19.25, 350]);
Voici la trace obtenue :

objet.orientation = oblique
aFinal[1] = 350
calcul = 3500
erreur 2

On a bien une erreur 2 car les termes sont différents ==> la condition renvoie vrai. Tout est normal, ton calcul est il celui que tu veux vraiment ?

KiNgCoBrA
mercredi 11 avril 2007 à 13:42:27 | Re : Problème de math (égalité refusée), Deux valeurs égales sont considérées comme différentes

Darkrats

Salut,

Merci de t'être penché sur mon cas.

Je ne comprends pas comment ton calcul vaut 3500. Est-ce bien le résultat de ((aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant) ? Parce que je n'obtiens pas la même chose que toi ...
J'ai retesté la fonction dans un nouveau fichier flash.

J'ai modifié le trace dans l'envoi de l'erreur 2 :
    trace("erreur 2 :: orientation " + objet.orientation + " :: vérification : " + aFinal[1] + " == " + ((aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant));
Voici le résultat obtenu :
    erreur 2 :: orientation oblique :: vérification : 350 == 350

Or, pour moi et quoi qu'en pense Flash, 350 est égal à 350 !!!

Maintenant si je lui demande de me tracer la soustraction des membres (et voir ainsi si le résultat vaut ou non zéro) :
    trace("erreur 2 :: orientation " + objet.orientation + " :: vérification : " + aFinal[1] + " == " + ((aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant));
    trace("soustraction des membres : " + (aFinal[1] - ((aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant)));

J'obtiens ceci :
    erreur 2 :: orientation oblique :: vérification : 350 == 350
    soustraction des membres : -5.6843418860808e-14

Faut admettre qu'il y a un problème, non ?
Peux-tu me confirmer que si tu remplaces tes traces par ceux cités précédemment, tu continues à obtenir 3500 ?

Le but de mon calcul est d'obtenir le coefficient angulaire et le terme indépendant de la droite passant par deux points. La condition est là afin de vérifier que le calcul est correct.
Comme le terme indépendant est calculé d'après le point d'origine et que la droite doit passer aussi par le second point (aFinal), je vérifie la condition en comparant les deux membres.

Ca peut paraître totalement futile comme fonction, mais elle fait partie d'un ptit projet (délire). Elle a été incorporée dans une classe afin de pouvoir être réutilisée à volonté, c'est pour ça que j'aimerais résoudre ce (oui n'ayons pas peur des mots : ) BUG.

Je ne dis pas "bug" à la légère car ce calcul fonctionne bien dans d'autres cas... si tu essaies avec ces valeurs, tu n'auras aucune erreur
    equationDroite([0, 0],[20, 350]);
Etrange, non ?

--------- Darkrats ---------
la loi est dure mais c'est la loi
 -------- Infograpix --------
jeudi 12 avril 2007 à 00:13:25 | Re : Problème de math (égalité refusée), Deux valeurs égales sont considérées comme différentes

kingcobra

Réponse acceptée !
salut,

bon une bonne nouvelle surement, je pense avoir trouvé ton probleme.
Je sais que t'en a deja parlé mais c'est bien un probleme d'arrondi. La trace ne fait qu'afficher ce que flash veut bien afficher...
Et le 350 calculé est en fait 350 et des brouettes ce qui est malheureusement bien différent de 350. Tu ne peux pas faire de floor() ou de ceil() car tu ne sais pas si c'est 350 + ou - une brouette. Donc c'est round(). Voici ta nouvelle condition :
else if (objet.orientation == "oblique" && aFinal[1] != Math.round(((aFinal[0]*objet.coefficientAngulaire)+objet.termeIndependant))) {

Et ça marche ;) .

KiNgCoBrA
jeudi 12 avril 2007 à 11:57:00 | Re : Problème de math (égalité refusée), Deux valeurs égales sont considérées comme différentes

Darkrats

Salut,

Merci visiblement c'était bien ça.
Pour être sûr de mon coup et éviter d'éventuels problème, je vais légèrement modifier ma condition :
Code :
    if(    objet.orientation == "oblique" &&
           Math.round(aFinal[1] - (aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant) != 0){

Fin code

Sinon, c'est bizarre, il me semblait avoir testé via des floor et ça n'avait rien donné.
Enfin l'important c'est que ça marche. J'aurais préféré évité les arrondis afin de rester le plus précis possible, mais vaut mieux un arrondis qu'un bug, non ?

Je me tate en fait à mettre tout le projet dans une source... mmh à voir, est ce que ça en vaut vraiment la peine
En tout cas, encore une fois, un grand merci.

--------- Darkrats ---------
la loi est dure mais c'est la loi
 -------- Infograpix --------


Cette discussion est classée dans : problème, objet, afinal, coefficientangulaire, ainitial


Répondre à ce message

Sujets en rapport avec ce message

Problème Load XML [ par superlolo56 ] Hello tout le monde. Mon souci, ça doit pas être très compliqué: Je loade un fichier XML, je le charge dans un tableau, mais impossible d'afficher le Instancier un objet contenu dans la bibliothèque [ par ov3rdoze ] Bonjour à tous Je débute en AS et suis face à un problème. J'ai créé un clip qui est dans ma bibliothèque. Je souhaiterais qu'à un moment précis (cli problème sur du FLASH [ par jahnow ] bonjour,je cherche une personne qui pourrait m'aider, je ne connais pas du tout la programmation flash et je developpe en html. J'ai utilisé un objet AS3 problème avec mes variables... [ par OmbreNoir ] Bonjour, Je rencontre 2 problèmes avec les variables dans ActionScript 3. 1- Si j'ai une variable dans scénario principale, et que je veux la prendr As3 This[] pour un sous objet [ par solage ] Bonjour, Je reviens de nouveau pour un problème avec "this[]". Je n'arrive pas à appeler dynamiquement un sous objet... exemple: objet1.objetDedans1.x Problème avec un bouton [ par pliskin56 ] Bonjour à tous, Je suis entrain de créer un petit jeu dans le cadre d'une UV. Sauf que j'ai un problème. Voilà ce que je veux faire, je veux créer un flashvars [ par yasdar ] bonjour voila j'ai une animation flash qui fonctionne très bien, il a du texte provenant d'une variable Flashvar( inclue dans le HTML de la page.html) Rotation d'un objet, controlée par le déplacement de la souris [ par spip931 ] Bonjour à tous et à toutes, Je vais tacher d'être le plus simple et le plus concis possible. Je vroudrais réaliser une animation assez compliquée. En bouton flash fonctionne sur un swf et pas sur un autre [ par yoplaboum69 ] Bonjour, Alors la je ne comprend pas du tout ce qui se passe... J'ai un bouton qui ne fonctionne pas avec un onPress et dès que je le transforme en c Problème de police avec animation fond transparent [ par inaden ] Bonjour, depuis que j'ai installé le nouveau lecteur flash j'ai un problème d'affichage de police avec l'animation intégrée en fond transparent ( [url


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,278 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales