Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int cols = 200;
- int rows = cols;
- Spot[][] grid = new Spot[cols][rows];
- Spot current;
- Spot start;
- Spot end;
- float wi;
- float hi;
- float heightWeight = 40;
- float zoom = 20;
- float noiseZoom = (cols+rows)/4*(zoom/50);
- float intensity = 5;
- boolean set1 = false;
- boolean set2 = false;
- boolean reset = false;
- int step = 0;
- Cam c = new Cam();
- Terrain t = new Terrain();
- void setup() {
- size(600, 600, P3D);
- t.generate();
- }
- void draw() {
- background(255);
- if (set1 && set2) {
- t.p.find();
- c.update();
- t.p.update();
- t.update();
- } else {
- reset = false;
- t.update();
- }
- }
- void mouseClicked() {
- if (!set1) {
- start = grid[int(mouseX*cols/width)][int(mouseY*rows/height)];
- t.p.openSet.add(start);
- c.closestPoint = start;
- start.col = color(255, 0, 0);
- set1 = true;
- start.city = true;
- c.currentX = -start.i*wi+width/2;
- c.currentY = -start.j*hi+height/2;
- c.currentZ = 400-start.renderHeight;
- c.targetX = c.currentX;
- c.targetY = c.currentY;
- c.targetZ = c.currentZ;
- c.targetTX = c.currentX;
- c.targetTY = c.currentY;
- c.targetTZ = c.currentZ;
- } else if (!set2) {
- end = grid[int(mouseX*cols/width)][int(mouseY*rows/height)];
- end.col = color(0, 255, 0);
- set2 = true;
- end.city = true;
- }
- }
- class Cam {
- float z = 0;
- float targetX;
- float targetY;
- float targetZ;
- float targetTX;
- float targetTY;
- float targetTZ;
- float currentX;
- float currentY;
- float currentZ;
- Spot closestPoint;
- void update() {
- z += 1;
- getClosestPoint();
- getCameraPos();
- translate(currentX, currentY, currentZ);
- }
- void getClosestPoint() {
- float tempD1 = pow(pow(closestPoint.i-end.i, 2)+pow(closestPoint.j-end.j, 2), 0.5);
- for (int i = 0; i < t.p.openSet.size(); i++) {
- Spot s = t.p.openSet.get(i);
- float tempD2 = pow(pow(s.i-end.i, 2)+pow(s.j-end.j, 2), 0.5);
- if (tempD2 < tempD1) {
- closestPoint = s;
- }
- }
- targetTX = -current.i*wi+width/2;
- targetTY = -current.j*hi+height/2;
- targetTZ = 400-start.renderHeight-dist(closestPoint.i, closestPoint.j, start.i, start.j)*2;
- targetX = (targetTX-targetX)/100+targetX;
- targetY = (targetTY-targetY)/100+targetY;
- targetZ = (targetTZ-targetZ)/100+targetZ;
- }
- void getCameraPos() {
- currentX = (targetX-currentX)/100+currentX;
- currentY = (targetY-currentY)/100+currentY;
- currentZ = (targetZ-currentZ)/100+currentZ;
- }
- public float heuristic(Spot a, Spot b) {
- float roadMod = 1;
- boolean positive = true;
- float effort = abs(a.k-b.k);
- float dist2D = dist(a.i, a.j, b.i, b.j);
- float dist3D = dist(a.i, a.j, a.k*heightWeight, b.i, b.j, b.k*heightWeight);
- if (b.k > a.k) {
- positive = false;
- }
- if (positive) {
- effort = map(effort, 0, intensity, 1, 4);
- } else {
- effort = map(effort, 0, intensity, 1, 0.25);
- }
- if (a.road && b.road) {
- roadMod = 0;
- }
- if (a.k < 5*intensity/16 && b.k < 5*intensity/16) {
- return dist2D;
- } else if ((a.k > 5*intensity/16 && b.k < 5*intensity/16) || (a.k < 5*intensity/16 && b.k > 5*intensity/16)) {
- return dist3D*3*effort;
- } else if (a.k > 11*intensity/16 || b.k > 11*intensity/16) {
- return dist3D*2*roadMod*effort;
- } else {
- return dist3D*roadMod*effort;
- }
- }
- }
- class Path {
- ArrayList<Spot> openSet = new ArrayList<Spot>();
- ArrayList<Spot> closedSet = new ArrayList<Spot>();
- ArrayList<Spot> path = new ArrayList<Spot>();
- void update() {
- if (step == 0) {
- step =1;
- } else {
- Spot temp = current;
- path.clear();
- path.add(temp);
- while (temp.previous != null) {
- path.add(temp.previous);
- temp = temp.previous;
- }
- noFill();
- stroke(255, 0, 200);
- strokeWeight(wi / 2);
- beginShape(LINES);
- for (int x = 0; x < path.size()-1; x++) {
- vertex(path.get(x).i * wi + wi / 2, path.get(x).j * hi + hi / 2, path.get(x).renderHeight + 2);
- vertex(path.get(x+1).i * wi + wi / 2, path.get(x+1).j * hi + hi / 2, path.get(x).renderHeight + 2);
- }
- endShape();
- }
- }
- void find() {
- if (openSet.size() > 0) {
- int winner = 0;
- for (int i = 0; i < openSet.size(); i++) {
- if (openSet.get(i).f < openSet.get(winner).f) {
- winner = i;
- }
- }
- current = openSet.get(winner);
- if (current == end) {
- finishCycle();
- print("Path Found!");
- reset = true;
- }
- if (!reset) {
- removeFromArray(openSet, current);
- closedSet.add(current);
- ArrayList<Spot> neighbors = current.neighbors;
- for (int i = 0; i < neighbors.size(); i++) {
- Spot n = neighbors.get(i);
- boolean contains = false;
- for (Spot x : closedSet) {
- if (x == n) {
- contains = true;
- }
- }
- if (!contains) {
- float tempG = current.g+heuristic(n, current);
- boolean newPath = false;
- boolean contains2 = false;
- for (Spot x : openSet) {
- if (x == n) {
- contains2 = true;
- }
- }
- if (contains2) {
- if (tempG < n.g) {
- n.g = tempG;
- newPath = true;
- }
- } else {
- n.g = tempG;
- newPath = true;
- openSet.add(n);
- }
- if (newPath) {
- n.h = heuristic(n, end);
- n.f = n.g + n.h;
- n.previous = current;
- }
- }
- }
- }
- } else {
- print("No Solution!");
- noLoop();
- return;
- }
- }
- void removeFromArray(ArrayList<Spot> arr, Spot elt) {
- for (int i = arr.size() - 1; i >= 0; i--) {
- if (arr.get(i) == elt) {
- arr.remove(i);
- }
- }
- }
- public float heuristic(Spot a, Spot b) {
- float roadMod = 1;
- boolean positive = true;
- float effort = abs(a.k-b.k);
- float dist2D = dist(a.i, a.j, b.i, b.j);
- float dist3D = dist(a.i, a.j, a.k*heightWeight, b.i, b.j, b.k*heightWeight);
- if (b.k > a.k) {
- positive = false;
- }
- if (positive) {
- effort = map(effort, 0, intensity, 1, 4);
- } else {
- effort = map(effort, 0, intensity, 1, 0.25);
- }
- if (a.road && b.road) {
- roadMod = 0.15;
- }
- if (a.k < 5*intensity/16 && b.k < 5*intensity/16) {
- return dist2D;
- } else if ((a.k > 5*intensity/16 && b.k < 5*intensity/16) || (a.k < 5*intensity/16 && b.k > 5*intensity/16)) {
- return dist3D*3*effort;
- } else if (a.k > 11*intensity/16 || b.k > 11*intensity/16) {
- return dist3D*2*roadMod*effort;
- } else {
- return dist3D*roadMod*effort;
- }
- }
- void finishCycle() {
- drawRoad();
- start.col = color(0, 0, 0);
- end.col = color(0, 0, 0);
- openSet.clear();
- closedSet.clear();
- path.clear();
- start = grid[0][0];
- end = grid[0][0];
- set1 = false;
- set2 = false;
- }
- void drawRoad() {
- Spot temp = current;
- path.clear();
- path.add(temp);
- while (temp.previous != null) {
- if (temp.k > 5*intensity/16) {
- temp.road = true;
- }
- path.add(temp.previous);
- temp = temp.previous;
- }
- start.road = true;
- }
- }
- class Spot {
- ArrayList<Spot> neighbors = new ArrayList<Spot>();
- Spot previous = null;
- boolean road = false;
- boolean city = false;
- float f;
- float g;
- float h;
- int i;
- int j;
- float k;
- float renderHeight;
- color col;
- Spot(int i_, int j_, float k_) {
- i = i_;
- j = j_;
- k = k_;
- f = 0;
- g = 0;
- h = 0;
- if (k<5*intensity/16) {
- col = color(map(k, 0, 5*intensity/16, 0, 28), map(k, 0, 5*intensity/16, 0, 107), map(k, 0, 5*intensity/16, 0, 160));
- } else if (k>11*intensity/16) {
- col = color(map(k, 11*intensity/16, intensity, 139, 255), map(k, 11*intensity/16, intensity, 141, 255), map(k, 11*intensity/16, intensity, 122, 255));
- } else {
- col = color(map(k, 5*intensity/16, 11*intensity/16, 239, 0), map(k, 5*intensity/16, 11*intensity/16, 221, 96), map(k, 5*intensity/16, 11*intensity/16, 111, 20));
- }
- if (k<5*intensity/16) {
- renderHeight = 5*intensity/16 * 20;
- } else {
- renderHeight = k * 20;
- }
- }
- void showBackground() {
- noStroke();
- if (city) {
- col = color(0, 0, 0);
- } else if (road) {
- col = color(120, 72, 0);
- }
- fill(col);
- if (set1 && set2) {
- translate(0, 0, renderHeight);
- rect(i * wi, j * hi, wi, hi);
- translate(0, 0, -renderHeight);
- } else {
- rect(i * wi, j * hi, wi, hi);
- }
- }
- void show(color c) {
- if (road) {
- fill(color(120, 72, 0));
- } else {
- fill(c);
- }
- if (set1 && set2) {
- translate(0, 0, renderHeight);
- rect(i * wi, j * hi, wi, hi);
- translate(0, 0, -renderHeight);
- } else {
- rect(i * wi, j * hi, wi, hi);
- }
- }
- void addNeighbors() {
- if (i < cols - 1) {
- neighbors.add(grid[i + 1][j]);
- }
- if (i > 0) {
- neighbors.add(grid[i - 1][j]);
- }
- if (j < rows - 1) {
- neighbors.add(grid[i][j + 1]);
- }
- if (j > 0) {
- neighbors.add(grid[i][j - 1]);
- }
- if (i > 0 && j > 0) {
- neighbors.add(grid[i - 1][j - 1]);
- }
- if (i < cols - 1 && j > 0) {
- neighbors.add(grid[i + 1][j - 1]);
- }
- if (i > 0 && j < rows - 1) {
- neighbors.add(grid[i - 1][j + 1]);
- }
- if (i < cols - 1 && j < rows - 1) {
- neighbors.add(grid[i + 1][j + 1]);
- }
- }
- }
- class Terrain {
- Path p = new Path();
- void update() {
- for (int i = 0; i < cols; i++) {
- for (int j = 0; j < rows; j++) {
- grid[i][j].showBackground();
- }
- }
- for (Spot s : p.openSet) {
- s.show(color(255, 0, 0, 50));
- }
- for (Spot s : p.closedSet) {
- s.show(color(0, 255, 0, 50));
- }
- }
- void generate() {
- wi = width / cols;
- hi = height / rows;
- for (int i = 0; i < cols; i++) {
- for (int j = 0; j < rows; j++) {
- grid[i][j] = new Spot(i, j, noise(((i-1000)/noiseZoom), ((j-1000)/noiseZoom))*intensity);
- }
- }
- for (int i = 0; i < cols; i++) {
- for (int j = 0; j < rows; j++) {
- grid[i][j].addNeighbors();
- }
- }
- start = grid[0][0];
- end = grid[cols - 1][rows-1];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement