public Coord3D onUnitShape3D(double distance, IRNG rng) { int x = 0, y = 0, z = 0; switch (this) { case SQUARE: case DIAMOND: case CIRCLE: case ROUGH_CIRCLE: Coord p = onUnitShape(distance, rng); return new Coord3D(p.x, p.y, 0);//2D strategies case CUBE: x = rng.between((int) -distance, (int) distance + 1); y = rng.between((int) -distance, (int) distance + 1); z = rng.between((int) -distance, (int) distance + 1); break; case OCTAHEDRON: case SPHERE: do { x = rng.between((int) -distance, (int) distance + 1); y = rng.between((int) -distance, (int) distance + 1); z = rng.between((int) -distance, (int) distance + 1); } while (radius(x, y, z) > distance); } return new Coord3D(x, y, z); } public double volume2D(double radiusLength)
return null; if(blocked.size() == 0) { return Coord.get(rng.between(minPosition.x, maxPosition.x), rng.between(minPosition.y, maxPosition.y)); int x = rng.between(minPosition.x, maxPosition.x), y = rng.between(minPosition.y, maxPosition.y); for(int i = 0; i < (width + height) / 4; i++) x = rng.between(minPosition.x, maxPosition.x); y = rng.between(minPosition.y, maxPosition.y);
y = rng.between(room.y + 1, room.y + room.height); x = room.x - 1; map[x][y] = Terrain.CLOSED_DOOR; break; case RIGHT: y = rng.between(room.y + 1, room.y + room.height); x = room.x + room.width; map[x][y] = Terrain.CLOSED_DOOR; break; case UP: x = rng.between(room.x + 1, room.x + room.width); y = room.y - 1; map[x][y] = Terrain.CLOSED_DOOR; break; case DOWN: x = rng.between(room.x + 1, room.x + room.width); y = room.y + room.height; map[x][y] = Terrain.CLOSED_DOOR;
case SQUARE: case CUBE: x = rng.between((int) -distance, (int) distance + 1); y = rng.between((int) -distance, (int) distance + 1); break; case DIAMOND: case OCTAHEDRON: x = rng.between((int) -distance, (int) distance + 1); y = rng.between((int) -distance, (int) distance + 1); if (radius(x, y) > distance) { if (x > 0) { default: // includes CIRCLE, SPHERE, and ROUGH_CIRCLE double radius = distance * Math.sqrt(rng.nextDouble()); double theta = rng.between(0, PI2); x = (int) Math.round(NumberTools.cos(theta) * radius); y = (int) Math.round(NumberTools.sin(theta) * radius);
Coord temp = CoordPacker.mooreToCoord(m), next; temp = Coord.get(columns[temp.x], rows[temp.y]); for (int i = 0, r; i < 256; r = rng.between(4, 12), i += r, m += r) { next = CoordPacker.mooreToCoord(m); next = Coord.get(columns[next.x], rows[next.y]);
for (int i = 0, m = random.nextInt(64), r; i < 256; r = random.between(4, 12), i += r, m += r) { temp = CoordPacker.mooreToCoord(m); points.add(Coord.get(columns[temp.x], rows[temp.y]));
Coord[] vl = new Coord[ct]; double[] vec = new double[2]; sobol.skipTo(rng.between(1000, 65000)); EACH_SOBOL: for (int i = 0; i < ct; i++)
/** * Creates a pip that falls within the required distance from the current * distribution. Does not add the pip to the distribution. * * @return the created pip */ public Coord createPoint() { Coord randomPoint = randomPoint(); Coord nearestPoint = nearestPoint(randomPoint); double pointDistance = randomPoint.distance(nearestPoint); // Too close, toss while (pointDistance < minDistance) { randomPoint = randomPoint(); nearestPoint = nearestPoint(randomPoint); pointDistance = randomPoint.distance(nearestPoint); } // Adjust if we're too far if (pointDistance > maxDistance) { // Calculate unit vector double unitX = (randomPoint.x - nearestPoint.x) / pointDistance; double unitY = (randomPoint.y - nearestPoint.y) / pointDistance; randomPoint = Coord.get( (int) (rng.between(minDistance, maxDistance + 1) * unitX + nearestPoint.x) , (int) (rng.between(minDistance, maxDistance + 1) * unitY + nearestPoint.y)); } return randomPoint; }
z = (int)Math.floor(CoordPacker.getZMoore3D(m, numLayers) * depth / (8f * numLayers)), sx = x, sy = y, sz = z, tz = z; int r = random.between(12, 33); m += r; for (int i = 0; i < 0x800 * numLayers; r = random.between(12, 33), i += r, m = (m + r) % (0x800 * numLayers)) { tz = z; int tx = x, ty = y; j < 2; j++) { int x2 = random.between(Math.max(0, tx - 2), tx); int x3 = random.between(tx + 1, Math.min(tx + 3, 15)); int y2 = random.between(Math.max(0, ty - 2), ty); int y3 = random.between(ty + 1, Math.min(ty + 3, 15)); if (x3 < 16 && random.nextBoolean()) x2 = x3; j < 2; j++) { int x2 = random.between(Math.max(0, x - 2), x); int x3 = random.between(x + 1, Math.min(x + 3, 15)); int y2 = random.between(Math.max(0, y - 2), y); int y3 = random.between(y + 1, Math.min(y + 3, 15)); if (x3 < 16 && random.nextBoolean()) x2 = x3;
int m = random.nextInt(64), r = random.between(4, 12); temp = CoordPacker.mooreToCoord(m); Coord starter = CoordPacker.mooreToCoord(m); cl.add(Coord.get(columns[temp.x], rows[temp.y])); temp = CoordPacker.mooreToCoord(m); r = random.between(4, 12); for (int j = 0, p = r - 1; j < 3 && p > 2 && Math.min(random.nextDouble(), random.nextDouble()) < branchingChance; j++, p -= random.between(1, p)) { t = CoordPacker.mooreToCoord(m + p); cl.add(Coord.get(columns[t.x], rows[t.y]));
while (frustration < 10) { shift = rng.nextDouble(2048); shift2 = rng.between(4096, 8192); ctr = 0; for (int x = 0; x < width; x++) {
int m = random.nextInt(32), r = random.between(8, 24); temp = CoordPacker.hilbertToCoord(m); Coord starter = CoordPacker.hilbertToCoord(m); cl.add(Coord.get(columns[temp.x], rows[temp.y])); temp = CoordPacker.hilbertToCoord(m); r = random.between(8, 24); for (int j = 0, p = r - 1; j < 3 && p > 2 && Math.min(random.nextDouble(), random.nextDouble()) < 0.2; j++, p -= random.between(1, p)) { t = CoordPacker.hilbertToCoord(m + p); cl.add(Coord.get(columns[t.x], rows[t.y]));
break; case BOX: markRectangle(end, rng.between(1, 5), rng.between(1, 5)); markRectangle(start, rng.between(1, 4), rng.between(1, 4)); store(); dir = Direction.getDirection(end.x - start.x, end.y - start.y); markRectangleWalled(end, rng.between(1, 5), rng.between(1, 5)); markRectangleWalled(start, rng.between(1, 4), rng.between(1, 4)); store(); dir = Direction.getDirection(end.x - start.x, end.y - start.y); markCircle(end, rng.between(2, 6)); markCircle(start, rng.between(2, 6)); store(); dir = Direction.getDirection(end.x - start.x, end.y - start.y); markCircleWalled(end, rng.between(2, 6)); markCircleWalled(start, rng.between(2, 6)); store(); dir = Direction.getDirection(end.x - start.x, end.y - start.y);