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

Interfaces Graphiques en Java Discussion :

Vérifier si un point appartient à un segment


Sujet :

Interfaces Graphiques en Java

  1. #1
    Invité
    Invité(e)
    Par défaut Vérifier si un point appartient à un segment
    Bonjour,

    Comment faire pour vérifier si un point de coordonnées M(x,y) appartient à un segment dont les extrémités sont A(x1,y1) et B(x2,y2) ? (Concrètement, je veux tester si mon curseur pointe sur une ligne tracée avec drawLine, en prenant en compte l'épaisseur mis en place avec un BasicStroke)

    Merci !

  2. #2
    En attente de confirmation mail
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2010
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 501
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonjour,

    La solution est mathématique :
    1) vérifier que la pente de A-M est la même que A-B => M est sur la droite formée par A-B
    2) vérifier que M est entre A et B => M est sur le segment A-B

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if ((x2-x1)/(y2-y1) == (x-x1)/(y-y1)) {
      // M est sur la droite formée par A-B
      if( x<=x2 && x>=x1) {
        // M est sur le segment A-B
      } else {
        // M est sur la droite mais en dehors du segment
      }
    } else {
      // M est en dehors de la droite donc en dehors du segment
    }
    Hypothèse x1 < x2.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci j'avais en effet pensé à ça, mais comme la ligne de drawLine est fine, ne va-t-il pas être difficile d'avoir le curseur pile sur le segment? Y a-t-il un moyen de considérer que le curseur est sur le segment lorsqu'il est à moins de 5 pixels du segment ?

  4. #4
    En attente de confirmation mail
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2010
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 501
    Points : 1 060
    Points
    1 060
    Par défaut
    En effet, avec cette méthode, on n'est pas certain de mapper exactement sur le tracé de drawLine.

    Par ailleurs, il faut insérer un epsilon dans la formule car le calculs va provoquer des comparaisons de nombres réels:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (Math.abs((x2-x1)/(y2-y1)-(x-x1)/(y-y1))<epsilon) {
    (...)
    C'est mieux mais ça ne garantie toujours pas complètement d'être sur le tracé du drawLine ...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 74
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par Nudger Voir le message
    Bonjour,

    La solution est mathématique :
    1) vérifier que la pente de A-M est la même que A-B => M est sur la droite formée par A-B
    2) vérifier que M est entre A et B => M est sur le segment A-B

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if ((x2-x1)/(y2-y1) == (x-x1)/(y-y1)) {
      // M est sur la droite formée par A-B
      if( x<=x2 && x>=x1) {
        // M est sur le segment A-B
      } else {
        // M est sur la droite mais en dehors du segment
      }
    } else {
      // M est en dehors de la droite donc en dehors du segment
    }
    Hypothèse x1 < x2.
    Le calcul d'une pente n'est il pas plutot du type ?

  6. #6
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Sinon on peut se baser sur des classes existantes : Shape
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

Discussions similaires

  1. point qui appartient à un segment test
    Par xavierdestev dans le forum Débuter
    Réponses: 5
    Dernier message: 24/10/2013, 20h50
  2. Fonction pour vérifier si un point x;y est dans un tracé
    Par fredu dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 27/12/2008, 13h37
  3. cherche si un point appartient à une droite dans l'image
    Par kaiseresis dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 16/12/2008, 12h22
  4. [Oracle 10g] Projection d'un point sur un segment
    Par CosmoPic dans le forum SQL
    Réponses: 1
    Dernier message: 05/08/2008, 10h08
  5. point appartient polyligne
    Par gracerare dans le forum Langage
    Réponses: 7
    Dernier message: 25/07/2007, 18h10

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