Java 画一个半径和点在边缘周围的圆

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2508704/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 08:36:57  来源:igfitidea点击:

Draw a circle with a radius and points around the edge

javaswingdrawinggeometrypaintcomponent

提问by alchemey89

I'm really stuck on how to go about programming this. How to draw a circle in Java with a radius and points around the edge?

我真的被困在如何进行编程上。如何在Java中绘制一个半径和边缘点的圆?

I need to draw a circle within a JFrame with a radius and points around the circumference. i can mathematically calculate how to find the coordinates of the point around the edge but i cant seem to be able to program the circle. I am currently using a Ellipse2D method but that doesn't seem to work and doesn't return a radius, as under my understanding, it doesn't draw the circle from the center rather from a starting coordinate using a height and width.

我需要在 JFrame 内绘制一个带有半径和圆周点的圆。我可以数学计算如何找到边缘周围点的坐标,但我似乎无法对圆进行编程。我目前正在使用 Ellipse2D 方法,但这似乎不起作用,也不会返回半径,因为根据我的理解,它不会从中心绘制圆,而是从使用高度和宽度的起始坐标绘制圆。

My current code is on a separate frame but I need to add it to my existing frame.

我当前的代码在一个单独的框架上,但我需要将它添加到我现有的框架中。

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

采纳答案by trashgod

Points on a circlemay be specified as a function of the angle θ:

上的点可以指定为角度 θ 的函数:

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

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

Here, increments of 2π/8are shown.

此处显示了2π/8 的增量。

Addendum: As suggested in a comment by @Christoffer Hammarstr?m, this revisedexample reduces the number of magic numbersin the original. The desired number of points becomes a parameter to the constructor. It also adapts the rendering to the container's size.

附录:正如@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();
            }
        });
    }
}

回答by Pr?riewolf

Use Minueto.

使用Minueto

回答by Viesturs

Try something like this:

尝试这样的事情:

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

You can also override the paint method in the frame class, but then the you would have to calculate in the size of the window decorations and it gets dirty there...

您还可以覆盖框架类中的paint方法,但是您必须计算窗口装饰的大小并且它在那里变脏......

回答by mhcuervo

I recommend to take some time to review the "midpoint circle algorithm or Bresenham's circle algorithm". The accepted solution is based on very costly math operations like float multiplication and trigonometric functions.

我建议花一些时间来复习一下“中点圆算法或 Bresenham 圆算法”。公认的解决方案基于非常昂贵的数学运算,如浮点乘法和三角函数。