Странная трехмерная процедурная выработкаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Странная трехмерная процедурная выработка

Сообщение Anonymous »

Итак, в течение последних нескольких дней я работал над созданием процедурной программы генерации, написанной на Java, однако всякий раз, когда я делаю вывод, она выпускается с промытой бумажной текстурой. Я не понимаю почему это делает это, и хотя это довольно круто, мне было интересно, может ли кто -нибудь объяснить мне, как моя программа достигает этого результата. src = "https://i.sstatic.net/mjkod.jpg"/>
Источник: (http://pastebin.com/frch03vw)
package com.arkazex.terrain.HGEN2;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import java.util.Scanner;

import javax.imageio.ImageIO;

public class Main {

private static long seed;
private static long seed2;
private static int mshift;
private static int dimx;
private static int dimy;

private static int[][] map;
private static long[] seeds;
private static int[] offset;

public static void main(String[] args) {
//Collect values
Scanner in = new Scanner(System.in);
System.out.print("Enter first seed: ");
seed = in.nextLong();
System.out.print("Enter second seed: ");
seed2 = in.nextLong();
System.out.print("Enter Maximum shift: ");
mshift = in.nextInt();
System.out.print("Enter dimension X: ");
dimx = in.nextInt();
System.out.print("Enter dimension Y: ");
dimy = in.nextInt();

map = new int[dimx][dimy];
seeds = new long[dimy];
offset = new int[dimy];

System.out.println("Generating seed map...");
generateSeeds();

System.out.println("Generating initial terrain...");
generateInitialTerrain();

System.out.println("Generating offsets...");
generateStartingOffset();

System.out.println("Generating layers...");
for(int i = 1; i < dimy; i++) {
generateLayer(i);
}

System.out.println("Finishing...");
finish();

in.close();
System.out.println("Complete!");
}

private static void generateSeeds() {
Random rand = new Random(seed);
for(int i = 1; i < dimy; i++) {
seeds = rand.nextLong();
}
}

private static void generateInitialTerrain() {
int last = 0;
Random rand = new Random(seed2);
map[0][0] = 0;
for(int i = 0; i < dimx; i++) {
int off = rand.nextInt(mshift);
boolean flip = rand.nextBoolean();
if(flip) {
off = 0 - off;
}
last = last + off;
if(last > 255) {
last = 255;
}
if(last < 0) {
last = 0;
}
map[0] = last;
}
}

private static void generateStartingOffset() {
int last = 0;
Random rand = new Random(seeds[0]);
for(int i = 0; i < dimy; i++) {
int off = rand.nextInt(mshift);
boolean flip = rand.nextBoolean();
if(flip) {
off = 0 - off;
}
last = last + off;
if(last > 255) {
last = 255;
}
if(last < 0) {
last = 0;
}
offset = last;
}
}

private static void generateLayer(int x) {
int last = offset[x];
int res = 0;
Random rand = new Random(seeds[x]);
for(int i = 0; i < dimx; i++) {
boolean valid = false;
while(!valid) {
int off = rand.nextInt(mshift);
boolean flip = rand.nextBoolean();
if(flip) {
off = 0 - off;
}
res = last + off;
if(!(res > map[x - 1] + mshift || res < map[x - 1] - mshift)) {
valid = true;
}
}

last = res;

if(last > 255) {
last = 255;
}
if(last < 0) {
last = 0;
}
map[x] = last;
}
}

private static void finish() {
BufferedImage image = new BufferedImage(dimx, dimy, BufferedImage.TYPE_INT_RGB);
for(int x = 0; x < dimx; x++) {
for(int y = 0; y < dimy; y++) {
image.setRGB(x, y, getRGB(map[x][y]));
}
}
File file = new File("Output.png");
try {
file.createNewFile();
ImageIO.write(image, "png", file);
} catch (IOException e) {
System.out.println("Failed to save image");
}
}

private static int getRGB(int value) {
String raw = null;
try {
String hex = Integer.toHexString(value);
if(hex.length() == 1) {
hex = 0 + hex;
}
raw = "0xFF" + hex + hex + hex;
} catch (Exception e) {
}
return castLong(Long.decode(raw));
}

public static int castLong(long value) {
return (int) value;
}
}


Подробнее здесь: https://stackoverflow.com/questions/190 ... ion-output
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»