/* *****************************************************************************
* Compilation: javac-algs4 Hawk.java
* Execution: none
* Dependencies: none
*
* Implementation of a hawk for the boid simulator.
*
**************************************************************************** */
import edu.princeton.cs.algs4.Point2D;
import edu.princeton.cs.algs4.Vector;
import edu.princeton.cs.algs4.StdDraw;
public class Hawk {
private Point2D position;
private Vector velocity;
// create a hawk at (x, y) with zero velocity
public Hawk(double x, double y) {
position = new Point2D(x, y);
velocity = new Vector(2);
}
public Point2D position() {
return position;
}
public double x() {
return position.x();
}
public double y() {
return position.y();
}
// compare by y-coordinate, breaking ties by x-coordinate
public int compareTo(Hawk that) {
if (this.position.y() < that.position.y()) return -1;
if (this.position.y() > that.position.y()) return +1;
if (this.position.x() < that.position.x()) return -1;
if (this.position.x() > that.position.x()) return +1;
return 0;
}
// compare by y-coordinate, breaking ties by x-coordinate
public double distanceSquaredTo(Hawk that) {
return position.distanceSquaredTo(that.position);
}
public Vector returnToWorld() {
Vector center = new Vector(0.5, 0.5);
Vector myPosition = new Vector(x(), y());
return center.minus(myPosition);
}
public Vector eatBoid(Boid boid) {
Vector boidPosition = new Vector(boid.x(), boid.y());
Vector myPosition = new Vector(x(), y());
return boidPosition.minus(myPosition);
}
public void updatePositionAndVelocity(Boid nearest) {
double x = x() + velocity.cartesian(0);
double y = y() + velocity.cartesian(1);
position = new Point2D(x, y);
Vector desire = eatBoid(nearest).direction().scale(0.0003);
velocity = velocity.plus(desire);
}
public void draw() {
StdDraw.setPenColor(StdDraw.RED);
StdDraw.point(x(), y());
}
}