This repository has been archived by the owner on Sep 6, 2024. It is now read-only.
[ASSIGNMENT] Collinear Points #16
Labels
programming assignment
Programming assignment from Algorithms course
Milestone
Collinear Points
Write a program to recognize line patterns in a given set of points.
Computer vision involves analyzing patterns in visual images and reconstructing the real-world objects that produced them. The process is often broken up into two phases: feature detection and pattern recognition. Feature detection involves selecting important features of the image; pattern recognition involves discovering patterns in the features. We will investigate a particularly clean pattern recognition problem involving points and line segments. This kind of pattern recognition arises in many other applications such as statistical data analysis.
Point
Create an immutable data type Point that represents a point in the plane by implementing the following API:
To get started, use the data type Point.java, which implements the constructor and the draw(), drawTo(), and toString() methods. Your job is to add the following components.
compareTo()
method should compare points by their y-coordinates, breaking ties by their x-coordinates. Formally, the invoking point(x0, y0)
is less than the argument point(x1, y1)
if and only if eithery0 < y1
or ify0 = y1
andx0 < x1
.slopeTo()
method should return the slope between the invoking point(x0, y0)
and the argument point(x1, y1)
, which is given by the formula(y1 − y0) / (x1 − x0)
. Treat the slope of a horizontal line segment as positive zero; treat the slope of a vertical line segment as positive infinity; treat the slope of a degenerate line segment (between a point and itself) as negative infinity.slopeOrder()
method should return a comparator that compares its two argument points by the slopes they make with the invoking point(x0, y0)
. Formally, the point(x1, y1)
is less than the point(x2, y2)
if and only if the slope(y1 − y0) / (x1 − x0)
is less than the slope(y2 − y0) / (x2 − x0)
. Treat horizontal, vertical, and degenerate line segments as in theslopeTo()
method.equals()
orhashCode()
methods.Corner cases. To avoid potential complications with integer overflow or floating-point precision, you may assume that the constructor arguments
x
andy
are each between 0 and 32,767.Brute force
Write a program BruteCollinearPoints.java that examines 4 points at a time and checks whether they all lie on the same line segment, returning all such line segments. To check whether the 4 points
p
,q
,r
, ands
are collinear, check whether the three slopes betweenp
andq
, betweenp
andr
, and betweenp
ands
are all equal.The method
segments()
should include each line segment containing 4 points exactly once. If 4 points appear on a line segment in the orderp→q→r→s
, then you should include either the line segmentp→s
ors→p
(but not both) and you should not include subsegments such asp→r
orq→r
. For simplicity, we will not supply any input toBruteCollinearPoints
that has 5 or more collinear points.Corner cases. Throw an
IllegalArgumentException
if the argument to the constructor isnull
, if any point in the array isnull
, or if the argument to the constructor contains a repeated point.Performance requirement. The order of growth of the running time of your program should be
n^4
in the worst case and it should use space proportional ton
plus the number of line segments returned.A faster, sorting-based solution.
Remarkably, it is possible to solve the problem much faster than the brute-force solution described above. Given a point
p
, the following method determines whetherp
participates in a set of 4 or more collinear points.p
as the origin.q
, determine the slope it makes withp
.p
.p
. If so, these points, together withp
, are collinear.Applying this method for each of the n points in turn yields an efficient algorithm to the problem. The algorithm solves the problem because points that have equal slopes with respect to p are collinear, and sorting brings such points together. The algorithm is fast because the bottleneck operation is sorting.
Write a program FastCollinearPoints.java that implements this algorithm.
The text was updated successfully, but these errors were encountered: