Advertisement
Guest User

Untitled

a guest
Jul 4th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.17 KB | None | 0 0
  1. private static final float AMPLITUDE = 8f;
  2. private static final int OCTAVES = 6;
  3. private static final float ROUGHNESS = 0.3f;
  4.  
  5. private Random random = new Random();
  6. private int seed;
  7. private int xOffset = 0;
  8. private int zOffset = 0;
  9.  
  10. public TerrainPerlinNoise(Random rand, float roughness, float width, float height) {
  11. random = (rand == null) ? new Random() : rand;
  12. this.seed = random.nextInt(1000000000);
  13. }
  14.  
  15. public float generateHeight(int x, int z) {
  16. float total = 0;
  17. float d = (float) Math.pow(2, OCTAVES-1);
  18. for(int i=0;i<OCTAVES;i++){
  19. float freq = (float) (Math.pow(2, i) / d);
  20. float amp = (float) Math.pow(ROUGHNESS, i) * AMPLITUDE;
  21. total += getInterpolatedNoise((x+xOffset)*freq, (z + zOffset)*freq) * amp;
  22. }
  23. return total;
  24. }
  25.  
  26. private float getInterpolatedNoise(float x, float z){
  27. int intX = (int) x;
  28. int intZ = (int) z;
  29. float fracX = x - intX;
  30. float fracZ = z - intZ;
  31.  
  32. float v1 = getSmoothNoise(intX, intZ);
  33. float v2 = getSmoothNoise(intX + 1, intZ);
  34. float v3 = getSmoothNoise(intX, intZ + 1);
  35. float v4 = getSmoothNoise(intX + 1, intZ + 1);
  36. float i1 = interpolate(v1, v2, fracX);
  37. float i2 = interpolate(v3, v4, fracX);
  38. return interpolate(i1, i2, fracZ);
  39. }
  40.  
  41. private float interpolate(float a, float b, float blend){
  42. double theta = blend * Math.PI;
  43. float f = (float)(1f - Math.cos(theta)) * 0.5f;
  44. return a * (1f - f) + b * f;
  45. }
  46.  
  47. private float getSmoothNoise(int x, int z) {
  48. float corners = (getNoise(x - 1, z - 1) + getNoise(x + 1, z - 1) + getNoise(x - 1, z + 1)
  49. + getNoise(x + 1, z + 1)) / 16f;
  50. float sides = (getNoise(x - 1, z) + getNoise(x + 1, z) + getNoise(x, z - 1)
  51. + getNoise(x, z + 1)) / 8f;
  52. float center = getNoise(x, z) / 4f;
  53. return corners + sides + center;
  54. }
  55.  
  56. private float getNoise(int x, int z) {
  57. random.setSeed(x * 49632 + z * 325176 + seed);
  58. return random.nextFloat() * 2f - 1f;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement