Нарисуйте круг с радиусом и острием по краю

Я действительно зациклился на том, как это сделать. Как нарисовать круг в Java с радиусом и острием по краю?

Мне нужно нарисовать круг в JFrame с радиусом и острием по окружности. я могу математически рассчитать, как найти координаты точки вокруг края, но я не могу запрограммировать круг. В настоящее время я использую метод Ellipse2D, но он, похоже, не работает и не возвращает радиус, поскольку, насколько я понимаю, он не рисует круг из центра, а не из начальной координаты с использованием высоты и ширины.

Мой текущий код находится на отдельном фрейме, но мне нужно добавить его в существующий фрейм.

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

Точки на окружности могут быть заданы как функция угла θ:

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

Здесь показаны приращения 2π / 8 .

Добавление: Как было предложено в комментарии @Christoffer Hammarström, этот пересмотренный пример уменьшает количество магических чисел в оригинале. Желаемое количество точек становится параметром для конструктора. Он также адаптирует рендеринг к размеру контейнера.

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

Попробуйте что-то вроде этого:

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

Вы также можете переопределить метод paint в classе фрейма, но тогда вам придется вычислять размер оконных украшений, и он становится грязным там …

Используйте Minueto .

Я рекомендую потратить некоторое время на рассмотрение «алгоритма окружности окружности или алгоритма круга Брешенема». Принятое решение основано на очень дорогостоящих математических операциях, таких как умножение на флоат и тригонометрические функции.

Давайте будем гением компьютера.