所以,我正在制作一个程序,当前在大小为1024x768的JFrame上随机绘制一个随机大小(在6-9之间)的实心圆圈。我遇到的问题是,即使我在规则中编码以确保所有圆圈都在1024x768 JFrame内,圆圈也会落在所需的边界之外。以下是应为每个圆圈生成正确位置的代码段:
private static KillZoneLocation generateLocation(){
int genX,genY;
int xmax = 1024 - generatedGraphic.getRadius();
int ymax = 768 - generatedGraphic.getRadius();
KillZoneLocation location = new KillZoneLocation();
do{
genX = generatedGraphic.getRadius() + (int)(Math.random()*xmax);
genY = generatedGraphic.getRadius() +(int)(Math.random()*ymax);
location.setXcoord(genX);
location.setYcoord(genY);
generatedLocation = location;
}while(isOverlaping(location));
return location;
}
generatedGraphic是包含上述方法的类的全局变量,返回6到9之间的数字
generatedGraphic.getRadius()从此算法返回一个随机数int radius = 7 +(int)(Math.random()* 9);该数字先前已通过其他方法生成。这种方法只是一个吸气剂。每次调用此方法时都不会生成半径数。
isOverlaping(locations)只是检查以确保圆圈不会与已放置在JFrame上的另一个圆圈重叠。
location.set ...这些只是setter方法。
我认为这只是一个愚蠢的逻辑错误,但我似乎无法弄清楚为什么圆圈在框架之外打印。
我故意避免发布任何代码,因为它会让你感到困惑,因为程序有一个比我描述的范围大得多的范围,并且有十几个文件全部交错。我调试了这段代码并实现了返回的数字: genX = generatedGraphic.getRadius()+(int)(Math.random()* xmax); genY = generatedGraphic.getRadius()+(int)(Math.random()* ymax);
返回超出范围的数字。
画班:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class KillZoneGUI extends JFrame{
public KillZoneGUI(){
setSize(1024,768);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String s[]) {
GenerateKillZone.setup(1024,768);
new KillZoneGUI();
}
public void paint(Graphics g){
for(Robot r: KillZone.getRobots()){
g.setColor(r.getGraphic().getColor());
g.fillOval(
r.getLocation().getXcoord(),
r.getLocation().getYcoord(),
r.getGraphic().getRadius(),
r.getGraphic().getRadius());
}
}
}
答案 0 :(得分:1)
正确的代码应该是
genX = (int)(Math.random()*xmax);
genY = (int)(Math.random()*ymax);
请记住,Graphics2D.fillOval()将使用genX / genY作为左上角,椭圆将延伸getRadius()的值。你减去了半径的大小,然后再将它加回两次!一旦进入genX / Y分配,一次绘制椭圆。
答案 1 :(得分:0)
int xmax = 1024 - 2 * generatedGraphic.getRadius();
int ymax = 768 - 2 * generatedGraphic.getRadius();
当你从generatedGraphic.getRadius()开始时;并且可能只会达到xmax / ymax。
然后使用@JasonNichols的答案,fillOval从(左,上)(0,0)开始到宽度 - 直径。