Hallo
Ich hätte eine Frage bezüglich eines Problems wo ich keinen Plan habe wie man es lösen könnte.
Es geht um das Anordnen von Rechtecken im 2D Raum.
public class Item{
int xPos,yPos,height,width;
}
Ich generiere mir dann 150 normal verteilte Items.
Zu Test zwecken mappe ich dann alle Items auf ein Array. dabei wird jeder index um 1 inkrementiert wenn es belegt ist.
Das Ziel:
-Keine Überlappungen
-Jedes Item soll an mindestens einer Stelle mit einem anderen zusammentreffen.
Achtung: Ich versuche nicht den Array zu minimieren. Es sollten immer noch Freiräume zwischen den Items bestehen bleiben.
Hier ist Testprogrammchen:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package test;
import java.util.ArrayList;
import java.util.Random;
/**
*
* @author MichaelZuegg
*/
public class Test {
public static void main(String[] args) {
Test test = new Test();
test.generate();
}
public void generate() {
DungeonGenerator generator = new DungeonGenerator(100, 5, 6, 20);
generator.generate(2);
generator.map2Array();
}
class GaussianRandom {
int seed;
int mean;
int variance;
Random random;
public GaussianRandom(int seed, int mean, int variance) {
this.seed = seed;
this.mean = mean;
this.variance = variance;
random = new Random(seed);
}
public int getNextInteger() {
double retval = (this.mean + random.nextGaussian() * this.variance);
//System.out.println(retval);
return (int) retval;
}
}
class Room {
public int xPos, yPos, zPos;
public int height, width;
public Room(int xPos, int yPos, int height, int width) {
this.xPos = xPos;
this.yPos = yPos;
this.height = height;
this.width = width;
}
}
class DungeonGenerator {
int roomCount;
int roomSizeAvg;
int roomSizeDev;
int mapSize;
ArrayList<Room> rooms;
public DungeonGenerator(int roomCount, int roomSizeAvg, int roomSizeDev, int mapSize) {
this.roomCount = roomCount;
this.roomSizeAvg = roomSizeAvg;
this.roomSizeDev = roomSizeDev;
this.mapSize = mapSize;
rooms = new ArrayList<>();
}
public void generate(int seed) {
GaussianRandom roomGenerator = new GaussianRandom(seed, this.roomSizeAvg, this.roomSizeDev);
GaussianRandom positionGenerator = new GaussianRandom(seed, 0, this.mapSize);
for (int i = 0; i < this.roomCount; i++) {
//System.out.println("Generate Room: " + i);
this.rooms.add(new Room(positionGenerator.getNextInteger(), positionGenerator.getNextInteger(), Math.abs(roomGenerator.getNextInteger()), Math.abs(roomGenerator.getNextInteger())));
}
System.out.println("Generated " + this.rooms.size() + " rooms");
}
public void map2Array() {
int minX = Integer.MAX_VALUE;
int maxX = Integer.MIN_VALUE;
int minY = Integer.MAX_VALUE;
int maxY = Integer.MIN_VALUE;
for (Room r : this.rooms) {
System.out.println(r.xPos);
minX = Math.min(minX, r.xPos - r.width);
maxX = Math.max(maxX, r.xPos + r.width);
minY = Math.min(minY, r.yPos - r.height);
maxY = Math.max(maxY, r.yPos + r.height);
}
System.out.println("MapSize: " + (maxX - minX) + ":" + (maxY - minY));
int array[][] = new int[maxX - minX][maxY - minY];
for (Room r : this.rooms) {
for (int x = r.xPos - r.width; x < r.xPos + r.width; x++) {
for (int y = r.yPos - r.height; y < r.yPos + r.height; y++) {
array[x - minX][y - minY] += 1;
}
}
}
for (int x = 0; x < array.length; x++) {
for (int y = 0; y < array[x].length; y++) {
System.out.print(array[x][y]);
}
System.out.println();
}
}
}
}
Danke schonmal an alle die drüber nachdenken. Bin für jeden Lösungsansatz dankbar.