studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones java swing drawing circle paintcomponent

java - reales - libro de android studio en español pdf



Dibuja un círculo con un radio y puntos alrededor del borde (4)

Estoy realmente atascado en cómo programar esto. ¿Cómo dibujar un círculo en Java 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); } }


Los puntos en un circle se pueden especificar como una función del ángulo θ:

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

Aquí, se muestran incrementos de 2π / 8 .

Anexo: Como se sugiere en un comentario de @Christoffer Hammarström, este ejemplo revised reduce la cantidad de números mágicos 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.

/** @see https://.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(); } }); } }


Pruebe 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 anular el método de pintura en la clase de marco, pero luego debe calcular el tamaño de las decoraciones de ventana y se ensucia allí ...


Recomiendo tomarse un tiempo para revisar el "Algoritmo del círculo medio o el algoritmo 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.