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

  1. #1
    Membre du Club
    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
    Points : 52
    Points
    52
    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 854
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 854
    Points : 22 876
    Points
    22 876
    Billets dans le blog
    51
    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 !

  3. #3
    Membre du Club
    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
    Points : 52
    Points
    52
    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 854
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 854
    Points : 22 876
    Points
    22 876
    Billets dans le blog
    51
    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.

  5. #5
    Membre du Club
    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
    Points : 52
    Points
    52
    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 du Club
    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
    Points : 52
    Points
    52
    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 ?

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 854
    Points : 22 876
    Points
    22 876
    Billets dans le blog
    51
    Par défaut
    Il n'est pas possible d'utiliser tel quelle une forme contenant des lignes car une ligne ca n'a pas d'epaisseur et donc ce n'est pas une aire. Par contre il est possible d'utiliser la forme retournee par le Stroke utilise pour peindre la ligne (par defaut un trait continu d'epaisseur 1).

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
    package test;
     
    import java.awt.*;
    import java.awt.image.*;
    import java.awt.geom.*;
    import javax.swing.*;
     
    /**
     * <p>Title: </p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2006</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    class TestAreaIntersects extends JPanel {
      private enum RenderMethod {
        FILL, DRAW;
      }
     
     
      private static int OPTION_NONE = 0;
      private static int OPTION_VERTEX = 1;
      private static int OPTION_BOUNDING_BOX = 2;
     
     
      private RenderMethod renderMethod;
      private Shape shape;
      private Paint paint;
      private int option;
     
      public TestAreaIntersects(Shape shape, RenderMethod renderMethod, Paint paint, int option) {
        super();
        this.shape = shape;
        this.renderMethod = renderMethod;
        this.paint = paint;
        this.option = option;
      }
     
      @Override protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.WHITE);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setPaint(paint);
        switch (renderMethod) {
          case DRAW:
            g2d.draw(shape);
            break;
          case FILL:
            g2d.fill(shape);
        }
        g2d.setColor(Color.BLACK);
        g2d.drawLine(0, 0, 100, 0);
        g2d.drawLine(0, 0, 0, 100);
        if ((option & OPTION_VERTEX) == OPTION_VERTEX) {
          g2d.setXORMode(Color.BLACK);
          g2d.setPaint(Color.CYAN);
          Rectangle2D.Float rect = new Rectangle2D.Float();
          float[] points = new float[6];
          for (PathIterator pi = shape.getPathIterator(null); !pi.isDone(); pi.next()) {
            int seg = pi.currentSegment(points);
            switch (seg) {
              case PathIterator.SEG_MOVETO:
              case PathIterator.SEG_LINETO:
                rect.setFrame(points[0] - 0.5f, points[1] - 0.5f, 1, 1);
              case PathIterator.SEG_QUADTO:
                rect.setFrame(points[2] - 0.5f, points[3] - 0.5f, 1, 1);
                break;
              case PathIterator.SEG_CUBICTO:
                rect.setFrame(points[4] - 0.5f, points[5] - 0.5f, 1, 1);
                break;
              case PathIterator.SEG_CLOSE:
                continue;
            }
            g2d.fill(rect);
            g2d.draw(rect);
          }
          g2d.setPaintMode();
        }
        if ((option & OPTION_BOUNDING_BOX) == OPTION_BOUNDING_BOX) {
          g2d.setStroke(new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 0, new float[] {2}, 0));
          g2d.setColor(Color.DARK_GRAY);
          g2d.draw(shape.getBounds2D());
        }
      }
     
      public static void main(String ...args) {
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            GeneralPath path = new GeneralPath();
            int lineNumber = 10;
            int x = 50;
            int y = 50;
            int width = 100;
            int height = 100;
            float dy = height / (float) (lineNumber + 1);
            for (int i = 0; i < lineNumber; i++) {
              path.moveTo(x, y + dy + i * dy);
              path.lineTo(x + width, y + dy + i * dy);
            }
            Shape shape1 = new BasicStroke(1f).createStrokedShape(path);
            Shape shape2 = new Ellipse2D.Float(x, y, width, height);
            Area shape3 = new Area(shape1);
            shape3.intersect(new Area(shape2));
            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new GridLayout(1, 3));
            frame.add(new TestAreaIntersects(shape1, RenderMethod.DRAW, Color.BLUE, OPTION_BOUNDING_BOX));
            frame.add(new TestAreaIntersects(shape2, RenderMethod.FILL, Color.RED, OPTION_BOUNDING_BOX));
            frame.add(new TestAreaIntersects(shape3, RenderMethod.DRAW, Color.GREEN, OPTION_VERTEX | OPTION_BOUNDING_BOX));
            frame.setSize(600, 400);
            frame.setVisible(true);
            float[] points = new float[6];
            for (PathIterator pi = new FlatteningPathIterator(shape3.getPathIterator(null), 1); !pi.isDone(); pi.next()) {
              int seg = pi.currentSegment(points);
              switch (seg) {
                case PathIterator.SEG_MOVETO:
                  System.out.printf("MOVE (%f, %f)", points[0], points[1]);
                  break;
                case PathIterator.SEG_LINETO:
                  System.out.printf(" -> LINE (%f, %f)", points[0], points[1]);
                  break;
                case PathIterator.SEG_QUADTO:
                  System.out.printf(" ~> QUAD [%f, %f] (%f, %f)", points[0], points[1], points[2], points[3]);
                  break;
                case PathIterator.SEG_CUBICTO:
                  System.out.printf(" ~~> CUBIC [%f, %f] [%f, %f] (%f, %f)", points[0], points[1], points[2], points[3], points[4], points[5]);
                  break;
                case PathIterator.SEG_CLOSE:
                  System.out.println(" -| END (back to first point of the list)");
              }
            }
          }
        });
      }
    }
    En en applanissant puis en parcourant le PathIterator retourne, on se rend compte qu'on traverse plusieurs lignes horizontales...

  8. #8
    Membre du Club
    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
    Points : 52
    Points
    52
    Par défaut
    C'est ca, ca a l'air de marcher, de plus ta présentation des résultats m'a permis de comprendre ce que signifiait chacun d'entre eux
    Un graaaand merci à toi !

+ 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