2

そのため、現在、サイズ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の数値を返します。

generateGraphic.getRadius()は、このアルゴリズムから乱数を返しますint radius = 7 +(int)(Math.random()* 9); 番号は別の方法で事前に生成されています。このメソッドは単なるゲッターです。このメソッドが呼び出されるたびに半径番号が生成されるわけではありません。

isOverlaping(locations)は、円がJFrameに既に配置されている別の円と重なっていないことを確認するだけです。

location.set...これらは単なるセッターメソッドです。

これは単なるばかげた論理エラーだと思いますが、それでも円がフレームの外側に印刷されている理由を理解できないようです。

プログラムのスコープは私が説明したよりもはるかに大きく、すべてが絡み合っているファイルが12個あるため、混乱を招くため、意図的にコードを投稿することは避けています。私はこのコードをデバッグし、次のように返される数値を実現しました。genX = generateGraphic.getRadius()+(int)(Math.random()* xmax); genY = generateGraphic.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()); 
        }

   }
}
4

2 に答える 2

1

正しいコードは次のようになります

genX = (int)(Math.random()*xmax);
genY = (int)(Math.random()*ymax);

Graphics2D.fillOval()は左上隅にgenX / genYを使用し、楕円はgetRadius()の値だけ拡張されることに注意してください。半径のサイズを減算していますが、2回加算し直しています。genX / Yの割り当てに一度、そして楕円を描くときに一度。

于 2013-03-20T13:57:15.760 に答える
0
int xmax = 1024 - 2 * generatedGraphic.getRadius();
int ymax = 768 - 2 * generatedGraphic.getRadius();

生成されたGraphic.getRadius();から開始しているため。xmax/ymaxにのみ移動できます。

そして、@ JasonNicholsの答えを使用して、(left、top)(0、0)からwidth--diameterまでのfillOvalを使用します。

于 2013-03-20T13:53:18.167 に答える