# Point.java

Below is the syntax highlighted version of Point.java from §9.1 Geometric Primitives.

```/******************************************************************************
*  Compilation:  javac Point.java
*  Execution:    java Point
*
*  Implementation of 2D point using rectangular coordinates.
*
******************************************************************************/

public class Point {
public final int x;
public final int y;

// create and initialize a point with given (x, y)
public Point(int x, int y) {
this.x = x;
this.y = y;
}

// return Euclidean distance between this point and that point
public double distanceTo(Point that) {
if (that == null) return Double.POSITIVE_INFINITY;
double dx = this.x - that.x;
double dy = this.y - that.y;
return Math.hypot(dx, dy);
}

// draw point
public void draw() {
StdDraw.point(x, y);
}

// draw line segment between this point and that point
public void drawTo(Point that) {
StdDraw.line(this.x, this.y, that.x, that.y);
}

// is a->b->c a counter-clockwise turn?
// +1 if counter-clockwise, -1 if clockwise, 0 if collinear
public static int ccw(Point a, Point b, Point c) {
// return a.x*b.y - a.y*b.x + a.y*c.x - a.x*c.y + b.x*c.y - b.y*c.x;
double area2 = (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y);
if      (area2 < 0) return -1;
else if (area2 > 0) return +1;
else                return  0;
}

// is a-b-c collinear?
public static boolean collinear(Point a, Point b, Point c) {
return ccw(a, b, c) == 0;
}

// is c between a and b?
// Reference: O' Rourke p. 32
public static boolean between(Point a, Point b, Point c) {
if (ccw(a, b, c) != 0) return false;
if (a.x == b.x && a.y == b.y) {
return a.x == c.x && a.y == c.y;
}
else if (a.x != b.x) {
// ab not vertical
return (a.x <= c.x && c.x <= b.x) || (a.x >= c.x && c.x >= b.x);
}
else {
// ab not horizontal
return (a.y <= c.y && c.y <= b.y) || (a.y >= c.y && c.y >= b.y);
}
}

// return string representation of this point
public String toString() {
return "(" + x + ", " + y + ")";
}

// test client
public static void main(String[] args) {
Point p = new Point(5, 6);
StdOut.println("p  = " + p);
Point q = new Point(2, 2);
StdOut.println("q  = " + q);
StdOut.println("dist(p, q) = " + p.distanceTo(q) + " = " + q.distanceTo(p));
}
}
```