Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.mygdx.game.Utils;
- import com.badlogic.gdx.math.Vector2;
- import com.mygdx.game.Utils.Bezier.*;
- import java.util.ArrayList;
- import java.util.Random;
- /**
- * Created by Ryuu on 15.06.2017.
- */
- public class PerlinNoise {
- public static PerlinNoise perlinNoise = new PerlinNoise();
- private final int SEED = 1245547;
- private final int OCTAVE = 10;
- public ArrayList<Vector2> generateMap(int width, int height) {
- float[][] whiteNoise = generateWhiteNoise(width, height);
- float[][] paralaNaiseX = generatePerlinNoise(whiteNoise, OCTAVE);
- Random random = new Random();
- return convertToVector2(paralaNaiseX, random.nextInt(height));
- }
- private float interpolate(float x0, float x1, float alpha) {
- return x0 * (1 - alpha) + alpha * x1;
- }
- private float[][] generateWhiteNoise(int width, int height) {
- Random random = new Random(SEED);
- float[][] noise = new float[width][height];
- for(int i = 0; i < width; i++) {
- for(int j = 0; j < height; j++) {
- noise[i][j] = (float)random.nextDouble() % 1;
- }
- }
- return noise;
- }
- private float[][] generateSmoothNoise(float[][] baseNoisem, int octave) {
- int width = baseNoisem.length;
- int height = baseNoisem[0].length;
- float[][] smoothNoise = new float[width][height];
- int samplePeriod = 1 ;
- float sampleFrequency = 1.0f;
- for (int i = 0 ; i < width; i++) {
- int sample_i0 = (i / samplePeriod) * samplePeriod;
- int sample_i1 = (sample_i0 + samplePeriod) % width;
- float horizontal_blend = (i - sample_i0) * sampleFrequency;
- for (int j = 0; j < height; j++) {
- int sample_j0 = (j / samplePeriod) * samplePeriod;
- int sample_j1 = (sample_j0 + samplePeriod) % height;
- float vertical_blend = (j - sample_j0) * sampleFrequency;
- float top = interpolate(baseNoisem[sample_i0][sample_j0], baseNoisem[sample_i1][sample_j0], horizontal_blend);
- float botton = interpolate(baseNoisem[sample_i0][sample_j1], baseNoisem[sample_i1][sample_j1], horizontal_blend);
- smoothNoise[i][j] = interpolate(top, botton, vertical_blend);
- }
- }
- return smoothNoise;
- }
- float[][] generatePerlinNoise(float[][] baseNoise, int octaveCount) {
- int width = baseNoise.length;
- int height = baseNoise[0].length;
- float[][] smoothNoise = new float[octaveCount][]; //an array of 2D arrays containing
- float persistance = 0.5f;
- for (int i = 0; i < octaveCount; i++) {
- smoothNoise = generateSmoothNoise(baseNoise, i);
- }
- float[][] perlinNoise = new float[width][height];
- float aplitude = 1.0f;
- float totalAmplitude = 0.0f;
- for(int octave = octaveCount - 1; octave > 0; octave--) {
- aplitude *= persistance;
- totalAmplitude += aplitude;
- for (int i = 0; i < width ; i++) {
- for (int j = 0; j < height; j++) {
- perlinNoise[i][j] += smoothNoise[i][j] * aplitude;
- }
- }
- }
- for (int i = 0; i < width; i++)
- {
- for (int j = 0; j < height; j++)
- {
- perlinNoise[i][j] /= totalAmplitude;
- }
- }
- return perlinNoise;
- }
- private ArrayList<Vector2> convertToVector2(float[][] perlinNoise, int y) {
- ArrayList<Vector2> vectorList = new ArrayList<>();
- int x = 0;
- for(int i = 0 ; i < perlinNoise.length; i++) {
- for(int j = 0; j < perlinNoise.length; j++) {
- // float y_ = (float) Math.cos(y * perlinNoise[i][j]) + (float)Math.sin(y * perlinNoise[i][j]);
- float y_ = y + perlinNoise[i][j];
- vectorList.add(new Vector2((x++ ) * Constanse.PPM , y_ * Constanse.PPM));
- }
- }
- System.out.println(vectorList.size());
- return vectorList;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement