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

Algorithmes et structures de données Discussion :

Generation de texture -> Sacade?


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut Generation de texture -> Sacade?
    Bonjour,
    Je développe une petite DLL pour gèrer els surfaces de la SDL avec diférentes fonctions(Redimensionement, rotation, eneration...) et j'ai quelques problème avec un de mes algos de génération.
    Le voici :
    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
     
    SDL_Texture::RGB DLL_ACT SDL_Texture::PixelFonctor::AngulareCircle::operator() (unsigned int x, unsigned int y)
    {
        //Schéma
        //|\_
        //|  \_
        //|    \_
        //|______\_
        //       R
        //RGB du pixel retourner
        RGB Color;
        //Aplication d'un modulo pour retoruner a un cercle de rayon R;
        int NewR;
        if(x%R > y%R)
          NewR = (x + R-x%R);
        else
          NewR = (y + R-y%R);
        if( x*x + y*y >= (NewR-BorderW)*(NewR-BorderW) && x*x + y*y <= NewR*NewR )
        {
          int Cof = 1;
          Color.r = (unsigned char)(Cof * (float)M_R);
          Color.g = (unsigned char)(Cof * (float)M_G);
          Color.b = (unsigned char)(Cof * (float)M_B);
        }
        else
        {
          //Les espaces sont les diférence de 0xFF et des masques
          Color.r = 0xFF - M_R;
          Color.g = 0xFF - M_G;
          Color.b = 0xFF - M_B;
        }
        return Color;
    }
    Ce code devrais produire une suite de cart de cercle.
    Voici le resultat avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            SDL_Texture::PixelFonctor::AngulareCircle Fonc;
            Fonc.M_R = 0x00;
            Fonc.M_G = 0x00;
            Fonc.M_B = 0xFF;
            Fonc.R = 30;
            Fonc.BorderW= 10;
    donne cette image :
    Il y a comme on peut le constater quelques problème avec la bordure... Quelquin sais d'ou peut provenir le problème?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je ne vois pas trop où tu veux en venir dans ton calcul de NewR. Je serais perso parti sur un truc du genre (non testé, je n'ai pas la SDL, et tu n'as pas fourni un programme compilable) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int rayonAuCarre = x*x + y*y;
    double rayon = sqrt(rayonAuCarre );
    int NewR = int(rayon / R) * R;
     if(rayonAuCarre >= (NewR-BorderW)*(NewR-BorderW) && rayonAuCarre  <= NewR*NewR ) 
    {/*...*/}
    Si tu veux éviter le calcul d'une racine carrée, tu peux itérer :
    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
    int rayonAuCarre = x*x + y*y;
    int numeroDeCercle = 0;
    bool found;
    do
    {
      if (rayonAuCarre > (R*(numeroDeCercle +1))*(R*(numeroDeCercle +1)))
          found = false;
      else
      {
        found = true;
        if (rayonAuCarre > (R*numeroDeCercle + BorderW) * (R*numeroDeCercle + BorderW))
            // couleur 1
        else
            // couleur 2
      }
    }
    while (!found);
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    En fait, mon bute c'est de me ramener a un cercle de Rayon multiple de R(Si on entre R=15, se seront les sercles de rayon 15, 30, 45 ect...) puis de déduire si les coordonées X et Y figurent sur le cercle. Affin d'ajouter une bordure, je fait un <= et >=.
    Si on créer un nouveau rayon a partir de x*x + y*y on va obtenir le cercle ou x et y sont obligatoirement dessu. Moi, ce que je veut, c'est savoir si on est dnas le premier cercle de rayon 15, dans le deuxième cercle de rayon 30...
    Donc, je penssai que sa amrcherai comme j'ai fait. Seulement j'ai l'impression qu'il y a quelques endroit ou mon teste ne marche plus...

    Pour détailler ce que je fait avec mon modulo et x et y, je résone ainsi :
    Si on se ramène au cercle de rayon 15, on pouras retrouver un reste dans X et Y. Si on suprime ce reste de x et y(On se base sur le reste le plus grand) on poura le suprimer(retour au cercle inférieur) ou ajouter R-Ce reste(aller au cercle superieur). Moi, je vais au cercle supérieur.

    Mais je suis en train de me rendre compte qu'il faudrais peutètre tenir compte des deux restes... Peutètre qu'en fesan : (2*R - RestX - Reste Y) a la place de mes ifs... Je teste sa tout de suite.

    Oula, sa fait n'importe quoi...
    Je vais relire ce que tu a dit, masi je n'ai pas bien comprit...

    Edit : Bon, selon comment je fait, sa me done de zoli petits point eparpiller, ou un seul et unique cercle centrale. Je crois que je vais devoir re-ecrire l'algo.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  4. #4
    Invité de passage
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1
    Par défaut
    Ton calcul part sur une mauvaise base car les deux coordonnées sont liées. Donc impossible de corriger le rayon par un calcul sur une seule coordonnee.

    La méthode la plus simple pour faire ce que tu veux (sans tenter de trouver le plus rapide) est de calculer la distance du point au centre avec quelque chose comme d = sqrt(x*x+y*y)

    Ensuite plus qu'à regarder la parité de d/R pour déterminer la couleur.

  5. #5
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Donc, tu me di de regarder(Avec R = Rayon donner au dépare) le rayon orespondant au point ou je suis, et de comparer au rayon (d%R < 1/2R) : d-d%R ? d+(R-d%R) [C'est a dire, le cercle de rayon n*R le plus proche) et de rajouter une tolérence de +- 1/2W(W est la larjeur). C'est sa? [Dans ce cas on peut travailler avec les rayons au caré au lieu des rayons?]
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

Discussions similaires

  1. OpenGLRenderer : Cannot generate texture from bitmap
    Par thunder180 dans le forum Android
    Réponses: 2
    Dernier message: 14/05/2013, 09h00
  2. Chargement d'une texture a partir de la mémoire
    Par logramme dans le forum DirectX
    Réponses: 6
    Dernier message: 27/01/2003, 14h57
  3. Mosaïque texturée
    Par Pode dans le forum OpenGL
    Réponses: 5
    Dernier message: 19/09/2002, 09h50
  4. Changer l'image d'une texture
    Par alltech dans le forum DirectX
    Réponses: 5
    Dernier message: 21/08/2002, 01h31
  5. Generation d'evenements a une date precise
    Par pascalzzz dans le forum MFC
    Réponses: 2
    Dernier message: 04/06/2002, 15h21

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