Pregunta

estoy realmente atascado en cómo ir sobre la programación de este. Cómo dibujar un círculo en Java con un radio y puntos alrededor del borde?

I necesita para dibujar un círculo dentro de un JFrame con un radio y los puntos alrededor de la circunferencia. i puede calcular matemáticamente cómo encontrar las coordenadas del punto alrededor del borde, pero me parece que no puede ser capaz de programar el círculo. Actualmente estoy usando un método Ellipse2D pero que no parece que el trabajo y no devuelve un radio, que bajo mi entendimiento, que no dibuja el círculo del centro en lugar de una partida de coordenadas utilizando una altura y anchura.

Mi código actual está en un marco separado pero necesito para añadirlo a mi marco 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); 
 } 
}
¿Fue útil?

Solución

puntos en un círculo se puede especificar como una función de la θ ángulo:

  

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

Aquí, incrementos de 2π / 8 son mostradas.

Adición: Como se sugiere en un comentario de @Christoffer Hammarström, este revisada ejemplo reduce el número de números mágicos en el original. El número deseado de puntos se convierte en un parámetro al constructor. También se adapta a la prestación del tamaño del contenedor.

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

Otros consejos

intentar algo como esto:

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

También puede reemplazar el método de pintura en el marco de la clase, pero entonces el que tendría que calcular el tamaño de las decoraciones de las ventanas y se ensucia allí ...

Me recomienda tomar algún tiempo para revisar el "algoritmo de círculo o algoritmo del punto medio del círculo de Bresenham". La solución aceptada se basa en las operaciones matemáticas muy costosos, como la multiplicación de flotador y funciones trigonométricas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top