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

Composants VCL Delphi Discussion :

Comment dessiner un polygone à l'aide d'un fichier de points ?


Sujet :

Composants VCL Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Comment dessiner un polygone à l'aide d'un fichier de points ?
    Bonjour à tous et merci de m'avoir accepté dans ce forum.

    Voici un aperçu du fichier texte dont je dispose.

    x y

    -180 -83.83
    -178 -84.33
    -174 -84.5
    -170 -84.67
    (J'ai près de 1000 points dans le fichier)

    J'arrive déjà à les importer dans delphi et il s'affiche dans un combox. Le problème est que je n'arrive pas à les afficher sur une grille (un quadrillage) de manière à ce qu'un polygone se dessine.

    Merci et bon week end.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 75
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    Il me semble qu'ils sont dans l'ordre (pour les 4 premiers points) pour former un polygone convexe - est-ce le cas ? C'est afficher des points qui pose problème ? Des lignes entre les points ?

    Nil

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Tu peux utiliser la procedure Polygon(Points: array of TPoint); qui dessine dans le canvas d'un truc (Form, ou BitMap, etc) la suite de lignes connectant les points spécifiés et ferme la figure en connectant le dernier point au premier point. Exemple pour dessiner sur le canvas de la Form:
    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
     
    var       monArrayDePoints : array of TPoint;
    const     nbPoints = 888;
     
    procedure CreeEtChargeMonArray;
    var       i : integer;
    begin     SetLength(monArrayDePoints,1000); //< allocation de mémoire pour les max 1000 points
              Randomize;
              for i:=0 to nbPoints-1 do
              begin monArrayDePoints[i].X:=Random(500); // génère des coordoonées X
                    monArrayDePoints[i].Y:=Random(200); // et Y aléatoires incluses dans un rectangle de 500x200 pixels
              end;
    end;
     
    procedure TForm1.btnDessineClick(Sender: TObject);
    begin
              Canvas.Brush.Color := clNavy;
              Canvas.Polygon([Point(15, 10), Point(10, 25), Point(100, 30), Point(220, 120)]); // <- cas d'un tracé élémentaire
              CreeEtChargeMonArray;
              Canvas.Polygon(monArrayDePoints); // cas d'un tracé à partir d'un array créé au préalable et chargé de coordonnées.
    end;
    ... tu peux aussi tracer ton polygone sur un BitMap invisible avec MonBitMap.Canvas.Polygon(monArrayDePoints); puis le rendre visible en l'affichant dans un TPaintBox ou un TImage par exemple.
    ... et comme tes données sont des valeurs avec des décimales ne pas oublier de faire X:=trunc(valeur); ou X:=Round(valeur) pour tes corrdonnées.

    A+

  4. #4
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par ghima Voir le message
    Bonjour à tous et merci de m'avoir accepté dans ce forum.

    Voici un aperçu du fichier texte dont je dispose.

    x y

    -180 -83.83
    -178 -84.33
    -174 -84.5
    -170 -84.67
    (J'ai près de 1000 points dans le fichier)
    OK
    Citation Envoyé par ghima Voir le message
    J'arrive déjà à les importer dans delphi et il s'affiche dans un combox.
    Excellent !
    mais arrives tu a mettre les valeurs dans un tableau de points tel que te le suggère Gilbert ?

    Citation Envoyé par ghima Voir le message
    Le problème est que je n'arrive pas à les afficher sur une grille (un quadrillage) de manière à ce qu'un polygone se dessine.
    C'est à dire, qu'as-tu essayé ? Avec un TImage (on est mal ...) ou avec un TPaintbox (<-- c'est tout couillon à faire avec ça) ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    si vous voulez réellement tracer un polygone (courbe fermer), l'ordre polygon est en effet à utiliser.

    Si vous voulez tracer une courbe, ce serait plutôt un moveto suivit de lineto.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Procedure traceCourbe(const Points: array of TPoint);
    var
      I: Integer;
    IMin, IMax: Integer;
    begin
     IMin := Low(Points);
     IMax := High(Points);
    if (IMax - IMin) < 1 then exit; // au moins 2 point pour une courbe
    Canvas.Moveto(Points[IMin].X, Points[IMin].Y);
     
    for i := IMin+1 to IMax do
      Canvas.Moveto(Points[I].X, Points[I].Y);
    end;
    Grosse modo votre code devrait ressembler à ce que je vient de taper (attention je ne l'ai pas tester).

    Attention, j'ai vue que vous aviez des chiffres négatif dans vos points. ILS NE PEUVENT PAS ÊTRES AFFICHER.

    Votre canvas peut être représenter comme un rectangle, d'une taille Width et d'une hauteur Height.
    Vous pouvez dessiner depuis l'adresse 0, 0 jusqu'a l'adresse (Width - 1)/ (Height - 1)

    Si vous désirez dessinez une courbe commençant en (-10, -20) vous devez vous créer un zéro virtuelle en 10/20 et décaler tous vos points en conséquence.

  6. #6
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Salut

    Citation Envoyé par waskol Voir le message
    OK
    C'est à dire, qu'as-tu essayé ? Avec un TImage (on est mal ...) ou avec un TPaintbox (<-- c'est tout couillon à faire avec ça) ?
    Pourquoi "on est ma"l avec un TImage ?? et pas avec un Tpaintbox

  7. #7
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Speed41 Voir le message
    Salut

    Pourquoi "on est ma"l avec un TImage ?? et pas avec un Tpaintbox
    Parce que contrairement à ce qu'on pourrais penser de prime abord, c'est plus facile à faire avec un TPaintBox (qui est fait pour ça), plutôt qu'avec un TImage qui est plutôt un composant fait pour le "décorum" (que je ne critique donc pas, surtout pour ce rôle qui lui va à merveille )...

    Pour dessiner sur le Canvas d'un TImage, c'est d'un bazar !!! (voir dans la FAQ "Comment dessiner sur le vrai Canvas d'un TImage sans modifier l'image qu'il contient (Picture) ?" )

    En tout cas, joyeux Noël à tous !!!

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/01/2006, 21h32
  2. Comment dessiner sur un Bitmap sans scintillement ?
    Par TOTO32 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 10/01/2005, 10h11
  3. DBGrid, comment dessiner dans les titres des colonnes
    Par dleu dans le forum Bases de données
    Réponses: 9
    Dernier message: 04/11/2004, 17h49
  4. [Transparent] - Comment dessiner sur 2 TImage ?
    Par TOTO32 dans le forum Langage
    Réponses: 15
    Dernier message: 08/08/2004, 01h06
  5. Comment detecter un polygon sous le curseur
    Par FreshVic dans le forum OpenGL
    Réponses: 2
    Dernier message: 04/07/2003, 10h48

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