如何在给定的X和Y坐标作为圆心画圆?

25

我开发了一款电信应用程序,用于定位塔的信号强度。我使用了Java Swing,在画移动信号发射塔位置周围的圆时遇到了问题。我已经计算出了X、Y坐标以及半径值。

请查看下面的代码,我用它来画圆,但有问题。

JPanel panelBgImg = new JPanel() {
    public void paintComponent(Graphics g) {
        g.drawOval(X, Y, r, r);
    }
}
问题在于,它创建的圆并没有将X和Y坐标作为圆心点,而是将X和Y坐标视为圆的左上角点。
请问是否有人能够帮助我通过将给定的X和Y坐标作为圆的中心点来绘制圆形。
9个回答

47

fillOval用于在矩形内绘制一个椭圆,当宽度为r,高度为r时,你将得到一个圆形。如果你想让fillOval(x,y,r,r)以点(x,y)为圆心绘制一个圆形,你需要将矩形向左上方平移一半宽度和一半高度。

public void drawCenteredCircle(Graphics2D g, int x, int y, int r) {
  x = x-(r/2);
  y = y-(r/2);
  g.fillOval(x,y,r,r);
}

这将在以x,y为中心绘制一个圆。


8
注意到 OP 在使用 r(半径)作为伪 d(直径)。文档中的参数标记为 wh - Andrew Thompson
这个答案是错误的。它确实在(x,y)处绘制了一个椭圆作为中心,但半径是错误的。请使用Justin的答案! - UNIQUEorn

14

我们都在做同样的家庭作业吗?

奇怪的是,最受欢迎的答案是错误的。请记住,draw/fillOval函数将高度和宽度作为参数,而不是半径。因此,要正确地绘制和居中带有用户提供的x、y和半径值的圆形,您可以像这样执行:

public static void drawCircle(Graphics g, int x, int y, int radius) {

  int diameter = radius * 2;

  //shift x and y by the radius of the circle in order to correctly center it
  g.fillOval(x - radius, y - radius, diameter, diameter); 

}

1
“最高票答案错了”这句话有些奇怪。其实并没有错,只是回答者使用字母“r”作为直径,而OP将其命名为高度和宽度。 - AirlineDog

6

用以下代码替换你的绘图代码:

g.drawOval(X - r, Y - r, r, r)

这应该使得你的圆形左上角成为正确的位置,以使中心点为(X,Y),至少只要点(X - r,Y - r)的两个分量都在范围内。


1
我非常确定,即使左上角超出范围,它也能正常工作。 - Cruncher
我从未尝试过在屏幕外绘制东西,所以我会相信你的话。但是,如果角落在范围内,它确实可以工作。 - qaphla
我同意@Cruncher的观点。 - An SO User

3
drawCircle(int X, int Y, int Radius, ColorFill, Graphics gObj) 

5
欢迎来到 Stack Overflow!我建议您 参加一下导览。在回答问题时,最好给出一些解释,说明为什么你的答案是正确的。 - Stephen Rauch

2
JPanel pnlCircle = new JPanel() {
        public void paintComponent(Graphics g) {
            int X=100;
            int Y=100;
            int d=200;
            g.drawOval(X, Y, d, d);
        }
};

您可以根据需要更改X、Y坐标和半径。


1
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Graphics;
import javax.swing.JFrame;

public class Graphiic
{   
    public Graphics GClass;
    public Graphics2D G2D;
    public  void Draw_Circle(JFrame jf,int radius , int  xLocation, int yLocation)
    {
        GClass = jf.getGraphics();
        GClass.setPaintMode();
        GClass.setColor(Color.MAGENTA);
        GClass.fillArc(xLocation, yLocation, radius, radius, 0, 360);
        GClass.drawLine(100, 100, 200, 200);    
    }

}

1

两个答案都是不正确的。应该是:

x-=r;
y-=r;


drawOval(x,y,r*2,r*2);

1

这将在指定矩形中心绘制弧形。您可以绘制半圆、四分之一圆等。

g.drawArc(x - r, y - r, r * 2, r * 2, 0, 360)

0

对我来说,唯一有效的方法是:

g.drawOval((getWidth()-200)/2,(getHeight()-200)/2, 200, 200);    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接