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

Contribuez Pascal Discussion :

BGIDEMO pour FreePascal


Sujet :

Contribuez Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut BGIDEMO pour FreePascal
    Bonjour !

    Je vous propose une adaptation pour FreePascal du programme BGIDEMO (tiré des exemples de Turbo Pascal). Ce programme fait le tour des possibilités de l'unité Graph.

    Comme vous pourrez vous en rendre compte, les performances de l'unité Graph de FreePascal ne sont pas excellentes, mais il y a quand même de quoi faire pas mal de petites choses, et on peut saluer le travail de l'auteur.

    J'en demande pardon à mes confrères linuxiens : c'est une version Windows exclusivement. Peut-être quelqu'un fera-t-il une version Linux ?

    Le programme a été compilé avec FreePascal 2.6.2, sous Windows 8.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Après quelques adaptations voilà une version qui marche sous windows et linux. Petite limitation : il n'existe qu'une police de caractères.
    Fichiers attachés Fichiers attachés

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par batyann811 Voir le message
    Après quelques adaptations voilà une version qui marche sous windows et linux. Petite limitation : il n'existe qu'une police de caractères.
    Merci, batyann811, je vais regarder ton code avec intérêt.

    Voici à présent le programme ARTY, provenant également des exemples de Turbo Pascal.

    P.-S. Je viens d'essayer ton programme. Les performances sont incomparables, je veux dire bien meilleures ! Je vais adopter cette unité ptcGraph, que je ne connaissais pas.
    Fichiers attachés Fichiers attachés

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    L'unité ptcGraph permet d'utiliser des couleurs 16-bit. J'ai voulu savoir comment sont codées les couleurs 16-bit. D'après ce que j'ai lu ici et là, il y a plusieurs normes. Voici apparemment celle qui est suivie dans ce cas : 5 bits pour le rouge, 6 pour le vert, 5 pour le bleu.

    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
    program PtcGraph_001;
    {$MODE DELPHI}
    {$IFDEF WINDOWS}
    {$APPTYPE GUI}
    {$ENDIF}
     
    uses
      PtcGraph, PtcCrt, SysUtils;
     
    function StringToWord(const s: string): word;
    var
      i: integer;
    begin
      result := 0;
      for i := 0 to 15 do
        if s[16 - i] > '0' then
          result := result or (1 shl i);
    end;
     
    var
      d, m: smallInt;
      c: word;
     
    begin
      d := 10;    // 640 x 480
      m := $0111; // 65536 couleurs
     
      InitGraph(d, m, '');
     
      {
      SetColor($FFFF);
      OutTextXY(10, 10, IntToStr(GetMaxX + 1) + 'x' + IntToStr(GetMaxY + 1) + 'x' + IntToStr(GetMaxColor + 1));
      }
     
      c := StringToWord('11111' + '000000' + '00000');
      SetFillStyle(SolidFill, c);
      Bar(100, 100, 240, 380);
     
      c := StringToWord('00000' + '111111' + '00000');
      SetFillStyle(SolidFill, c);
      Bar(250, 100, 390, 380);
     
      c := StringToWord('00000' + '000000' + '11111');
      SetFillStyle(SolidFill, c);
      Bar(400, 100, 540, 380);
     
      ReadKey;
      CloseGraph;
    end.
    Autrement dit, l'intensité du rouge et du bleu varie de 0 à 31, celle du vert de 0 à 63.

    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
    program PtcGraph_004;
    {$MODE DELPHI}
    {$IFDEF WINDOWS}
    {$APPTYPE GUI}
    {$ENDIF}
     
    uses
      PtcGraph, PtcCrt;
     
    function RGBToWord(r, g, b: byte): word;
    begin
      if r > 31 then r := 31;
      if g > 63 then g := 63;
      if b > 31 then b := 31;
      result := (r shl 11) or (g shl 5) or b;
    end;
     
    var
      d, m: smallInt;
      c: word;
      i: byte;
     
    begin
      d := 10;    // 640 x 480
      m := $0111; // 65536 couleurs
     
      InitGraph(d, m, '');
     
      for i := 0 to 31 do
      begin
        c := RGBToWord(i, 0, 0);
        SetFillStyle(SolidFill, c);
        Bar(016, i * (448 div 32) + 16, 208, (i + 1) * (448 div 32) + 16);
      end;
     
      for i := 0 to 63 do
      begin
        c := RGBToWord(0, i, 0);
        SetFillStyle(SolidFill, c);
        Bar(224, i * (448 div 64) + 16, 416, (i + 1) * (448 div 64) + 16);
      end;
     
      for i := 0 to 31 do
        begin
        c := RGBToWord(0, 0, i);
        SetFillStyle(SolidFill, c);
        Bar(432, i * (448 div 32) + 16, 624, (i + 1) * (448 div 32) + 16);
      end;
     
      ReadKey;
      CloseGraph;
    end.
    Pas évident à manipuler ! Le mieux serait peut-être de faire une fonction qui convertirait un nombre 32-bit (ce qui permettrait d'utiliser les valeurs usuelles). Qu'en pensez-vous ?

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    Voici une adaptation des lignes ondoyantes d'Alcatîz.

    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
     
    program Ondoyant;
    {$IFDEF WINDOWS}
    {$APPTYPE GUI}
    {$ENDIF}
     
    (* Programme original :
       http://alcatiz.developpez.com/tutoriel/owl/?page=pg_gdi *)
     
    uses
      PtcGraph, PtcCrt;
     
    const
      indiceMax    = 100;
      vitesse      = 100;
      dx1: integer =   4;
      dy1: integer =  10;
      dx2: integer =   3;
      dy2: integer =   9;
     
    type
      tLigne = record
        x1, y1, x2, y2: integer;
        couleur: word;
      end;
      tTabLignes = array[0..indiceMax]of tLigne;
     
    var
      tabLignes: tTabLignes;
      indiceGeneral: integer;
      effacer: boolean;
     
    function Initialise: boolean;
    var
      d, m: smallint;
      i: integer;
    begin
      d := d16bit;
      m := m800x600;
      InitGraph(d, m, '');
      result := (GraphResult = grOk);
      if result then
      begin
        for i := 0 to indiceMax do
          tabLignes[i].x1 := -1;
        indiceGeneral := 0;
        effacer := false;
      end;
    end;
     
    procedure NouvelleLigne(var coord, intervalle : integer; coordMax : integer; var couleur : word);
    var
      total : integer;
      signe : integer;
    begin
      total := coord + intervalle;
      if (total < 0) or (total > coordMax) then
      begin
        if intervalle >= 0 then
          signe := -1
        else
          signe := 1;
        intervalle := signe * (3 + Random(12));
        couleur := Random(65535) + 1;
      end else
        coord := total;
    end;
     
    procedure DessinLigne(i: integer);
    begin
      with tabLignes[i] do
      begin
        SetColor(couleur);
        Line(x1, y1, x2, y2);
      end;
    end;
     
    procedure Redessine;
    var
      i: integer;
      ancienIndice: integer;
    begin
      for i := 1 to 10 do
      begin
        ancienIndice := indiceGeneral;
        if indiceGeneral = indiceMax - 1 then
        begin
          indiceGeneral := 0;
          effacer := True;
        end else
          Inc(indiceGeneral);
        if effacer then
        begin
          tabLignes[indiceGeneral].couleur := 0;
          DessinLigne(indiceGeneral);
        end;
        tabLignes[indiceGeneral] := tabLignes[ancienIndice];
        with tabLignes[indiceGeneral] do
        begin
          NouvelleLigne(x1, dx1, GetMaxX, couleur);
          NouvelleLigne(y1, dy1, GetMaxY, couleur);
          NouvelleLigne(x2, dx2, GetMaxX, couleur);
          NouvelleLigne(y2, dy2, GetMaxY, couleur);
        end;
        DessinLigne(indiceGeneral);
      end;
    end;
     
    begin
      Randomize;
      if Initialise then
      begin
        repeat
          Redessine;
          Delay(vitesse);
        until KeyPressed;
        CloseGraph;
      end;
    end.
    En pièce jointe, le même programme, mais utilisant l'unité Graph. Avec cette dernière j'avais trouvé le moyen de modifier le titre de la fenêtre et aussi l'icône de la fenêtre. Apparemment, ce n'est pas possible avec PtcGraph, ou du moins je ne vois pas comment faire. Je suppose que c'est la rançon de la compilation multi-plateforme.

    Autre pièce jointe, le même programme utilisant l'unité Wingraph. La principale différence entre les trois versions est le nombre de couleurs supportées.
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    En regardant des exemples que j'avais oubliés, je m'aperçois que l'unité WinGraph a un mode "plein écran". En l'occurrence, ce serait dommage de ne pas l'utiliser. Voici donc une nouvelle version des lignes ondoyantes.

    P.-S. Ajouté la détection des mouvements de la souris, pour pouvoir utiliser le programme comme écran de veille. Le programme s'arrête si la souris est déplacée ou si un bouton est pressé.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [Free Pascal] Quelques unités et un programme pour FreePascal
    Par yamer dans le forum Contribuez
    Réponses: 4
    Dernier message: 01/06/2014, 18h46
  2. Réponses: 0
    Dernier message: 26/10/2011, 17h46
  3. [Lazarus] Application Lazarus/FreePascal pour iPhone
    Par aime2nice dans le forum Lazarus
    Réponses: 0
    Dernier message: 30/08/2009, 19h54
  4. Réponses: 1
    Dernier message: 25/03/2006, 21h26
  5. [FreePascal] Problème pour une simple liste chaînée
    Par piff62 dans le forum Free Pascal
    Réponses: 3
    Dernier message: 26/11/2005, 19h25

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