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

Graphisme Java Discussion :

Recuperer les coordonnées d'une intersection entre deux formes


Sujet :

Graphisme Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 82
    Par défaut Recuperer les coordonnées d'une intersection entre deux formes
    Bonsoir à tous,

    je cherche à récupérer les coordonnées d'intersections entre deux formes.

    Je m'explique, j'ai un polygone qui contient un nombre X de lignes.
    Je souhaite dessiner ces lignes au sein du polygone.

    Pour cela, je calcule la hauteur max du polygone que je divise par X, j'ai donc l'intervalle entre chaque ligne.

    Je créé ensuite des Polygone de coordonnées [xMin,yMax-intervalle][xMax,yMax-intervalle]
    J'ai donc une liste de lignes, mais elles dépassent évidemment du polygone.

    Je pensais utiliser la fonction intersect pour recuperer les coordonnées, mais horreur ! celle ci ne retourne qu'un booléen.

    Ma question est donc : existe t'il un moyen simple de récupérer les coordonnées x,y des deux intersections de chacune de mes lignes avec mon polygone ?

    Merci d'avance pour vos pistes éventuelles.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Tu as plusieurs manieres de manipuler la zone d'intersection entre deux polygones.

    - pour une manipulation directe, cela peut se faire via la classe Area qui permet de faire des operations arithmetiques entre deux formes (Shape).

    - pour un simplement rendu, ce n'est pas la peine de se casser la tete avec Area :

    -- la maniere la plus simple est d'utiliser setClip() ou clip() sur le Graphics avec la bonne forme. Rien ne sera dessine hors de la zone de clip...

    -- mais l'utilisation de la zone de clip ne permet pas d'avoir des bordures antialiasees sur cette meme zone (on verra des effets d'escaliers. Sur un simple remplissage avec des lignes ca devrait passer... avec des couleurs, gradients ou texture ca parraitra tres moche). La il est interressant alors d'utiliser AlphaComposite.SrcIn qui remplira la forme deja presente dans ton image avec ce que tu est entrain de peindre (pareil rien n'apparaitra dans les zones vides de l'image). Et la magique... la forme est antialiasee !
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 82
    Par défaut
    Bonjour bouye et merci d'avoir pris le temps de me répondre,
    Le but ultime de ses lignes est de recevoir du texte, par le biais de batik et du SVG, je peux ecrire du texte directement sur une ligne, mais il ne doit pas dépasser du polygone qui le contient.

    Citation Envoyé par bouye Voir le message
    Tu as plusieurs manieres de manipuler la zone d'intersection entre deux polygones.

    - pour une manipulation directe, cela peut se faire via la classe Area qui permet de faire des operations arithmetiques entre deux formes (Shape).
    Oui j'avais regarder, mais je ne crois pas que cela m'aide. On peut faire des xor etc, mais j'ai besoin des positions geometriques des points, pour les approximer afin que le texte ne sorte pas du polygone (+/- 10%)

    Citation Envoyé par bouye Voir le message
    - pour un simplement rendu, ce n'est pas la peine de se casser la tete avec Area :

    -- la maniere la plus simple est d'utiliser setClip() ou clip() sur le Graphics avec la bonne forme. Rien ne sera dessine hors de la zone de clip...
    Ce n'est pas qu'une question de rendu malheureusement, comme je l'explique plus haut, cette ligne est un repère pour ecrire mon texte... Je dois connaitre la position de cette ligne par rapport au polygone, car le texte est complexe. En SVG, je peux coller du texte pour qu'il suive la ligne mais je dois aussi rendre du texte en interligne mais aussi des fractions, des exposants ... Les coordonnées me seraient donc utiles pour en déduire les informations sur l'interlignage, calculer les proportions d'une fraction etc ...

    -- mais l'utilisation de la zone de clip ne permet pas d'avoir des bordures antialiasees sur cette meme zone (on verra des effets d'escaliers. Sur un simple remplissage avec des lignes ca devrait passer... avec des couleurs, gradients ou texture ca parraitra tres moche). La il est interressant alors d'utiliser AlphaComposite.SrcIn qui remplira la forme deja presente dans ton image avec ce que tu est entrain de peindre (pareil rien n'apparaitra dans les zones vides de l'image). Et la magique... la forme est antialiasee !

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Ce que tu cherches correspond à une simple intersection d'Area entre une zone rectangulaire contenant des lignes (voir Path2D/GeneralPath) et une forme arbitraire quelconque (Shape/Polygon). Il faut ensuite recuperer le PathIterator de la forme résultante et le parcourir pour connaitre les coordonnées de bout des lignes et/ou faire le layout du texte. Evidement si tu veux que les glyphes de ton texte soient eux aussi intégralement contenus dans la forme cela va demander un peu plus de boulot.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 82
    Par défaut
    Citation Envoyé par bouye Voir le message
    Ce que tu cherches correspond à une simple intersection d'Area entre une zone rectangulaire contenant des lignes (voir Path2D/GeneralPath) et une forme arbitraire quelconque (Shape/Polygon). Il faut ensuite recuperer le PathIterator de la forme résultante et le parcourir pour connaitre les coordonnées de bout des lignes et/ou faire le layout du texte. Evidement si tu veux que les glyphes de ton texte soient eux aussi intégralement contenus dans la forme cela va demander un peu plus de boulot.
    Donc il faut bien fouiller du coté du pathIterator ... je vais jeter un oeil a la doc et je reviendrai peut etre t'embeter avec mes questions
    Merci pour tes réponses !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 82
    Par défaut
    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
    		// On calcule le nombre de lignes contenues dans le texte
    		int nbLignes = getNombreLignes(blocATraiter.getTexte().getText());
     
                    // On créé une Area avec la forme a traiter
    		Area aireForme = new Area(blocATraiter.getPolygone());
    		// On a la hauteur max du polynome
    		int hauteurMaxPolynome = blocATraiter.getPolygone().getBounds().height;
    		// On divise par le nombre de lignes contenues dans le bloc
    		int hauteurLignePolynome = hauteurMaxPolynome/nbLignes;
     
                    // Calcul des extremums
    		int yMax = getMaximum(blocATraiter.getPolygone().ypoints);
    		int xMin = getMinimum(blocATraiter.getPolygone().xpoints);
    		int xMax = getMaximum(blocATraiter.getPolygone().xpoints);
    		int i= 0;
    		System.out.println("BOUNDS : ["+blocATraiter.getPolygone().getBounds());
    		while(i<nbLignes){
    			yMax = yMax - hauteurLignePolynome;
    			Rectangle tmp = new Rectangle(xMin, yMax, xMax, 1);
    			Area tmpArea = new Area(tmp);
    			aireForme.intersect(tmpArea);
    			PathIterator iter = aireForme.getPathIterator(null);
    			while(!iter.isDone()){
    				float[] coord = new float[6];
    				int result = iter.currentSegment(coord);
    				if(result == PathIterator.SEG_MOVETO){
    					System.out.println("MOVETO coord : ["+coord[0]+";"+coord[1]+"]");										
    				}
    				if(result == PathIterator.SEG_LINETO){
    					System.out.println("LINETO coord : ["+coord[0]+";"+coord[1]+"]");										
    				}
    				iter.next();
    			}
    			i++;
    		}
    Je comprends mal le fonctionnement de PathIterator ... La sur mon Area, en faisant l'intersection entre aireForme et tmpArea, je dois avoir une forme qui ne contient l'intersection des deux si j'ai bien compris, donc je devrais avoir deux vecteur d'un pixel de long, non ?

    Hors avec un test je trouve ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BOUNDS : [java.awt.Rectangle[x=31,y=21,width=45,height=29]
    MOVETO coord : [31.0;21.0]
    LINETO coord : [32.0;22.0]
    LINETO coord : [34.214287;22.0]
    LINETO coord : [31.0;21.0]
    Ya t'il quelque chose que j'utilise mal ?

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

Discussions similaires

  1. Recuperer les coordonnées d'une ville
    Par kev484 dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 09/02/2010, 23h03
  2. recuperer les coordonnées de la souris lors d'un appui sur une touche
    Par haraelendil dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 22/11/2007, 13h23
  3. Coordonnées d'une intersection de deux courbes
    Par RKOCOCO dans le forum MATLAB
    Réponses: 2
    Dernier message: 22/06/2007, 14h05
  4. [VB.NET] Passer une valeur de control entre deux form
    Par TheMacleod dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/12/2005, 11h07
  5. Récuperer les fichiers d'une autre machine sur une autre
    Par khalidlyon dans le forum Réseau
    Réponses: 1
    Dernier message: 09/11/2004, 13h40

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