Cliquer dans une zone en forme d'anneau

Cliquer dans une zone en forme d'anneau - Java - Programmation

Marsh Posté le 07-02-2008 à 21:31:16    

Bonjour à tous
J'ai besoin de vous. Je voudrais cliquer par exemple dans le petit cercle vert au centre pour afficher le chiffre 25 sans que quand je clique sur le petit cercle rouge il m'affiche aussi 25.
Je vous met l'image de ma cible ainsi que le code
 http://img240.imagevenue.com/loc127/th_15772_cible_122_127lo.JPG
 
Code :  
 
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
 
public class Plateau extends JPanel implements Runnable, MouseListener
{
    public int x,y,i,j;
     
    public int b501,b502;
    public int b251,b252;
    public int bs11,bs12;
    public int bt1,bt2;
    public int bs21,bs22;
    public int bd1,bd2;
     
    public int taille,rayon;
    public float larg2,haut2;
    public Font chiffre;
    public String nb[] = {"6","10","15","2","17","3","19","7","16","8","11","14","9","12","5","20","1","18","4","13"};
    private Thread t;
 
 public Plateau(int x, int y, int dim)
    {
        this.x = x;
        this.y = y;
        taille = dim;    
        addMouseListener(this);
    }
     
    public void init()
    {
         
    }
     
    public void paintComponent(Graphics g)
    {
        Graphics2D g2 =(Graphics2D) g;
        chiffre = new Font("Courier", Font.BOLD, 40);
        larg2 = haut2 = taille/2;
        rayon = 280;
         
        //MODE Qualite et Anti-Aliasing
        RenderingHints qualityHints = new RenderingHints
        (
        RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON
        );
        qualityHints.put
        (
        RenderingHints.KEY_RENDERING,
        RenderingHints.VALUE_RENDER_QUALITY
        );
        g2.setRenderingHints(qualityHints);
         
         
         
        g2.setColor(Color.lightGray);
        g2.fillOval(x, y, taille, taille);
       
        g2.setColor(Color.red); //zone double
        for(i=0;i<360;i=i+36)
            g2.fillArc((taille/2)-(taille/5*2),(taille/2)-(taille/5*2),(taille/5*4),(taille/5*4),i+9,18);
             
        g2.setColor(Color.green); //zone double
        for(i=0;i<360;i=i+36)
            g2.fillArc((taille/2)-(taille/5*2),(taille/2)-(taille/5*2),(taille/5*4),(taille/5*4),i-9,18);
             
        g2.setColor(Color.black); //zone simple 1
        for(i=0;i<360;i=i+36)
            g2.fillArc((taille/2)-(taille/27*10),(taille/2)-(taille/27*10),(taille/27*20),(taille/27*20),i+9,18);
             
        g2.setColor(Color.white); //zone simple 1
        for(i=0;i<360;i=i+36)
            g2.fillArc((taille/2)-(taille/27*10),(taille/2)-(taille/27*10),(taille/27*20),(taille/27*20),i-9,18);
             
        g2.setColor(Color.red); //zone triple
        for(i=0;i<360;i=i+36)
            g2.fillArc((taille/2)-(taille/19*5),(taille/2)-(taille/19*5),(taille/19*10),(taille/19*10),i+9,18);
             
        g2.setColor(Color.green); //zone triple
        for(i=0;i<360;i=i+36)
            g2.fillArc((taille/2)-(taille/19*5),(taille/2)-(taille/19*5),(taille/19*10),(taille/19*10),i-9,18);
             
        g2.setColor(Color.black); //zone simple 2
        for(i=0;i<360;i=i+36)
            g2.fillArc((taille/2)-(taille/42*10),(taille/2)-(taille/42*10),(taille/42*20),(taille/42*20),i+9,18);
             
        g2.setColor(Color.white); //zone simple 2
        for(i=0;i<360;i=i+36)
            g2.fillArc((taille/2)-(taille/42*10),(taille/2)-(taille/42*10),(taille/42*20),(taille/42*20),i-9,18);
         
        g2.setColor(Color.green); //centre 25
        g2.fillOval((taille/2)-(taille/24),(taille/2)-(taille/24),(taille/12),(taille/12));
         
        g2.setColor(Color.red); //centre 50
        g2.fillOval((taille/2)-(taille/48),(taille/2)-(taille/48),(taille/24),(taille/24));
    }
 
    public void mouseClicked(MouseEvent e){}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e){}
 
    public void run()
       {
               try{
                       while (t.isAlive())
                       {
                       //t.sleep(100);
                       }
 
                       t.sleep(1);
                       }catch(InterruptedException e){}
       }
}
 
PS : il se peut qu'il y ait des erreurs et la cible se trouve dans une JFrame

Reply

Marsh Posté le 07-02-2008 à 21:31:16   

Reply

Marsh Posté le 10-02-2008 à 08:55:40    

Bonjour,
 
a mon avis, tu es parti pour faire un peu de geometrie. Une zone de ta cible se definit par deux choses:
- la distance au centre;
- l'angle par rapport a l'horizontal.
 
calculer la distance au centre est simple: distance= sqrt((xsouris-xcentre)^2+(ysouris-ycentre)^2). Avec cela, tu peux deja tester les deux cercles du centre: ce seront des conditions du type:
 
si (distance<rayoncerclerouge) => je suis dans le cercle rouge
si ((distance>=rayoncerclerouge) et (distance<=rayoncerclevert) => je suis dans l'anneau vert.
 
Pour les autres zones, tu devras faire des tests sur le rayon et sur l'angle. A mon avis, fais des tests sur le sinus et le
cosinus de l'angle. Pour rappel, voici les formules
 
monsinus=(ysouris-ycentre)/distance;
moncosinus=(ysouris-ycentre)/distance;
 
si tu veux tester que ta souris est dans un angle entre 10 et 20 degres, testes les conditions suivantes.
si sinus(10)<monsinus<sinus(20) et cosinus(20)<moncosinus<cosinus(10)=>  je suis dans la zone entre 10 et 20 degres.
 
Attention, ce test n'est valable qu'entre 0 et 90 degres, apres, il faut inverser les comparaisons pour des problemes
de signe.
 
Tu peux evidemment combiner des tests sur le rayon et sur l'angle pour avoir chacune de tes zones.
 
Bonne trigonometrie.
 
[quotemsg=1683670,1,625080]Bonjour à tous
J'ai besoin de vous. Je voudrais cliquer par exemple dans le petit cercle vert au centre pour afficher le chiffre 25 sans que quand je clique sur le petit cercle rouge il m'affiche aussi 25.


---------------
Un blog sur le Japon: http://uchimizu.blogspot.com/
Reply

Marsh Posté le 10-02-2008 à 19:39:35    

Merci beaucoup je vais tester cette methode
 
PS : j'aime pas les maths :??:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed