我正在创建一个图形显示,以显示用户是否正在接近危险区域。为此,我正在使用类似于射箭板的显示器。这个想法是从中间开始,但是当用户离危险区域越来越近时,进入橙色区域。一旦用户违反“安全阈值”,请进入红色区域。我的想法是根据用户给我的价值在板上画点。
要绘制此板,请执行以下操作。

Graphics2D g2d = (Graphics2D) bs.getDrawGraphics();
g2d.setColor(Color.white);
        g2d.fillRect(0, 0, 800, 600); //set screen to white
g2d.setColor(Color.red);
    g2d.fillOval(250, 250, 175, 175); //draw outerlayer of board as red
    g2d.setColor(Color.black);
    g2d.drawOval(250, 250, 175, 175);//give this red an outline
    g2d.setColor(Color.orange);
    g2d.fillOval(275, 275, 125, 125); //draw innerlayer as orange
    g2d.setColor(Color.black);
    g2d.drawOval(275, 275, 125, 125);//give this orange an outline
    g2d.setColor(Color.green);
    g2d.fillOval(300, 300, 75, 75); //draw innermost layer as green
    g2d.setColor(Color.black);
    g2d.drawOval(300, 300, 75, 75); //give the green an outline


首先,我可能可以改善这一点,但这不是目前的主要问题。

相反,我的问题是准确找到电路板各部分所覆盖的像素。
 我一直在使用x +(width / 2),y +(height / 2)来获取中心点
因此使用:

g2d.drawString(String.valueOf("X"), 338, 338);


绘制我的绿色椭圆形的中心点。这似乎不太准确,但无论如何。
我以为我可以简单地将外部边缘作为x,y坐标,而将内部边缘作为x + h,y + width坐标:

g2d.drawOval(500, 500, 75, 75);
g2d.drawString(String.valueOf("X"), 537, 537); //centre???
g2d.drawString(String.valueOf("X"), 575, 575); //inneredge?x+width, y+height
g2d.drawString(String.valueOf("X"), 500, 500); //outer edge x+y co-ords


但是,我认为由于椭圆形这是行不通的。

如果有人可以告诉我如何找到每个椭圆形覆盖的像素范围,我将不胜感激。

编辑:下面是我正在使用的板,是否有可能找到每种颜色(红色,橙色,绿色)的像素范围?
java - 在Java Canvas中查找椭圆形覆盖的像素-LMLPHP

最佳答案

了解更多您想要的东西,这是窍门(使用trigonometry):

int force = ...; // from 0 to 250
int radius = ...; // radius of the target (50 for example)
int centerX = ...; // X-coordinate of the center of the target
int centerY = ...; // Y-coordinate of the center of the target
double direction = Math.toRadians(Math.random() * 360); // a random angle between 0° and 360°
double x = (force * radius / 250.0d) * Math.cos(direction) + centerX; // X-coordinate of the new point
double y = (force * radius / 250.0d) * Math.sin(direction) + centerY; // Y-coordinate of the new point
Point2D point = new Point2D.Double(x,y); // Then you can plot this point on your target

10-05 22:22