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 :

Détecter l'intérieur d'un arc


Sujet :

2D Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut Détecter l'intérieur d'un arc
    Bonjour,

    je dispose d'un JComponent de 17*17 pixels où j'ai redéfinie la méthode paintComponent() pour dessiner un arc de cercle à l'intérieur de ce composant.

    J'arrive bien à dessiner mes deux types d'arc de cercle (en changeant le couleur) mais je n'arrive pas à détecter la zone à l'intérieur de mes deux arcs de cercles pour dessiner en blanc.

    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
     
    protected void paintComponent(Graphics g) {
         Graphics2D g2 = (Graphics2D g)
     
         // Activation de l'anti-aliasing
         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     
         // Dessin de l'arc de cercle extérieur de 1 pixel
         g2.setColor(Color.BLACK);
         g2.setStroke(new BasicStroke(1));
         g2.drawArc(0, -getHeight() - 1, getWidth()*2, getHeight()*2, 180, 90);
     
         // Dessin du deuxième arc de cercle de 4 pixels
         g2.setStroke(new BasicStroke(5));
         g2.setColor(new Color(102, 51, 0));
         Arc2D arc = new Arc2D.Float(2, -getHeight() - 1, getWidth()*2 - 2, getHeight()*2 - 2, 180, 90, Arc2D.OPEN);
         g2.draw(arc);
     
         // Application de la couleur blanche dans la zone formée par les
         // deux arcs de cercles...
         g2.setColor(Color.WHITE);
         // .... ???
         // .... ??? Comment peut-on faire ?
     
    }
    J'ai bien essayé de récupérer l'objet Shape du deuxième arc, de construire un polygone puis une aire pour appliquer ma couleur blanche à l'intérieur des deux arcs mais lorsque je récupère l'objet Shape du deuxième arc, il me prend pas en compte la taille de mon trait (g2.setStroke()...).

    Comment faire ?
    Avez-vous une idée ?

    Merci beaucoup,
    F.

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    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
    import java.awt.*;
    import javax.swing.*;
     
    public class A {
    	public static void main(String[] args) {
    		JFrame f = new JFrame();
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		f.add(new P());
    		f.setSize(200, 200);
    		f.setVisible(true);
    	}
    }
     
    class P extends JPanel {
    	@Override
    	protected void paintComponent(Graphics g) {
    	     Graphics2D g2 = (Graphics2D) g;
    	     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    	     g2.setStroke(new BasicStroke(5));
     
    	     g2.setColor(Color.WHITE);
    	     g2.fillArc(2, -getHeight() - 1, getWidth()*2 - 2, getHeight()*2 - 2, 180, 90);
     
    	     g2.setColor(new Color(102, 51, 0));
    	     g2.drawArc(2, -getHeight() - 1, getWidth()*2 - 2, getHeight()*2 - 2, 180, 90);
    	}
     
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut
    je ne vois pas la bordure extérieure dans ton code ?
    Je me trompe ?

    Merci,
    F.

  4. #4
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Non tu ne te trompe pas.

    C'est que dans le code que tu donne, les deux arcs se confondent ! (De plus le second est dessiné par dessus le premier) J'ai donc supposer que le deuxième arc était une sorte de bordure. Je me suis visiblement trompé. Pourrais expliquer précisément la zone que tu veux récupérer ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut
    Salut,

    comme tu verras dans la capture d'écran joint à ce post (bord.png),
    il y a une première bordure extérieure foncée de 1 pixel et une bordure intérieure de 4 pixels.

    Je souhaite récupérer la partie bleue se trouvant à l'intérieur des deux arcs.
    Est-ce que tu comprends ce que je veux dire ?

    En tout cas, merci beaucoup.
    F.

    Nom : bord.png
Affichages : 79
Taille : 3,3 Ko

  6. #6
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    On voit vraiment pas grand chose sur ton screen, l'image est si petite, mais je ne vois comme partie bleu qu'un rectangle...

    Tu dit :
    Je souhaite récupérer la partie bleue se trouvant à l'intérieur des deux arcs.
    Mais tes deux arcs ont la même courbe, l'intersection de ces deux arcs est donc null.

    Mais je crois comprendre ce que tu souhaite, stp confirme ou infirme ma supposistion :

    Les deux arc on une partie qui se supperpose. Tu voudrais récupérer le rectangle dans lequel cette superpostion est inscrite (le rectangle bleu sur ton image) ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut
    je voudrais simplement mettre la partie bleue à droite en blanc...

  8. #8
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Comment obtiens tu la partie bleu ?
    Je ne peut pas t'aider sans cette information car je ne vois absolument pas comment tu la récupère

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut
    couleur de fond derrière ma fenêtre...

  10. #10
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut

  11. #11
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 914
    Billets dans le blog
    54
    Par défaut
    Pour faire des operations arithmetiques sur les formes il faut aller voir du cote de la classe Area. Il te faudra probablement faire des soustractions ou intersections d'aires en prenant nottament les formes des arcs obtenus avec l'option Arc2D.PIE ainsi que les formes des arcs telles que dessinees a l'ecran et produite par leur Stroke.

    Pour etre precis cette zone correspond probablement a un truc du genre (code pas teste) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Arc2D arc1 = new Arc2D.Float(2, -getHeight() - 1, getWidth()*2 - 2, getHeight()*2 - 2, 180, 90, Arc2D.OPEN);
    Shape s1 = new BasicStroke(5).createStrokedShape(arc1);
    Arc2D arc2 = new Arc2D.Float(2, -getHeight() - 1, getWidth()*2 - 2, getHeight()*2 - 2, 180, 90, Arc2D.PIE);
    Area area  = new Area(arc2);
    area.subtract(new Area(s1));
    Si jamais c'est plus grand que la zone prevue, il faut apres faire l'intersection de la zone resultat et du rectangle de fond.
    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

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut
    je ne savais pas comment faire pour faire une shape qui prenne en compte la taille de mon trait (stroke).

    Merci beaucoup,
    F.

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

Discussions similaires

  1. Détecter collision avec un arc de cercle
    Par FrankOVD dans le forum Mathématiques
    Réponses: 7
    Dernier message: 21/06/2012, 14h15
  2. Réponses: 1
    Dernier message: 11/12/2009, 16h34
  3. Détecter la collision, dessiner une flêche et un arc
    Par guitariste dans le forum JavaFX
    Réponses: 3
    Dernier message: 08/04/2009, 12h58
  4. Détecter Windows 2000 Professionnel
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 04/11/2006, 00h02
  5. savoir si 1 point est a l'intérieur d'un cercle ...
    Par skarladevobsy dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 23/05/2002, 19h14

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