/* ***************************************************************************** * 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()); } }