我正在创建一个图形显示来显示用户是否正在接近危险区域。为此我使用的是类似于射箭板的显示器。想法是从中心开始,但随着用户越来越接近危险区域,进入橙色区域。一旦用户打破“安全阈值”,进入红色区域。我的想法是根据用户给我的价值在板上画一个点。 为了绘制这个板,我做了以下几点。
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
但是,我认为由于椭圆形状,这不起作用。
如果有人能告诉我如何找到每个椭圆形所覆盖的像素范围,我将非常感激。
答案 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