绘制一个半径为圆的圆点

我真的被困在如何去编程这个。 如何用Java绘制一个半径为圆的圆点?

我需要在一个带有半径的JFrame中绘制一个圆,并指向圆周。 我可以通过math计算如何find边缘点的坐标,但我似乎无法编程该圆。 我目前正在使用一个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); } } 

圆上的点可以被指定为angular度θ的函数:

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

这里显示了2π/ 8的增量。

附录:正如@ChristofferHammarström的评论所build议的那样,这个修改过的例子减less了原始数字的数量 。 所需的点数成为构造函数的参数。 它也使渲染适应容器的大小。

替代文字

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

您也可以重写框架类中的绘画方法,但是您必须计算窗口装饰的大小,并在那里变脏。

使用Minueto 。

我build议花一些时间来回顾“中点圆圈algorithm或Bresenham圆圈algorithm”。 接受的解决scheme是基于非常昂贵的math运算,如浮点乘法和三angular函数。

Interesting Posts