2010-03-24 38 views
21

Estoy realmente atascado en cómo programar esto. ¿Cómo dibujar un círculo en Java con un radio y puntos alrededor del borde?Dibuje un círculo con un radio y puntos alrededor del borde

Necesito dibujar un círculo dentro de un JFrame con un radio y puntos alrededor de la circunferencia. Puedo calcular matemáticamente cómo encontrar las coordenadas del punto alrededor del borde, pero parece que no puedo programar el círculo. Actualmente estoy usando un método de Ellipse2D, pero parece que no funciona y no devuelve un radio, ya que, según entiendo, no dibuja el círculo desde el centro en lugar de una coordenada de inicio con una altura y un ancho.

Mi código actual está en un marco separado pero necesito agregarlo 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); 
} 
} 

Respuesta

60

puntos en un circle pueden especificarse como una función de la θ ángulo:

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

Aquí, incrementos de 2π/8.

Addendum: Como se sugiere en un comentario de @Christoffer Hammarström, este ejemplo de revised reduce el número de magic numbers en el original. El número deseado de puntos se convierte en un parámetro para el constructor. También adapta el renderizado al tamaño del contenedor.

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

+1 para la captura de pantalla que muestra el código de ejecución !!! – OscarRyz

+0

Gracias eso es justo lo que estaba buscando – alchemey89

+0

@windopal: Excelente. Ver mis ediciones para un error de truncamiento embarazoso. @Oscar Reyes: _¡gracias! _. – trashgod

3

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í .. .

+0

gracias. Me preguntaba si había una manera de agregar un punto visible alrededor del borde del círculo en una determinada coordenada. – alchemey89

0

recomiendo 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 operaciones matemáticas muy costosas como la multiplicación de flotación y las funciones trigonométricas.

Cuestiones relacionadas