Question

Je suis vraiment coincé sur la façon d'aller sur la programmation de cette. Comment dessiner un cercle en Java avec un rayon et des points autour du bord?

I besoin de dessiner un cercle dans un JFrame avec un rayon et les 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 être en mesure de programmer le cercle. J'utilise actuellement une méthode Ellipse2D mais cela ne semble pas fonctionner et ne retourne pas un rayon, comme dans ma compréhension, il ne tire pas le cercle du centre plutôt d'un départ de coordonnées utilisant une hauteur et la largeur.

Mon code actuel est sur un cadre distinct 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); 
 } 
}
Était-ce utile?

La solution

points sur une peut être spécifiée comme une fonction de l'angle θ:

  

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

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

Addendum: Comme suggéré dans un commentaire par @Christoffer Hammarström, cette révisé exemple réduit le nombre de nombres magiques dans l'original. Le nombre de points désiré devient un paramètre du constructeur. Il adapte également le rendu à la taille du conteneur.

text alt

/** @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();
            }
        });
    }
}

Autres conseils

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 devez calculer la taille des décorations de fenêtre et il y arrive sale ...

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top