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

Delphi Discussion :

[delphi 7] faire des dessins cliquables


Sujet :

Delphi

  1. #1
    En attente de confirmation mail
    Inscrit en
    Février 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 40
    Points : 39
    Points
    39
    Par défaut [delphi 7] faire des dessins cliquables
    Bonjour,

    Voici mon problème : je dessine sur un canvas un certains nombre de lignes avec les méthodes moveto et lineto.


    Existe t'il un moyen d'avoir un événement onclick ou onMouseOver sur ces lignes ?

    Pour l'instant de gère la position de la souris pour savoir si je suis sur une ligne (ou pas), mais ça devient lourd !


    Le but est de representer un reseau (routier par exemple) et d'avoir des information sur le segment cliqué (nom de la route, type de route...).

    Merci

  2. #2
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Bonjour

    Le problème de détecter le clic sur un segment a été abordé ici il y a pas si longtemps il me semble.

    Sinon, en dehors de ton canevas qui est juste là pour représenter ton graphique, il te faut stocker la liste des segments [P1,P2] quelque part (un TStringList par exemple), éventuellement associés à chaque segment, un pointeur sur un objet (ou record) contenant tes infos de routes etc...

    Une fois cette liste établie, lors d'un clic souris sur le canevas, il te faut
    1. convertir des coord écran, en coord logique (car j'imagine que tu as des coord logiques)
    2. tester si ce point +-deltat, se trouve sur un des segments de ta liste.

    Pour savoir si un point fait partie d'un segment je te renvoie sur ce post. ou le problème a été abordé.

    Pour optimiser ta recherche sur les segments (car si tu as des millions de segments, parcourir cette liste pour tester si ton point en fait partie peu prendre un certains temps), la je te conseille d'exposer ton problème dans le Forum Algorithmes ou je suis sur qu'il y a des méthodes plus rapide, en organisant la liste de segment d'une certaine manière.

    Une fois, le segment trouvé par rapport au point demandé -> tu as accès a tes infos routes etc...

    Bon courage
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  3. #3
    Membre habitué Avatar de jambonstar
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Points : 161
    Points
    161
    Par défaut
    Salut,

    Je ne peux que te conseiller un site qui t'apprendra vraiment des tas de trucs à ce sujet :

    EFG2 ComputerLab

    Plus particulierement avec ce projet :

    Ligne Elastique

    En esperant t'avoir aidé.

    PLUS FORT ENSEMBLE !Et plus joli aussi
    (\ _ /)
    (='.'=) Voici Lapinou.
    (")-(")
    Aidez le à conquérir le monde en le reproduisant.

    http://ashbasket.free.fr

  4. #4
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Bonjour,

    Effectivement je suis tomber sur le même problème...J'ai gérer le truc par des trableaux de TPoints et des detections par les Maths.
    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
    type PointLigne = record
        Type_route : ansistring;
        nom: ansistring;
        Xposition : integer;
        Yposition : integer;
    end;
    type TableauPoints = array of PointLigne;
     
    function TObjetLigne.TestAppartenanceLigne(pointTest:TPoint;pointsCaractéristique;TableauPoints) : integer;
    var
    i:integer;
    L,R,S, Tolerance: Double;
    X1,X2,Y1,Y2,Y3,X3 : integer;  //P1, P2 points extremites, X3 point a tester
    begin
        X3:=PointTest.X;
        Y3:=Pointtest.Y;
      Tolerance := 7;
      Result:=-1;
      for i:=0 to length(PointsCaracteristiques)-2 do
        begin
        X1:= PointsCaracteristiques[i].XPosition;  // tableau de TPoint à tester 
        Y1:= PointsCaracteristiques[i].YPosition;
        X2:= PointsCaracteristiques[i+1].XPosition;
        Y2:= PointsCaracteristiques[i+1].YPosition;
       L:=SQRT(((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1)));
      if l<>0 then
      begin
        R:= ((Y1-Y3)*(Y1-Y2)-(X1-X3)*(X2-X1))/(L*L);
        S:= ((Y1-Y3)*(X2-X1)-(X1-X3)*(Y2-Y1))/(L*L);
        if (r>0) and (r<1) then
            if Abs(S*L)<=Tolerance then Result:=i;  //s*l=distance
      end;
        end;
    end;
    A boucler sur tous tes tableaux de TPoints...Et c'est vrai que c'est un peu lourd (alors pense à moi qui doit déplacer les lignes, zoomer, y ajouter des objets... ).
    L'avantage c'est que tu peux rajouter des infos particulière dans ton tableaux de TPoints pour chaque segment..

    Maintenant si ton problème c'est la vitesse de détection, tu peux toujours effectuer une pré-détection pour savoir si t'es sur une ligne.
    Par exemple, en supposant que tes lignes ont des couleurs différents suivant le type de route (comme dans les guides), alors tu pourrais tester la couleur du pixel cliqué pour savoir quelle lignes sont susceptiples d'être sous ton clic.

    En tout cas bon courage à toi.

    @+.
    For crying out loud !

  5. #5
    En attente de confirmation mail
    Inscrit en
    Février 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 40
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Tout d'abord merci à vous pour vos réponses.

    En les attendant (vos réponses) j'ai testé une autre solution :

    1/ je crée une image avec des lignes qui représente mon reseau > j'affiche cette image
    2/ Je créé une seconde image que je n'affiche pas et qui contient les même ligne mais avec chacune une couleur différente (qui correspond à l'index du segment).
    3/ sur chaque mouvement de souris je récupere la couleur du pixel de la seconde image et j'ai ainsi l'ID de mon segment.
    Nota: les segments de ma seconde image sont plus larges afin de géré un delta de position de la souris.

    Vous en pensez quoi ?

  6. #6
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Je suis pas un expert, mais j'espère seulement que tu n'as pas trop de segments de lignes à tracer (parceque le nombre de couleurs n'est pas infini, et dépendra de la machine sur laquelle tu feras tourner ton appli).
    For crying out loud !

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Vous en pensez quoi ?
    Plutôt astucieux
    Petite amélioration (si necessaire) :
    - trier les segments par taille,
    - tracer les plus petits segments à la fin (ils seront ainsi "au-dessus" des grands)
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  8. #8
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Citation Envoyé par planetevoyage
    Vous en pensez quoi ?
    J'ai utilisé la même méthode dans un programme pour que l'utilisateur puisse sélectionner des éléments, plutôt que de devoir stocker les positions (et dimensions) de chaque élément et de devoir comparer la position de la souris avec la fonction PtInRect()... Cela est plus rapide selon moi, surtout que tu disposes qu'en même d'une palette de 16 millions de couleur (non ?), cela te laisse de la marge pour créer des lignes je présume. Le seul hic dans cette méthode, est qu'il te faudra sauver 2 images en fait, donc 2 fois plus de données à charger aussi...

    Resterait une solution en utilisant qu'une seule et même image : Utiliser 8 bits (256 couleurs) sur les 16 millions pour sauver les lignes dans la même image. Par exemple, le format PNG (32bits) utilise cette technique pour sauver son masque de transparence alpha en 8bits avec l'image opaque 24 bits. Tu peux aussi envisager d'utiliser 16bits (65536 couleurs) pour les lignes et 16bits pour l'image... Tu peux même créer ton propre format d'image 48 ou 64bits, mais là, on en revient à utiliser la solution des 2 images, excepté qu'elles sont fusionnées. Cela te permettra tout de même d'optimiser les fichiers image sur le disque.

    Si tu as d'autres questions, n'hésite pas, à+
    De retour parmis vous après 10 ans!!

  9. #9
    En attente de confirmation mail
    Inscrit en
    Février 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 40
    Points : 39
    Points
    39
    Par défaut
    Merci à tous,
    Je vais creuser la solution avec 2 images.
    A+

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/08/2013, 09h30
  2. Faire des dessins pour latex
    Par Gildas86 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 6
    Dernier message: 11/01/2012, 13h14
  3. Réponses: 3
    Dernier message: 07/08/2008, 19h07
  4. ravereport5 de delphi 7 pour faire des etats
    Par lavida dans le forum Delphi
    Réponses: 1
    Dernier message: 17/05/2006, 15h50
  5. dessiner des lignes "cliquables"
    Par r0d dans le forum Webdesign & Ergonomie
    Réponses: 14
    Dernier message: 21/03/2005, 15h02

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