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

2D Java Discussion :

Si un point est dans un polygone


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut Si un point est dans un polygone
    Bonjour.
    J'ai codé tout un système de zone et de protection qui fonctionne plutôt bien, mais ça fonctionne juste sur des carré et rectangle. Testé si un point est dans la zone est plutôt facile.

    Je me demandais comment je pourrait faire avec une liste de points qui forment une zone ?
    J'ai codé un truck qui m'affiche la zone et je peux voir que je suis dedans, mais je ne sais pas le tester avec du code.
    En gros c’est une liste qui contient des Vector3d, sauf que Y est définit ailleurs. Le dernier Vector3d est relié au premier pour fermer le polygone.
    Le but c’est de savoir si un Vector3d est dans de polygone ou a l'extérieur.

    Exemple en image du polygone:
    Nom : 2019-11-16 01-34-54.gif
Affichages : 681
Taille : 387,6 Ko

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    C'est quoi cette classe Vector3D ? Une classe maison ? Ou d'une API standard ? Si c'est le cas laquelle ? javax.vecmath ? Apache Commons Math ? Autre ?

    Sinon, si je comprends bien, tu stockes des points 2D en fait dans tes Vector3D, puisque tu dis stocker Y ailleurs (l'altitude je suppose). Si c'est bien le cas, alors tu peux utiliser une classe du JDK, en faisant une conversion des Vector3D. Il y a java.awt.Polygon (ou éventuellement java.awt.geom.Path2D). Avec la méthode contains() tu peux tester facilement si un point est dans un polygone 2D. Ou avect la méthode intersects tester si un rectangle est en collision avec le polygon. Tu peux même au besoin tester l'intersection de deux polygones avec la classe java.awt.geom.Area.

    Tu peux gagner en performance en évitant la conversion Vector3D vers Polygon, en adaptant le source de la méthode contains de Polygon (qui est assez simple à adapter).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut
    La class c'est com.flowpowered.math.vector.Vector3d

    java.awt.Polygon; a que x et y, ça va fonctionner pareil ? Le problème c'est que addPoint(int x, int y) est en int et il me faut donner du double. Donc toujours bloqué

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Lprofessionnelle Voir le message
    La class c'est com.flowpowered.math.vector.Vector3d
    Une API exotique et non maintenue apparemment? Tu n'as pas plutôt un lien, ou un nom d'API, plutôt qu'un nom de classe ?

    Citation Envoyé par Lprofessionnelle Voir le message
    java.awt.Polygon; a que x et y,
    Bah, oui, c'est ce que je disais, c'est 2D. Mais tu ne pas répondu sur mon interrogation à ce sujet et ta mention d'un Y à part. Ton polygone est-il planaire ou non ? S'il est planaire dans un plan horizontal comme le suggère ton screenshot, tu peux te traiter un polygone 2D en éliminant l'altitude. S'il est planaire dans un plan horizontal, il faudra tester l'appartenance au plan et faire un changement de repère pour tester l'appartenance au polygone dans le plan. Sinon c'est plus compliqué.

    Citation Envoyé par Lprofessionnelle Voir le message
    ça va fonctionner pareil ?
    pareil que quoi ?

    Citation Envoyé par Lprofessionnelle Voir le message
    Le problème c'est que addPoint(int x, int y) est en int et il me faut donner du double. Donc toujours bloqué
    Path2D supporte le double !
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 197
    Par défaut
    Citation Envoyé par joel.drigo
    Une API exotique et non maintenue apparemment? Tu n'as pas plutôt un lien, ou un nom d'API, plutôt qu'un nom de classe ?
    cz je sais pas, c'est ce que j'ai toujours utilisé pour minecraft. Je crois que c'est ça: https://mvnrepository.com/artifact/c...ered/flow-math

    Citation Envoyé par joel.drigo
    Bah, oui, c'est ce que je disais, c'est 2D. Mais tu ne pas répondu sur mon interrogation à ce sujet et ta mention d'un Y à part. Ton polygone est-il planaire ou non ? S'il est planaire dans un plan horizontal comme le suggère ton screenshot, tu peux te traiter un polygone 2D en éliminant l'altitude. S'il est planaire dans un plan horizontal, il faudra tester l'appartenance au plan et faire un changement de repère pour tester l'appartenance au polygone dans le plan. Sinon c'est plus compliqué.
    Oui, donc il est planaire. Je voulais pas de y personnalisé pour chaque point dans ma liste, car si je commence a avoir différente hauteur dans le polygone ça va devenir compliqué.

    J'ai vu des class qui utilisaient x et y, comme je veux d'abord tester si je suis dans le polygon et après testé si je suis dans la hauteur choisit et moi j'ai besoin de x et z, c'est ce qui me perturbe un peut. Au pire je peux modifier le vecteur pour changer la hauteur et tester un polygone en 3d si c'est plus simple ?


    Citation Envoyé par joel.drigo
    Path2D supporte le double !
    La seul méthode que j'ai trouvé prenait que int en param

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Lprofessionnelle Voir le message
    Oui, donc il est planaire. Je voulais pas de y personnalisé pour chaque point dans ma liste, car si je commence a avoir différente hauteur dans le polygone ça va devenir compliqué.
    Donc dans les Vector3d, tu n'utilises que x et z.
    Citation Envoyé par Lprofessionnelle Voir le message
    La seul méthode que j'ai trouvé prenait que int en param
    Donc tu peux faire une méthode comme ça, à adapter éventuellement (attention, les points doivent être dans l'ordre) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static boolean inPolygon(Collection<Vector3d> vectors, double px, double pz) {
    		if ( vectors.size()<3 ) {
    			throw new IllegalArgumentException("A polygon needs at least 3 points");
    		}
    		Path2D.Double path = new Path2D.Double();
    		vectors.stream().limit(1).forEach(v->path.moveTo(v.getX(), v.getZ()));
    		vectors.stream().skip(1).forEach(v->path.lineTo(v.getX(), v.getZ()));
    		path.closePath();
    		return path.contains(px, pz);
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Tester si un point est dans un polygone
    Par hicham-dj dans le forum WinDev
    Réponses: 4
    Dernier message: 16/09/2015, 10h58
  2. Réponses: 14
    Dernier message: 05/04/2012, 14h16
  3. [JavaScript] [Google Maps]Tester si un point est dans un Polygone
    Par NoSmoking dans le forum Contribuez
    Réponses: 1
    Dernier message: 08/08/2011, 17h48
  4. Savoir si un point est dans un polygone.
    Par poly128 dans le forum Langage
    Réponses: 8
    Dernier message: 18/11/2008, 09h34
  5. Trouver si un point est dans un polygone
    Par Mucho dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 15/09/2006, 17h36

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