Advertisement
Arkazex

3D Heightmap Generator

Sep 27th, 2013
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.76 KB | None | 0 0
  1. package com.arkazex.terrain.HGEN2;
  2.  
  3. import java.awt.image.BufferedImage;
  4. import java.io.File;
  5. import java.io.IOException;
  6. import java.util.Random;
  7. import java.util.Scanner;
  8.  
  9. import javax.imageio.ImageIO;
  10.  
  11. public class Main {
  12.  
  13.     private static long seed;
  14.     private static long seed2;
  15.     private static int mshift;
  16.     private static int dimx;
  17.     private static int dimy;
  18.    
  19.     private static int[][] map;
  20.     private static long[] seeds;
  21.     private static int[] offset;
  22.    
  23.     public static void main(String[] args) {
  24.         //Collect values
  25.         Scanner in = new Scanner(System.in);
  26.         System.out.print("Enter first seed: ");
  27.         seed = in.nextLong();
  28.         System.out.print("Enter second seed: ");
  29.         seed2 = in.nextLong();
  30.         System.out.print("Enter Maximum shift: ");
  31.         mshift = in.nextInt();
  32.         System.out.print("Enter dimension X: ");
  33.         dimx = in.nextInt();
  34.         System.out.print("Enter dimension Y: ");
  35.         dimy = in.nextInt();
  36.        
  37.         map = new int[dimx][dimy];
  38.         seeds = new long[dimy];
  39.         offset = new int[dimy];
  40.        
  41.         System.out.println("Generating seed map...");
  42.         generateSeeds();
  43.        
  44.         System.out.println("Generating initial terrain...");
  45.         generateInitialTerrain();
  46.        
  47.         System.out.println("Generating offsets...");
  48.         generateStartingOffset();
  49.        
  50.         System.out.println("Generating layers...");
  51.         for(int i = 1; i < dimy; i++) {
  52.             generateLayer(i);
  53.         }
  54.        
  55.         System.out.println("Finishing...");
  56.         finish();
  57.        
  58.         in.close();
  59.         System.out.println("Complete!");
  60.     }
  61.    
  62.     private static void generateSeeds() {
  63.         Random rand = new Random(seed);
  64.         for(int i = 1; i < dimy; i++) {
  65.             seeds[i] = rand.nextLong();
  66.         }
  67.     }
  68.    
  69.     private static void generateInitialTerrain() {
  70.         int last = 0;
  71.         Random rand = new Random(seed2);
  72.         map[0][0] = 0;
  73.         for(int i = 0; i < dimx; i++) {
  74.             int off = rand.nextInt(mshift);
  75.             boolean flip = rand.nextBoolean();
  76.             if(flip) {
  77.                 off = 0 - off;
  78.             }
  79.             last = last + off;
  80.             if(last > 255) {
  81.                 last = 255;
  82.             }
  83.             if(last < 0) {
  84.                 last = 0;
  85.             }
  86.             map[i][0] = last;
  87.         }
  88.     }
  89.    
  90.     private static void generateStartingOffset() {
  91.         int last = 0;
  92.         Random rand = new Random(seeds[0]);
  93.         for(int i = 0; i < dimy; i++) {
  94.             int off = rand.nextInt(mshift);
  95.             boolean flip = rand.nextBoolean();
  96.             if(flip) {
  97.                 off = 0 - off;
  98.             }
  99.             last = last + off;
  100.             if(last > 255) {
  101.                 last = 255;
  102.             }
  103.             if(last < 0) {
  104.                 last = 0;
  105.             }
  106.             offset[i] = last;
  107.         }
  108.     }
  109.    
  110.     private static void generateLayer(int x) {
  111.         int last = offset[x];
  112.         int res = 0;
  113.         Random rand = new Random(seeds[x]);
  114.         for(int i = 0; i < dimx; i++) {
  115.             boolean valid = false;
  116.             while(!valid) {
  117.                 int off = rand.nextInt(mshift);
  118.                 boolean flip = rand.nextBoolean();
  119.                 if(flip) {
  120.                     off = 0 - off;
  121.                 }
  122.                 res = last + off;
  123.                 if(!(res > map[i][x - 1] + mshift || res < map[i][x - 1] - mshift)) {
  124.                     valid = true;
  125.                 }
  126.             }
  127.            
  128.             last = res;
  129.            
  130.             if(last > 255) {
  131.                 last = 255;
  132.             }
  133.             if(last < 0) {
  134.                 last = 0;
  135.             }
  136.             map[i][x] = last;
  137.         }
  138.     }
  139.    
  140.     private static void finish() {
  141.         BufferedImage image = new BufferedImage(dimx, dimy, BufferedImage.TYPE_INT_RGB);
  142.         for(int x = 0; x < dimx; x++) {
  143.             for(int y = 0; y < dimy; y++) {
  144.                 image.setRGB(x, y, getRGB(map[x][y]));
  145.             }
  146.         }
  147.         File file = new File("Output.png");
  148.         try {
  149.             file.createNewFile();
  150.             ImageIO.write(image, "png", file);
  151.         } catch (IOException e) {
  152.             System.out.println("Failed to save image");
  153.         }
  154.     }
  155.    
  156.     private static int getRGB(int value) {
  157.         String raw = null;
  158.         try {
  159.             String hex = Integer.toHexString(value);
  160.             if(hex.length() == 1) {
  161.                 hex = 0 + hex;
  162.             }
  163.             raw = "0xFF" + hex + hex + hex;
  164.         } catch (Exception e) {
  165.         }
  166.         return castLong(Long.decode(raw));
  167.     }
  168.    
  169.     public static int castLong(long value) {
  170.         return (int) value;
  171.     }
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement