在 Java Canvas 中查找被椭圆覆盖的像素

Finding pixels covered by an oval in Java Canvas

我正在创建一个图形显示来显示用户是否正在接近危险区域。为此我使用了类似于射箭板的显示。这个想法是从中心开始,但随着用户越来越接近危险区域,进入橙色区域。一旦用户打破 'safety threshold' 进入红色区域。我的想法是根据用户给我的价值在黑板上画一个点。 要绘制此板,我将执行以下操作。

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+height、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

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

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

编辑:下面是我正在使用的板,是否可以找到每种颜色(红色、橙色、绿色)的像素范围?

你所有的椭圆看起来都是圆。那么,让我们创建一个圆形模型 class.

您可以从 JPanel paintComponent 方法中调用 draw 方法。

当您想查看某个点是在圆内还是在圆的边缘时,您可以调用 contains 方法。

您将跟踪列表中的所有圈子,因此您可以保持圈子的顺序。

package com.ggl.testing;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;

public class Circle {

    private final int radius;
    private final Color color;
    private final Point location;

    public Circle(int x, int y, int radius, Color color) {
        this.location = new Point(x, y);
        this.radius = radius;
        this.color = color;
    }

    public boolean contains(int x, int y) {
        double distance = Point.distance(x, y, location.x, location.y);
        double radiusD = radius;
        if (radiusD >= distance) {
            return true;
        } else {
            return false;
        }
    }

    public void draw(Graphics g) {
        g.setColor(color);
        g.fillOval(location.x - radius, location.y - radius, radius + radius,
                radius + radius);
    }
}

为每个区域使用具体的 Ellipse2D。然后你可以使用 g2d.fill() 来绘制区域。由于 Ellipse2D 也是 Shape,您可以使用 contains(Point2D p) 方法检查点是否在边界内。由于圆圈重叠,您必须按从前到后的顺序检查它们。

进一步了解你想要什么,这是诀窍(使用 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