IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Retour des valeurs décimales


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Retour des valeurs décimales
    Bonjours

    Je dois programmer un projet de clipping paramétrique 2D et remplissage de polygone.

    Je tente de calculer le point d'intersection entre 2 droites,je pense y être arrivé mais j'ai un problème technique

    Voici déja mes programmes

    PointPoly est un maillon de la liste chainé du polygone,elle est composé de 3 variables : x,y,et un pointeur sur le point suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    void Intersection(PointPoly* p1,PointPoly* p2,PointPoly* a,PointPoly* b){
        double c,d,e,t;
        double arg1=0,arg2=0;
        Point inter;
        double result1,result4;
        if (a->x==b->x){
            std::cout << "( " << a->x << " - " << p1-> x << ") / ( " << p2->x << " - " << p1->x << " ) - ( " << b->x << " - " << a->x << ") " << std::endl;
            c= (a->x-p1->x);
            d= (p2->x-p1->x);
            e= (b->x-a->x);
            t= c/(d-e);
            /*std::cout << " c = " << c <<std::endl;
            std::cout << " d = " << d << std::endl;
            std::cout << " e = " << e << std::endl;
            std::cout << "t = " << t << std::endl;*/
            result1 = p1->x +((p2->x-p1->x)*t);
            result4= p1->y+ ((p2->y-p1->y)*t);
            /*std::cout << " result1 = " << result1 << std::endl;
            std::cout << "result 4 = " << result4 << std::endl;*/
        }
        else{
            arg1=coefa(p1,p2);
            std::cout << " arg1 = " << arg1 << std::cout;
            std::cout << coefb(a,b) << " - " << coefb(p1,p2) << "/" << coefa(p1,p2) << std::endl;
            result1=(coefb(a,b)-coefb(p1,p2))/(coefa(p1,p2)-coefa(a,b));
            result4=coefa(p1,p2)*result1+coefb(p1,p2);
            std::cout << " result1 = " << result1 << std::endl;
            std::cout << "result 4 = " << result4 << std::endl;
     
        }
    }
     
    double coefa(PointPoly* p1,PointPoly* p2){
     
        return (p1->y-p2->y)/(p1->x-p2->x);
    }
     
    double coefb(PointPoly* p1,PointPoly* p2){
     
        return (p1->y-(p1->y-p2->y)*p1->x/(p1->x-p2->x));
    }
    Le problème se situe à cette ligne

    result1=(coefb(a,b)-coefb(p1,p2))/(coefa(p1,p2)-coefa(a,b));

    En effet le 3ème facteur ne me renvoit pas exactement la bonne valeur..

    par exemple : exemple : (100+126/1) = 226 et (100+126/1,09095833) = 205 (bon résultat)

    Il devrait donc me renvoyer 1,09095.. au lieu de 1.

    Merci beaucoup

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    Tu ne fournis pas assez d'infomations, il faudrait que l'on ait la structure PointPoly.

    Le fait que 1.09 soit "tronqué" en 1 me fait penser qu'à un moment, tu transtypes un "double" en "int".
    "PointPoly" n'aurait pas des membres "x" et "y" en type "int"?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci de ta réponse

    Voici la structure PointPoly

    Polygone.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include "Bresenham.h"
     
    struct Point{
            int x;
            int y;
    };
     
    typedef struct PointPoly PointPoly;
     
    struct PointPoly{
     
            int x;
            int y;
            struct PointPoly* next;
    };
     
     
    typedef struct PointPoly* listepoint;
    typedef struct Point Point;
     
    listepoint AjouterPoint(listepoint l,int x,int y );
    void DessinPolygone(listepoint l);
    void FermerPolygone(listepoint,Point);
    Point RetourDernierPoint(listepoint);
    void AfficherPoint(listepoint);
    void AfficheDouble(PointPoly*,PointPoly*);
    int Coupe(PointPoly*,PointPoly*,PointPoly*,PointPoly*);
    double Visible(PointPoly*,PointPoly*,PointPoly*);
    void Intersection(PointPoly*,PointPoly*,PointPoly*,PointPoly*);
    double coefa(PointPoly*,PointPoly*);
    double coefb(PointPoly*,PointPoly*);
    Polygone.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     #include "Polygone.h"
    #include <iostream>
    #include <fstream>
     
    listepoint AjouterPoint(listepoint l,int x,int y ){
        PointPoly* nouv = new PointPoly[sizeof(PointPoly)];
        nouv->x=x;
        nouv->y=y;
        nouv->next=NULL;
        if (l==NULL){
                return nouv;
        }
        else{
                PointPoly* tmp = l;
                while (tmp->next !=NULL){
                        tmp=tmp->next;
                }
                tmp->next=nouv;
                return l;
        }
        return nouv;
    }
     
    void DessinPolygone(listepoint l){
        Point ptdepart;
        PointPoly* pt=l;
        ptdepart.x=pt->x;
        ptdepart.y=pt->y;
        pt=pt->next;
        while (pt!=NULL){
            BresenhamSegment(ptdepart.x,ptdepart.y,pt->x,pt->y);
            ptdepart.x=pt->x;
            ptdepart.y= pt->y;
            pt=pt->next;
        }
        delete pt;
    }
     
    void FermerPolygone(listepoint l,Point dp){
        Point ptdepart;
        PointPoly* pt=l;
        ptdepart.x=pt->x;
        ptdepart.y=pt->y;
        pt=pt->next;
        while (pt!=NULL){
            //std::cout << "Dessin  de " << ptdepart.x << "  "  << ptdepart.y << " vers " << pt->x <<  "  (espace)   "  << pt->y << std::endl;
            ptdepart.x=pt->x;
            ptdepart.y= pt->y;
            pt=pt->next;
        }
        //std::cout << "Dessin final de " << ptdepart.x << "  "  << ptdepart.y << " vers " << dp.x <<  "   "  << dp.y << std::endl;
        BresenhamSegment(ptdepart.x,ptdepart.y,dp.x,dp.y);
     
    }
     
    Point RetourDernierPoint(listepoint l){
        Point dernierpoint;
        PointPoly* pt =l;
        dernierpoint.x=pt->x;
        dernierpoint.y=pt->y;
        return dernierpoint;
    }
     
    void AfficherPoint(listepoint l){
        PointPoly* tmp = l;
        while (tmp!=NULL){
                std::cout << " x : " << tmp->x << std::endl;
                std::cout << "y : " << tmp->y << std::endl;
                tmp = tmp->next;
            }
    }
     
    void AfficheDouble(PointPoly* p1,PointPoly* p2){
        std::cout << "x : " << p1->x << "y : " << p1->y << " a x: " << p2->x << " y : " << p2->y << std::endl;
    }
     
    int Coupe(PointPoly* p1,PointPoly* p2,PointPoly* a,PointPoly* b){
        double v1;
        double v2;
     
       std::cout << " p1 x: " << p1-> x << "p1 y: " << p1->y << std::endl;
        std::cout << " p2 x : " << p2->x << "p2 y : " << p2-> y << std::endl;
        std::cout << " a  x : " << a->x << "a y: " << a-> y << std::endl;
        std::cout << " b x : " << b->x << "b y" << b-> y << std::endl;
     
        v1=Visible(p1,a,b);
        v2=Visible(p2,a,b);
     
        std::cout << " v1*v2 = " <<  v1*v2 << std::endl;
     
        if ((v1>0) && (v2>0)){
                //std::cout << " Visible" << std::endl;
                return 1;
        }
        else if ((v1<0) && (v2<0)){
                 //std::cout << "Invisible" << std::endl;
                 return 2;
        }
     
        if ((v1*v2)<0){
                //std::cout << "Intersection" << std::endl;
                //std::cout << " Il y a " << inter << "intersection" << std::endl;
                //Intersection(p1,p2,a,b);
                return 3;
        }
     
     
     
    }
     
    double Visible(PointPoly* p,PointPoly* a,PointPoly* b){
        //std::cout << "Visible pour le point " << p->x << "  " << p->y << std::endl;
        //std::cout << " p->x " << p->x << " p->y " << p->y << " a.x " << a->x << " a.y " << a->y << " b.x " << b->x << " b.y " << b->y << std::endl;
        double result;
        Point papb,pap;
        papb.x=b->x-a->x;
        papb.y=b->y-a->y;
        pap.x= p->x-a->x;
        pap.y=p->y-a->y;
        //std::cout << " ( " << papb.x << "*" << pap.y << ")  -  (" << pap.y << "* " << papb.y << ") " << std::endl;
        result =((papb.x*pap.y)-(pap.x*papb.y));
        std::cout << result << std::endl;
        return result;
    }
     
     
    void Intersection(PointPoly* p1,PointPoly* p2,PointPoly* a,PointPoly* b){
     
        double c,d,e,t;
        Point inter;
        double result1,result4;
        if (a->x==b->x){
            //std::cout << "( " << a->x << " - " << p1-> x << ") / ( " << p2->x << " - " << p1->x << " ) - ( " << b->x << " - " << a->x << ") " << std::endl;
            c= (a->x-p1->x);
            d= (p2->x-p1->x);
            e= (b->x-a->x);
            t= c/(d-e);
            std::cout << " c = " << c <<std::endl;
            std::cout << " d = " << d << std::endl;
            std::cout << " e = " << e << std::endl;
            std::cout << "t = " << t << std::endl;
            result1 = p1->x +((p2->x-p1->x)*t);
            result4= p1->y+ ((p2->y-p1->y)*t);
            std::cout << " result1 = " << result1 << std::endl;
            std::cout << "result 4 = " << result4 << std::endl;
        }
        else{
            std::cout << coefb(a,b) << " - " << coefb(p1,p2) << "/" << coefa(p1,p2) << std::endl;
            result1=(coefb(a,b)-coefb(p1,p2))/(coefa(p1,p2)-coefa(a,b));
            result4=coefa(p1,p2)*result1+coefb(p1,p2);
            std::cout << " result1 = " << result1 << std::endl;
            std::cout << "result 4 = " << result4 << std::endl;
     
        }
    }
     
    double coefa(PointPoly* p1,PointPoly* p2){
     
        return (p1->y-p2->y)/(p1->x-p2->x);
    }
     
    double coefb(PointPoly* p1,PointPoly* p2){
     
        return (p1->y-(p1->y-p2->y)*p1->x/(p1->x-p2->x));
    }
    Bien vu..mes points sont en INT..j'ai juste à casté devant le return ou je dois mettre pour tout les points ?

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Le mieux est encore de passer les "x" et "y" de ta structure en double.

    Sinon je pense que comme le numérateur et le dénominateur de ta division sont des entiers, ton compilateur estime donc que le résultat est un entier. Si tu castes devant le résultat tu auras 1.000

    Il faut donc que tu castes en "double" à la fois ton numérateur et ton dénominateur pour que le résultat soit correct.

Discussions similaires

  1. [MySQL] boucle en php avec retour des valeur sur smarty
    Par le nOoB dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/09/2011, 17h05
  2. [BO 6.5.1] Mettre en évidence des valeurs décimales
    Par websurfer dans le forum Débuter
    Réponses: 4
    Dernier message: 20/07/2008, 17h57
  3. Réponses: 3
    Dernier message: 19/03/2008, 22h11
  4. Pas de retour des valeurs NULL
    Par titmael dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/12/2007, 14h41
  5. A propos des fonctions et des valeurs de retour
    Par emprex dans le forum Débuter
    Réponses: 8
    Dernier message: 14/12/2007, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo