-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPoint.java
127 lines (108 loc) · 3.83 KB
/
Point.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import edu.princeton.cs.algs4.StdDraw;
import java.util.Comparator;
public class Point implements Comparable<Point> {
private final int x;
private final int y;
/**
* Initializes a new point.
*
* @param x the <em>x</em>-coordinate of the point
* @param y the <em>y</em>-coordinate of the point
*/
public Point(int x, int y) {
this.x = x;
this.y = y;
}
/**
* Draws this point to standard draw.
*/
public void draw() {
StdDraw.point(x, y);
}
/**
* Draws the line segment between this point and the specified point
* to standard draw.
*
* @param that the other point
*/
public void drawTo(Point that) {
StdDraw.line(this.x, this.y, that.x, that.y);
}
/**
* Returns the slope between this point and the specified point.
* Formally, if the two points are (x0, y0) and (x1, y1), then the slope
* is (y1 - y0) / (x1 - x0). For completeness, the slope is defined to be
* +0.0 if the line segment connecting the two points is horizontal;
* Double.POSITIVE_INFINITY if the line segment is vertical;
* and Double.NEGATIVE_INFINITY if (x0, y0) and (x1, y1) are equal.
*
* @param that the other point
* @return the slope between this point and the specified point
*/
public double slopeTo(Point that) {
double divisible = (that.y - this.y);
double divisor = (that.x - this.x);
if (divisible == 0 && divisor == 0) return Double.NEGATIVE_INFINITY;
if (divisible == 0) return 0;
if (divisor == 0) return Double.POSITIVE_INFINITY;
return divisible / divisor;
}
/**
* Compares two points by y-coordinate, breaking ties by x-coordinate.
* Formally, the invoking point (x0, y0) is less than the argument point
* (x1, y1) if and only if either y0 < y1 or if y0 = y1 and x0 < x1.
*
* @param that the other point
* @return the value <tt>0</tt> if this point is equal to the argument
* point (x0 = x1 and y0 = y1);
* a negative integer if this point is less than the argument
* point; and a positive integer if this point is greater than the
* argument point
*/
public int compareTo(Point that) {
if (this.y < that.y) return -1;
if (this.y > that.y) return +1;
return Integer.compare(this.x, that.x);
}
/**
* Compares two points by the slope they make with this point.
* The slope is defined as in the slopeTo() method.
*
* @return the Comparator that defines this ordering on points
*/
public Comparator<Point> slopeOrder() {
return new SlopeOrderComparator(this);
}
private static class SlopeOrderComparator implements Comparator<Point> {
Point origin;
public SlopeOrderComparator(Point point) {
origin = point;
}
public int compare(Point p, Point q) {
double pSlope = origin.slopeTo(p);
double qSlope = origin.slopeTo(q);
return Double.compare(pSlope, qSlope);
// if (Math.round(origin.slopeTo(p)) < Math.round(origin.slopeTo(q))) return -1;
// if (Math.round(origin.slopeTo(p)) > Math.round(origin.slopeTo(q))) return 1;
// if (p.y < q.y) return -1;
// if (p.y > q.y) return +1;
// return Integer.compare(p.x, q.x);
}
}
/**
* Returns a string representation of this point.
* This method is provided for debugging;
* your program should not rely on the format of the string representation.
*
* @return a string representation of this point
*/
public String toString() {
/* DO NOT MODIFY */
return "(" + x + ", " + y + ")";
}
/**
* Unit tests the Point data type.
*/
public static void main(String[] args) {
}
}