mirror of
https://github.com/simon987/Much-Assembly-Required.git
synced 2025-04-10 14:26:45 +00:00
Add getTiles() to calculate tiles between two coords
This commit is contained in:
parent
e97770f860
commit
f526f369c4
@ -1,6 +1,6 @@
|
||||
package net.simon987.pluginradioactivecloud;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bson.Document;
|
||||
import net.simon987.server.assembly.HardwareModule;
|
||||
@ -33,30 +33,64 @@ public class RadiationDetector extends HardwareModule {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (o == this) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!(o instanceof Tuple)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Tuple t = (Tuple) o;
|
||||
|
||||
return Integer.compare(x, t.x) == 0 && Integer.compare(y, t.y) == 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find tiles between two given tiles.
|
||||
* Find tiles between two given coordinates.
|
||||
*
|
||||
* @return List of tile coordinates. An empty list indicates tiles are next to
|
||||
* each other.
|
||||
*/
|
||||
private HashSet<Tuple> getTiles(int x0, int y0, int x1, int y1) {
|
||||
public ArrayList<Tuple> getTiles(int x0, int y0, int x1, int y1) {
|
||||
|
||||
HashSet<Tuple> ret = new HashSet<>();
|
||||
double slope = (y1 - y0) / (double) (x1 - x0);
|
||||
ArrayList<Tuple> ret = new ArrayList<>();
|
||||
double slope;
|
||||
if (x1 > x0)
|
||||
slope = (y1 - y0) / (double) (x1 - x0);
|
||||
else {
|
||||
slope = (y0 - y1) / (double) (x0 - x1);
|
||||
|
||||
// Swap values so that x0 < x1. This preps the following code where y is
|
||||
// determined by adding a step value (1) to x0 till it reaches x1.
|
||||
int tmp = x1;
|
||||
x1 = x0;
|
||||
x0 = tmp;
|
||||
|
||||
tmp = y1;
|
||||
y1 = y0;
|
||||
y0 = tmp;
|
||||
}
|
||||
|
||||
// If slope is zero or undefined, return tiles directly along the
|
||||
// appropriate cardinal direction.
|
||||
if (x0 == x1) {
|
||||
int smaller = y0 < y1 ? y0 : y1;
|
||||
int larger = y0 > y1 ? y0 : y1;
|
||||
System.out.printf("%d %d", smaller, larger);
|
||||
for (int i = smaller + 1; i < larger; i++) {
|
||||
ret.add(new Tuple(x0, i));
|
||||
}
|
||||
} else if (y0 == y1) {
|
||||
int smaller = x0 < x1 ? x0 : x1;
|
||||
int larger = x0 > x1 ? x0 : x1;
|
||||
for (int i = smaller + 1; i < larger; i++) {
|
||||
ret.add(new Tuple(i, y0));
|
||||
}
|
||||
} else {
|
||||
// Find all coordinates with 0.1 step
|
||||
int lastX = x0;
|
||||
int lastY = y0;
|
||||
for (int i = x0 * 10; i < x1 * 10; i += 1) {
|
||||
if (i / 10 != lastX || (int) (slope * i / 10) != lastY) {
|
||||
// Update last values
|
||||
lastX = i / 10;
|
||||
lastY = (int) (slope * i / 10);
|
||||
|
||||
// Add new values to array
|
||||
ret.add(new Tuple(lastX, lastY));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user