Implement Euclidean distance for coordinates

This commit is contained in:
2023-11-02 23:02:32 +01:00
parent 0778d4ff2e
commit 31029795d4
8 changed files with 79 additions and 2 deletions

View File

@@ -26,7 +26,11 @@ public interface Locationable extends Placeable {
int manhattanDistance(Vector2ic coordinates);
double euclideanDistance(Vector2ic coordinates);
int chebyshevDistance(Locationable other);
int manhattanDistance(Locationable other);
double euclideanDistance(Locationable other);
}

View File

@@ -4,6 +4,8 @@ import com.bartlomiejpluta.base.api.ai.AI;
import com.bartlomiejpluta.base.api.ai.NPC;
import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer;
import com.bartlomiejpluta.base.api.move.Direction;
import com.bartlomiejpluta.base.util.math.Distance;
import org.joml.Vector2ic;
import java.util.Random;
@@ -12,20 +14,37 @@ public class RandomMovementAI<N extends NPC> implements AI {
private final N npc;
private final float intervalSeconds;
private final int radius;
private final Vector2ic origin;
private float accumulator = 0.0f;
private float threshold = 0.0f;
public RandomMovementAI(N npc, float intervalSeconds) {
this.npc = npc;
this.intervalSeconds = intervalSeconds;
this.radius = 0;
origin = null;
}
public RandomMovementAI(N npc, float intervalSeconds, Vector2ic origin, int radius) {
this.npc = npc;
this.intervalSeconds = intervalSeconds;
this.radius = radius;
this.origin = origin;
}
@Override
public void nextActivity(ObjectLayer layer, float dt) {
if (!npc.isMoving()) {
if (accumulator > threshold) {
Direction direction = Direction.values()[random.nextInt(4)];
npc.move(direction);
var direction = Direction.values()[random.nextInt(4)];
var movement = npc.prepareMovement(direction);
if (origin != null && Distance.euclidean(origin, movement.getTo()) > radius) {
return;
}
npc.getLayer().pushMovement(movement);
accumulator = 0.0f;
threshold = random.nextFloat() * intervalSeconds;
}

View File

@@ -179,6 +179,11 @@ public abstract class AnimationDelegate implements Animation {
return animation.euclideanDistance(other);
}
@Override
public double euclideanDistance(Vector2ic coordinates) {
return animation.euclideanDistance(coordinates);
}
@Override
public Matrix4fc getModelMatrix() {
return animation.getModelMatrix();
@@ -224,6 +229,11 @@ public abstract class AnimationDelegate implements Animation {
return animation.manhattanDistance(other);
}
@Override
public double euclideanDistance(Locationable other) {
return animation.euclideanDistance(other);
}
@Override
public Vector2fc getPositionOffset() {
return animation.getPositionOffset();

View File

@@ -148,6 +148,11 @@ public abstract class CharacterDelegate implements Character {
return character.manhattanDistance(other);
}
@Override
public double euclideanDistance(Locationable other) {
return character.euclideanDistance(other);
}
@Override
public Direction getDirectionTowards(Locationable target) {
return character.getDirectionTowards(target);
@@ -228,6 +233,11 @@ public abstract class CharacterDelegate implements Character {
return character.euclideanDistance(other);
}
@Override
public double euclideanDistance(Vector2ic coordinates) {
return character.euclideanDistance(coordinates);
}
@Override
public int chebyshevDistance(Vector2ic coordinates) {
return character.chebyshevDistance(coordinates);

View File

@@ -68,6 +68,11 @@ public abstract class EntityDelegate implements Entity {
return entity.manhattanDistance(other);
}
@Override
public double euclideanDistance(Locationable other) {
return entity.euclideanDistance(other);
}
@Override
public Direction getDirectionTowards(Locationable target) {
return entity.getDirectionTowards(target);
@@ -148,6 +153,11 @@ public abstract class EntityDelegate implements Entity {
return entity.euclideanDistance(other);
}
@Override
public double euclideanDistance(Vector2ic coordinates) {
return entity.euclideanDistance(coordinates);
}
@Override
public int chebyshevDistance(Vector2ic coordinates) {
return entity.chebyshevDistance(coordinates);

View File

@@ -94,6 +94,16 @@ public abstract class IconDelegate implements Icon {
return icon.manhattanDistance(other);
}
@Override
public double euclideanDistance(Vector2ic coordinates) {
return icon.euclideanDistance(coordinates);
}
@Override
public double euclideanDistance(Locationable other) {
return icon.euclideanDistance(other);
}
@Override
public Direction getDirectionTowards(Locationable target) {
return icon.getDirectionTowards(target);

View File

@@ -71,4 +71,8 @@ public class Distance {
public static double euclidean(Vector2dc a, Vector2dc b) {
return sqrt((a.x() - b.x()) * (a.x() - b.x()) + (a.y() - b.y()) * (a.y() - b.y()));
}
public static double euclidean(Vector2ic a, Vector2ic b) {
return sqrt((a.x() - b.x()) * (a.x() - b.x()) + (a.y() - b.y()) * (a.y() - b.y()));
}
}

View File

@@ -108,5 +108,15 @@ public abstract class LocationableModel extends Model implements Locationable {
return Distance.manhattan(this.coordinates, other.getCoordinates());
}
@Override
public double euclideanDistance(Vector2ic coordinates) {
return Distance.euclidean(this.coordinates.x, this.coordinates.y, coordinates.x(), coordinates.y());
}
@Override
public double euclideanDistance(Locationable other) {
return Distance.euclidean(this.coordinates.x, this.coordinates.y, other.getCoordinates().x(), other.getCoordinates().y());
}
private enum PlacingMode {BY_POSITION, BY_COORDINATES}
}