web-dev-qa-db-fra.com

Tracez un cercle avec un rayon et des points autour du bord

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?

Je dois dessiner un cercle dans un cadre 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, il ne dessine pas le cercle du centre, mais plutôt d'une coordonnée de départ 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); 
 } 
}
21
alchemey89

Les points sur un cercle peuvent être spécifiés en fonction de l'angle θ:

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

Ici, les incréments de 2π/8 sont affichés.

Addendum: Comme suggéré dans un commentaire de @Christoffer Hammarström, cet exemple révisé réduit le nombre de nombres magiques 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();
            }
        });
    }
}
62
trashgod

Essayez quelque chose comme ça:

  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 redéfinir la méthode Paint dans la classe frame, mais vous devrez alors calculer la taille de la décoration de la fenêtre et elle sera sale à cet endroit ...

3
Viesturs

Utilisez Minueto .

2
Präriewolf

Je recommande de prendre un peu de temps pour revoir "l'algorithme du cercle du point milieu ou l'algorithme du cercle de Bresenham". La solution acceptée repose sur des opérations mathématiques très coûteuses telles que la multiplication flottante et les fonctions trigonométriques.

0
mhcuervo