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

SDL Discussion :

Tracer une ligne visuellement (presque) correcte [SDL 2.0]


Sujet :

SDL

  1. #1
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 741
    Par défaut Tracer une ligne visuellement (presque) correcte
    Bonjour / bonsoir à tous,

    Avec la fonction SDL_RenderDrawLine(), SDL trace une ligne d'un point p1 à un point p2. Mais voilà, suivant l'angle entre p1 et p2, la ligne est "hachée". Ma version de SDL est la 2.0.8, et donc elle ne connait pas SDL_RenderDrawLineF(), qui a débarqué avec la version 2.0.10. Et apparemment, la dernière version de sld2 est la 2.30.11.

    Avant de me lancer dans l'upgrade de sdl (ce qui implique la re-compilation de mes autres projets en cas de correction / amélioration), la fonction version F permettra-t-elle d'avoir une ligne visuellement correcte ? Pour info, c'est pour afficher les aiguilles d'une horloge et je suis sous win10.

    Je dois avouer que lorsque quelque chose fonctionne, je suis assez frileux pour en faire l'upgrade

    D'avance merci de vos réponses.

    Le petit programme de test pour l'affichage de l'horloge:
    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
    #include <math.h>
    #include <stdio.h>
    #include <sdl2/sdl.h>
     
    #define WND_SIZE_HORZ           600
    #define WND_SIZE_VERT           600
    #define WND_COLOR_R             50
    #define WND_COLOR_G             100
    #define WND_COLOR_B             150
    #define WND_TITLE               "Test degree"
    #define RDR_DEFAULT_DRIVER      -1
    #define DELAY_MS                10000
    #define UNUSED(x)               (void)x
     
    #define PI                      3.14159265358979323846
    #define RAY                     100
    #define TORADIAN(x)             ((x)*(PI/180))
     
    void DisplaySDLVersion(void) {
        SDL_version v;
        SDL_GetVersion(&v);
        printf("SDL version %hd.%hd.%hd\n", v.major, v.minor, v.patch);
    }
     
     
    void DisplayWatch(SDL_Renderer *rdr, SDL_Point *center) {
        for(int a=0; a<360; a+=6) {
            if(a%5)
                SDL_SetRenderDrawColor(rdr, 0xff, 0xff, 0xff, SDL_ALPHA_OPAQUE);
            else
                SDL_SetRenderDrawColor(rdr, 0x00, 0xff, 0x00, SDL_ALPHA_OPAQUE);
            SDL_Point p;
            p.x=center->x+cos(TORADIAN(a))*RAY;
            p.y=center->y+sin(TORADIAN(a))*RAY;
            SDL_RenderDrawPoint(rdr, p.x, p.y);
        }
    }
     
     
    int main(int argc,char *argv[]) {
        UNUSED(argc);
        UNUSED(argv);
        DisplaySDLVersion();
        SDL_Init(SDL_INIT_VIDEO);
        SDL_Window *wnd=SDL_CreateWindow(WND_TITLE, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WND_SIZE_HORZ, WND_SIZE_VERT, SDL_WINDOW_SHOWN);
        SDL_Renderer *rdr=SDL_CreateRenderer(wnd, RDR_DEFAULT_DRIVER, SDL_RENDERER_ACCELERATED);
        SDL_Point center={.x=WND_SIZE_HORZ/2, .y=WND_SIZE_VERT/2};
     
        for(int r=0; r<360; r+=6) {
            SDL_SetRenderDrawColor(rdr, WND_COLOR_R, WND_COLOR_G, WND_COLOR_B, SDL_ALPHA_OPAQUE);
            SDL_RenderClear(rdr);
            DisplayWatch(rdr, &center);
            SDL_SetRenderDrawColor(rdr, 0xff, 0xff, 0xff, SDL_ALPHA_OPAQUE);
            SDL_RenderDrawLine(rdr, center.x, center.y, center.x+cos(TORADIAN(r))*(RAY-10), center.x+sin(TORADIAN(r))*(RAY-10));
            SDL_RenderPresent(rdr);
            SDL_Delay(250);
        }
     
        SDL_DestroyRenderer(rdr);
        SDL_DestroyWindow(wnd);
        SDL_Quit();
     
        return(0);
    }
    }
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent ;)

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 039
    Billets dans le blog
    138
    Par défaut
    Bonjour,

    Perso, la ligne me semble déjà bien dans cette configuration :
    Nom : sdl2_30_10.png
Affichages : 72
Taille : 6,8 Ko

    Et maintenant, avec la fonction *F:
    Nom : SDL_2_30_10_RenderLineF.png
Affichages : 69
Taille : 6,8 Ko

    Mon avis sur la question : la différence est minime/nulle. Je pencherai pour une solution d'antialiasing (facile, si une telle option existe) possiblement, à la main... .
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 525
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 525
    Par défaut
    lisser les courbes c'est bien bref faire de l'antialiasing mais cela risque d'être coûteux en temps de calcul surtout si c'est fait "à la main" en faisant des interpolations.

  4. #4
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 741
    Par défaut
    Merci à vous deux pour votre réponse.

    @LittleWhithe: merci d'avoir pris le temps de tester la fonction version 'F'. De fait, le résultat n'est pas du tout probant, et je suis entièrement d'accord avec ta conclusion.

    @Mat.M.: tu as raison, ce serait coûteux en temps (bien qu'on ait en pratique (presque) 1 seconde entre deux affichages), mais sans doute hors de ma portée.

    Merci encore,

    Edgar;
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent ;)

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 039
    Billets dans le blog
    138
    Par défaut
    Vous devriez donc regarder du côté des options, comme mentionné dans ce sujet sur StackOverflow. Par contre, je ne peux pas dire si cela va marcher pour une simple ligne .
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 741
    Par défaut
    Hello,

    Hélas non, cela ne change rien. Merci d'avoir cherché.

    Edgar;
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent ;)

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 039
    Billets dans le blog
    138
    Par défaut
    Du coup, je ne vois que comme solution, de passe par OpenGL, ou plus difficilement, de faire à la main.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH MX2004] Tracer une ligne en temps réel
    Par tomtom- dans le forum Flash
    Réponses: 1
    Dernier message: 16/02/2006, 10h52
  2. Tracer une ligne sur une image
    Par Guillaume602 dans le forum Windows
    Réponses: 5
    Dernier message: 05/01/2006, 21h33
  3. [VB.NET] Tracer une ligne (OnPaint)
    Par Emcy dans le forum Windows Forms
    Réponses: 6
    Dernier message: 24/03/2005, 14h09
  4. [FP]Tracer Une ligne avec Dev-pascal
    Par yffick dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 17/12/2003, 17h33
  5. Tracer une ligne droite sans les interruptions
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 25/11/2002, 02h22

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