在 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
我正在创建一个图形显示来显示用户是否正在接近危险区域。为此我使用了类似于射箭板的显示。这个想法是从中心开始,但随着用户越来越接近危险区域,进入橙色区域。一旦用户打破 '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