在Java Canvas

时间:2015-07-22 12:22:57

标签: java swing canvas area

我正在创建一个图形显示来显示用户是否正在接近危险区域。为此我使用的是类似于射箭板的显示器。想法是从中心开始,但随着用户越来越接近危险区域,进入橙色区域。一旦用户打破“安全阈值”,进入红色区域。我的想法是根据用户给我的价值在板上画一个点。 为了绘制这个板,我做了以下几点。

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 +(宽度/ 2),y +(高度/ 2)来获得中心点 因此使用:

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

绘制绿色椭圆的中心点。这似乎并不过分准确,但无论如何。 我以为我能够简单地将外边缘作为x,y co-ords,将内边缘作为x +高度,y +宽度合并为:

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

但是,我认为由于椭圆形状,这不起作用。

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

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

3 个答案:

答案 0 :(得分:3)

您的所有椭圆形似乎都是圆圈。所以,让我们创建一个Circle模型类。

您可以从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);
    }
}

答案 1 :(得分:3)

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

答案 2 :(得分:3)

了解更多你想要的东西,这是诀窍(使用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