Java,为什么我的图形会从它们所应用的帧/范围中抽出?

时间:2013-03-20 13:28:21

标签: java swing graphics jframe

所以,我正在制作一个程序,当前在大小为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()); 
        }

   }
}

2 个答案:

答案 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)开始到宽度 - 直径。