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 :

Intersection Line2D et Shape (voire Polygon..)


Sujet :

2D Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Intersection Line2D et Shape (voire Polygon..)
    Bonjour,

    Je viens enfin de décider de m'inscrire sur ce forum, car malgré mes 2 années passées intenses en Java ainsi que la réalisation de petits projets graphiques, tels qu'une appli graphique permettant la retouche d'image, ou encore un petit jeu 2D en Swing.. je suis confronté à un problème simple à comprendre, mais à priori sans réponse pour le moment. Voici mon problème:

    Je récupère un Shape à la suite d'une transformation affine d'un Rectangle (surtout pour faire une rotation), comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shape textBounds = at.createTransformedShape(g2d.getFontMetrics().getStringBounds(modName, g2d));
    Jusque là, tout va bien, je me retrouve avec un shape pivoté dans le context du Graphics2D.
    Ensuite je récupère une ligne, sous forme de Line2D, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Line2D l1 = new Line2D.Double(0, 0, p1.x, p1.y)
    Maintenant, mon soucis, c'est que je souhaiterais vérifier l'intersection entre le Shape précédemment récupéré, et la Line2D. Je n'ai trouvé aucune méthode permettant cela dans l'interface Shape, ni ailleurs. L'API Java permet de vérifier l'intersection entre une Line et un Rectangle, hors un rectangle n'est définit que par son origine et ses dimensions, et donc n'est pas pivoté ! Par ailleurs j'ai trouvé un moyen de parer à ce problème en transformant la ligne en Stroke, puis en utilisant les intersection d'Area, mais bien entendu, ceci est un bidouillage et n'est absolument pas précis du tout.
    Voilà, merci d'avance si quelque peut m'aider à soulever ce problème, je dois trouver une solution d'ici la fin de semaine, merci.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bon et bien j'ai finalement réussi en vérifiant l'intersection de la ligne avec chaque segment du shape. Je ne comprends pas que l'API de Java ne possède même pas de méthode pour faire cela..
    Donc voici mon code:

    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
    35
    36
    37
    38
    39
    /**
     * Teste si la ligne {@code l} intersecte avec la forme {@code s}
     * @param s Shape à tester
     * @param l Line2D à tester
     * @return <b>true</b> si {@code l} intersecte avec {@code l} 
     */ 
    public static boolean lineIntersectShape(Shape s, Line2D l) {
    	boolean intersecte = false;
    	double[] segment = new double[2]; //Tableau qui contiendra les coordonnées d'un des points du segment
    	Point2D p1 = new Point2D.Double(); //Premier point du segment
    	Point2D p2 = new Point2D.Double(); //Deuxième point du segment
    	PathIterator pi = s.getPathIterator(null); //Le PathIterator pour parcourir les segments du Shape
     
    	//On initialise le premier premier segment ainsi que chaque point du segment
    	pi.currentSegment(segment);
    	p1 = new Point2D.Double(segment[0], segment[1]);
    	pi.next();
    	pi.currentSegment(segment);
    	p2 = new Point2D.Double(segment[0], segment[1]);
     
    	//Tant qu'on a pas parcouru tous les points et qu'il n'y a pas d'intersection
    	while (!pi.isDone() && !intersecte) {        		
    		//Line2D représentant le segment actuel
    		Line2D l2 = new Line2D.Double(p1.getX(), p1.getY(), p2.getX(), p2.getY());
    		//Si la ligne intersecte avec le segment 
    		if (l.intersectsLine(l2))
    			intersecte = true;
    		//Sinon on passe au segment suivant
    		else {
    			//Premier point du segment
    			p1 = new Point2D.Double(segment[0], segment[1]);
    			pi.next();
    			pi.currentSegment(segment);
    			//Deuxieme point du segment		
    			p2 = new Point2D.Double(segment[0], segment[1]);
    		}
    	}
    	return intersecte;
    }

Discussions similaires

  1. colorer intersection de deux polygones
    Par awalter1 dans le forum Linux
    Réponses: 4
    Dernier message: 30/01/2012, 08h55
  2. Intersection de Polygon
    Par littleqi dans le forum 2D
    Réponses: 14
    Dernier message: 29/05/2011, 21h59
  3. intersection et reunion de deux polygones
    Par anouar.g dans le forum C
    Réponses: 4
    Dernier message: 18/03/2009, 11h15
  4. Surface du polygone formé par l'intersection d'un plan et d'un cube unitaire
    Par ToTo13 dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 08/09/2006, 10h05

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