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

je suis vraiment coincé 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 à l'intérieur d'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 semble pas pouvoir programmer le cercle. Je suis en train d'utiliser une méthode Ellipse2D mais cela ne semble pas fonctionner et ne renvoie pas un rayon, comme d'après ce que j'ai compris, il ne tire pas le cercle du Centre plutôt 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); 
 } 
}
21
demandé sur Andrew Thompson 2010-03-24 17:58:31

4 réponses

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, ce révisé exemple réduit le nombre de nombres magiques dans l'original. Le nombre de points devient un paramètre du 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();
            }
        });
    }
}
61
répondu trashgod 2017-05-23 12:34:34

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 outrepasser la méthode de peinture dans la classe de cadre, mais alors le que vous auriez à calculer dans la taille des décorations de fenêtre et il se salit là...

3
répondu Viesturs 2010-03-24 15:17:01

Utiliser Minueto .

2
répondu Präriewolf 2010-03-24 14:59:27

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

0
répondu mhcuervo 2013-08-06 18:04:32