Desenhe um círculo com um raio e pontos ao redor da borda

Eu estou realmente presa em como programar isso. Como desenhar um círculo em Java com um raio e pontos ao redor da borda?

Eu preciso desenhar um círculo dentro de um JFrame com um raio e pontos ao redor da circunferência. Eu posso calcular matematicamente como encontrar as coordenadas do ponto ao redor da borda, mas eu não consigo programar o círculo. Atualmente, estou usando um método Ellipse2D, mas isso não parece funcionar e não retorna um raio, pois, no meu entender, ele não desenha o círculo do centro, em vez de uma coordenada inicial usando altura e largura.

Meu código atual está em um quadro separado, mas preciso adicioná-lo ao meu quadro existente.

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); } } 

Pontos em um círculo podem ser especificados como uma function do ângulo θ:

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

Aqui, incrementos de 2π / 8 são mostrados.

Adendo: Como sugerido em um comentário de @Christoffer Hammarström, este exemplo revisado reduz o número de números mágicos no original. O número desejado de pontos se torna um parâmetro para o construtor. Também adapta a renderização ao tamanho do contêiner.

texto alternativo

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

Tente algo assim:

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

Você também pode replace o método paint na class frame, mas então você teria que calcular o tamanho das decorações da janela e fica sujo lá …

Use Minueto .

Eu recomendo levar algum tempo para rever o “algoritmo do círculo de ponto médio ou o algoritmo do círculo de Bresenham”. A solução aceita é baseada em operações matemáticas muito caras, como a multiplicação de float e funções trigonométricas.