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

  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2018
    Messages : 156
    Points : 106
    Points
    106

    Par défaut Dessins et déplacements

    Bonjour,

    maintenant que j'ai réussi à régler la transparence des fenêtres sur les 3 OS Desktop, j'aimerais dessiner à main levée avec la souris. Supposons que je trace une ligne fermée, je voudrais ensuite pouvoir la déplacer en cliquant sur la surface délimitée par ma ligne. Quelle technique employer ? Dessiner directement sur le Canvas de la Form me parait difficile à retenir car incompatible avec le déplacement notamment en cas de superposition de lignes. Autre caractéristique : les surfaces délimitées doivent être transparentes.

    Merci. Gilles
    Windows, Linux, mac OS X ► Qt - FMX - Lazarus || Androïd, iOS ►FMX - Qt - Windev Mobile - Autres

  2. #2
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 102
    Points : 2 892
    Points
    2 892
    Billets dans le blog
    2

    Par défaut

    Bonsoir Gilles

    Il faudrait une approche par "calque". Un calque = un dessin (un TBitmap en 32bits pour la transparence, et affichage avec StretchDraw) , Lorsque que tu dessines ta forme tu le fais dans un bitmap temporaire au dimension de ta fenêtre. A chaque fois que tu dessines un pixel tu vérifies si la position x,y est plus grande ou plus petite que les valeurs minimum et maximum de x et y de la "boundingBox" (un TRect, mais c'est pas vraiment top). A la fin tu auras deux points délimitant ton dessin. Il te suffit de "cropper" le bitmap temporaire et de l'ajouter à ta liste de calque, avec la "BoundingBox". Ensuite en "mode sélection" il te suffiras de parcourir la liste de calque et de vérifier que la position de la souris est dans une des "boundingbox" et te restera plus qu'a déplacer le calque sélectionné et redessiner le bitmap à la bonne position. Le problème avec cette technique c'est si plusieurs zones se chevauchent. (C'est le cas avec Gimp ou autres logiciels dans le genre) donc pas trop grave à mon sens.

    Code dans le genre :

    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
     
    Type 
        TBoundingBox = record
         TopLeft : TPoint;
         BottomRight : TPoint;
      end;
     
      TLayer = record
        BoundingBox : TBoundingBox;
        Bitmap : TBitmap;
      end;
     
      TLayers = specialize TFPGList<TLayer>;  // cf : https://wiki.freepascal.org/Generics et https://www.freepascal.org/docs-html/current/rtl/fgl/tfpglist.html
     
      procedure ComputeBoundingBox(Calque : TLayer; x,y : Integer);
      begin
          if x<Calque.BoundingBox.TopLeft.x then Calque.BoundingBox.TopLeft.x := x
         else if x> Calque.BoundingBox.BottomRight.x then Calque.BoundingBox.BottomRight.x := x;
     
          if y<Calque.BoundingBox.TopLeft.y then Calque.BoundingBox.TopLeft.y := y
         else if y> Calque.BoundingBox.BottomRight.y then Calque.BoundingBox.BottomRight.y := y;
      end;
     
      Function IsInBoundingBox(Calque : TLayer; x,y : Integer): Boolean;
      begin
         // Algo Clipping Cohen-Sutherland
         Result := (Ord(X < Calque.BoundingBox.TopLeft.x) + Ord(X > Calque.BoundingBox.BottomRight.x) Shl 1 + Ord(Y < Calque.BoundingBox.TopLeft.y) Shl 2 + Ord(Y > Calque.BoundingBox.BottomRight.y) Shl 3) = 0;
      end;
    Voila, j'espère que j'ai bien compris ta question et que tu comprends ma réponse

    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 115
    Points : 269
    Points
    269
    Billets dans le blog
    2

    Par défaut Dessin de polygones

    Citation Envoyé par Selzig Voir le message
    Bonjour,

    maintenant que j'ai réussi à régler la transparence des fenêtres sur les 3 OS Desktop, j'aimerais dessiner à main levée avec la souris. Supposons que je trace une ligne fermée, je voudrais ensuite pouvoir la déplacer en cliquant sur la surface délimitée par ma ligne. Quelle technique employer ? Dessiner directement sur le Canvas de la Form me parait difficile à retenir car incompatible avec le déplacement notamment en cas de superposition de lignes. Autre caractéristique : les surfaces délimitées doivent être transparentes.

    Merci. Gilles
    Bjr à vous,

    Je suppose que vous désirez développer un petit outil de dessin.

    Il y a plusieurs volets à traiter:
    0. L'objet TPolygone

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    type TPolygone = record
      ID: integer;
      Color: TColor;
      // les sommets
      Sommets: array of TPoint;
      // la boîte englobante pour accélérer les calculs
      BoundingBox: TRect;
      // si le langage le permet:
    end;
    1. Le conteneur pour vos polygones: un dérivé du TList
    2. Sélection: Un algorithme pour savoir si un point est dans un polygone.

    Ayant développé un logiciel de dessin, je suis à votre disposition.

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/02/2016, 18h05
  2. Problème de déplacement d'un objet dessiné
    Par mhamedbj dans le forum Graphisme
    Réponses: 4
    Dernier message: 04/05/2012, 17h32
  3. Déplacement (avec la souris) des composants dessinés
    Par Kidim dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 25/04/2012, 16h40
  4. [Word/Dessin] Déplacement précis objet
    Par Girvy dans le forum Word
    Réponses: 1
    Dernier message: 25/01/2008, 12h46
  5. Déplacement d'un objet dessiné par paint
    Par bazzouz dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 30/08/2007, 02h18

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