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++Builder Discussion :

demande d'aide pour dessiner un cercle


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 52
    Points : 24
    Points
    24
    Par défaut demande d'aide pour dessiner un cercle
    Bonjour tous le monde;

    Je suis entrain de programmer un logiciel pour segmenter une image à l'aide de la méthode des ensembles de niveaux (Level Sets); et pour cela j'utilise comme fonction distance "phi" un cercle (contour initial).

    j'ai ecrit ce petit programme:


    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
    // Initialisation de la matrice "Phi"
     
    // choix du centre
    float x0=76;
    float y0=91;
    // choix du rayon
    float R=10;
     
     
    // dessiner le cercle
     
    for(int i=0;i<H;i++)
      for(int j=0;j<W;j++)
        {
        phi[i][j]=sqrt(((x0-j)*(x0-j))+((y0-i)*(y0-i)))-R;
        }
    Avec le Matlab tous marche bien; j'ai eu un cercle bien dessiner, tel que avec l'utilisation de l'équation du cercle j'aurai des distance négatifs à l'intérieur du cercle et positifs à l'extérieur et le "zéro" sera pour les pixels qui appartient aux cercle => c'est mon but.

    mais le problème, comme "i" et "j" sont des entier et la matrice phi,x0,y0 sont des "float" on aura pas un 0 dans tous les points du cercle, peut être on trouve 0.000001 mais pas un 0.

    alors comment on résout ce problème es qu'on change "float " ou int ou ...je ne sais pas...

    Merci de bien vouloir répondre

  2. #2
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour,

    C'est toujours le même problème avec les nombres à virgule flottante: la précision.
    Même si l'on utilise des float de grande précision, de part leur principe de codage, il y a toujours une marge d'erreur.

    Personnellement, j'ai résolu le problème en n'utilisant plus ces nombres
    J'utilise des type int ou long, voir double et pourquoi pas long double
    Je fais tous mes calculs avec cela, puis je divise finalement le résultat par cent ou mille ou plus avec forcage du nombre de décimales.
    Exemple: si je fais un programme gérant de l'argent, un fonctionnement au centime près est satisfaisant.
    Donc je fais tous mes calculs en centimes, avec des variables de type int. Sachant qu'elles sont codées sur 32 bits, cela m'autorise des montants de -2 147 483 648 centimes jusqu'à 2 147 483 647 centimes. Ce qui fait -21 474 836,48€ à -21 474 836,47€
    C'est largement suffisant pour calculer mon salaire
    L'affichage des résultats en euros se fait par une division par 100, avec arrondissement à la 2ème décimale.
    L'avantage de cette solution est que le 0 centime existe, et donnera 0 euros
    Peut être que cette astuce vous permettra de résoudre votre problème ...
    @ bientôt...

    Salut & @+ sur 3W!

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Il y a de fortes chances pour que seuls quatre points satisfassent directement à la relation : d - r = 0 !

    Donc on peut faire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    d = sqrt(...) - R;
    //A toi de voir pour l'intervalle...
    if((d > -0.5) && (d < 0.5)) d = 0.0;
    Tab[..][..] = d;

    A plus !

  4. #4
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    La solution antique mais fiable pour les cercles :
    Fichiers attachés Fichiers attachés
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

Discussions similaires

  1. Demande d'aide pour un exercice
    Par IDE dans le forum C
    Réponses: 3
    Dernier message: 29/10/2005, 15h09
  2. [xsl][xalan]Demande d'aide pour un comptage
    Par HomoErectus dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 19/09/2005, 09h22
  3. Demande d'aide pour query difficile
    Par ericjean514 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/02/2005, 18h52
  4. Demande d'aide pour une requête
    Par arkzor dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/12/2004, 02h40
  5. [TPW][cours]Demande d'aide pour finir un programme
    Par jf dans le forum Turbo Pascal
    Réponses: 21
    Dernier message: 16/06/2003, 18h10

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