Hab es jetzt hingekriegt. Vector2 hält einfach nur zwei floats, X, Y
[CODE lang="java" title="PoissonDiscSampling"]import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class PoissonDiscSampling {
public static List<Vector2> GeneratePoints(float radius, final Vector2 sampleRegionSize, int numSamplesBeforeRejection)
{
float cellSize = (float) (radius / Math.sqrt(2));
int[][] grid = new int[(int) (sampleRegionSize.x / cellSize)][(int) (sampleRegionSize.y / cellSize)];
List<Vector2> points = new ArrayList<Vector2>();
List<Vector2> spawnPoints = new ArrayList<Vector2>();
spawnPoints.add(new Vector2(sampleRegionSize.x / 2, sampleRegionSize.y / 2));
while (spawnPoints.size() > 0)
{
int spawnIndex = Utils.getRandom(0, spawnPoints.size() - 1);
Vector2 spawnCentre = spawnPoints.get(spawnIndex);
boolean candidateAccepted = false;
for (int i = 0; i < numSamplesBeforeRejection; i++)
{
float angle = (float) (new Random().nextFloat() * Math.PI * 2);
Vector2 dir = new Vector2(Math.sin(angle), Math.cos(angle));
Vector2 candidate = spawnCentre.add(dir.mul(Utils.getRandom(radius, 2 * radius)));
if (IsValid(candidate, sampleRegionSize, cellSize, radius, points, grid))
{
points.add(candidate);
spawnPoints.add(candidate);
try {
grid[(int)(candidate.x / cellSize)][(int)(candidate.y / cellSize)] = points.size();
} catch (Exception e) {}
candidateAccepted = true;
break;
}
}
if (!candidateAccepted)
{
spawnPoints.remove(spawnIndex);
}
}
return points;
}
static boolean IsValid(Vector2 candidate, Vector2 sampleRegionSize, float cellSize, float radius, List<Vector2> points, int[][] grid)
{
if (candidate.x >= 0 && candidate.x < sampleRegionSize.x && candidate.y >= 0 && candidate.y <= sampleRegionSize.y)
{
int cellX = (int)(candidate.x / cellSize);
int cellY = (int)(candidate.y / cellSize);
int searchStartX = Math.max(0, cellX - 2);
int searchEndX = Math.min(cellX + 2, grid.length - 2);
int searchStartY = Math.max(0, cellY - 2);
int searchEndY = Math.min(cellY + 2, grid.length - 2);
for (int x = searchStartX; x <= searchEndX; x++)
{
for (int y = searchStartY; y <= searchEndY; y++)
{
int pointIndex = -1;
try {
pointIndex = grid[x][y] - 1;
} catch (Exception e) {}
if (pointIndex != -1)
{
float sqrDst = (candidate.sub(points.get(pointIndex))).magnitude();
sqrDst = (float) Math.sqrt(sqrDst);
if (sqrDst < radius * radius)
{
return false;
}
}
}
}
return true;
}
return false;
}
}[/CODE]
[CODE lang="java" title="Meine Magnitude Lösung"]public float magnitude()
{
return (float)Math.sqrt(x*x + y*y);
}[/CODE]