2010-03-24 16 views
21

Je suis vraiment bloqué sur la façon de programmer cela. Comment dessiner un cercle en Java avec un rayon et des points autour du bord?Dessinez un cercle avec un rayon et des points autour du bord

J'ai besoin de dessiner un cercle dans un JFrame avec un rayon et des points autour de la circonférence. Je peux calculer mathématiquement comment trouver les coordonnées du point autour du bord mais je ne peux pas sembler pouvoir programmer le cercle. J'utilise actuellement une méthode Ellipse2D mais cela ne semble pas fonctionner et ne renvoie pas de rayon, car à ma connaissance, elle ne tire pas le cercle du centre plutôt que d'une coordonnée de départ en utilisant une hauteur et une largeur.

Mon code actuel est sur un cadre séparé mais je dois l'ajouter à mon cadre existant.

import java.awt.*; 
import javax.swing.*; 
import java.awt.geom.*; 

public class circle extends JFrame { 
    public circle() { 
    super("circle"); 
    setSize(410, 435); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Panel sp = new Panel(); 
    Container content = getContentPane(); 
    content.add(sp); 
    setContentPane(content); 
    setVisible(true); 
} 

public static void main (String args[]){ 
    circle sign = new circle(); 
} 
} 

class Panel extends JPanel { 
public void paintComponent(Graphics comp) { 
    super.paintComponent(comp); 
    Graphics2D comp2D = (Graphics2D) comp; 

    comp2D.setColor(Color.red); 
    Ellipse2D.Float sign1 = new Ellipse2D.Float(0F, 0F, 350F, 350F); 
    comp2D.fill(sign1); 
} 
} 

Répondre

60

points sur une circle peuvent être spécifiées en fonction de l'angle θ:

x = a + r cos (θ)
y = b + r sin (θ)

Ici, par incréments de 2π/8 sont représentés.

Addendum: Comme suggéré dans un commentaire par @Christoffer Hammarström, cet exemple réduit le nombre de magic numbers dans l'original. Le nombre de points souhaité devient un paramètre pour le constructeur. Il adapte également le rendu à la taille du conteneur.

alt text

/** @see https://stackoverflow.com/questions/2508704 */ 
public class CircleTest extends JPanel { 

    private static final int SIZE = 256; 
    private int a = SIZE/2; 
    private int b = a; 
    private int r = 4 * SIZE/5; 
    private int n; 

    /** @param n the desired number of circles. */ 
    public CircleTest(int n) { 
     super(true); 
     this.setPreferredSize(new Dimension(SIZE, SIZE)); 
     this.n = n; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(
      RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setColor(Color.black); 
     a = getWidth()/2; 
     b = getHeight()/2; 
     int m = Math.min(a, b); 
     r = 4 * m/5; 
     int r2 = Math.abs(m - r)/2; 
     g2d.drawOval(a - r, b - r, 2 * r, 2 * r); 
     g2d.setColor(Color.blue); 
     for (int i = 0; i < n; i++) { 
      double t = 2 * Math.PI * i/n; 
      int x = (int) Math.round(a + r * Math.cos(t)); 
      int y = (int) Math.round(b + r * Math.sin(t)); 
      g2d.fillOval(x - r2, y - r2, 2 * r2, 2 * r2); 
     } 
    } 

    private static void create() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new CircleTest(9)); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       create(); 
      } 
     }); 
    } 
} 
+3

+1 pour la capture d'écran qui montre le code de fonctionnement !!! – OscarRyz

+0

Merci c'est exactement ce que je cherchais – alchemey89

+0

@windopal: Excellent. Voir mes modifications pour une erreur de troncature embarrassante. @Oscar Reyes: _gracias! _. – trashgod

3

Essayez quelque chose comme ceci:

public class CirclePanel extends JPanel 
    { 
    public static void main(String[] args) throws Exception 
    { 
     JFrame f = new JFrame(); 

     f.setContentPane(new CirclePanel()); 
     f.setSize(700,500); 
     f.setVisible(true); 
    } 

    public void paint(Graphics g) 
    { 
     super.paint(g); 
     //Draws the line 
     g.drawOval(0,0,this.getWidth(), this.getHeight()); 

     //draws filled circle 
     g.setColor(Color.red); 
     g.fillOval(0,0,this.getWidth(), this.getHeight()); 
    } 
    } 

Vous pouvez également remplacer la méthode de peinture dans la classe de cadre, mais la vous auriez à calculer la taille des décorations de fenêtre et il y arrive sale .. .

+0

merci. Je me demandais s'il y avait un moyen d'ajouter un point visible autour du bord du cercle à une coordonnée donnée? – alchemey89

0

Je recommande de prendre un certain temps pour examiner le « algorithme de cercle milieu ou l'algorithme de cercle de Bresenham ». La solution acceptée est basée sur des opérations mathématiques très coûteuses comme la multiplication flottante et les fonctions trigonométriques.