Difference between revisions of "Computational geometry"
m (→On which side of a line does a point lie?) |
|||
Line 372: | Line 372: | ||
Yes we can, with a certain restriction. If <math> Ax_0 + By_0 + C > 0 </math>, then the | Yes we can, with a certain restriction. If <math> Ax_0 + By_0 + C > 0 </math>, then the | ||
point lies on one side of the line; if <math> Ax_0 + By_0 + C < 0 </math>, then it lies | point lies on one side of the line; if <math> Ax_0 + By_0 + C < 0 </math>, then it lies | ||
− | on the other side. However, it's a bit pointless to say | + | on the other side. However, it's a bit pointless to say ''which'' side it |
lies on: does it lie on the left or the right? If the line is horizontal, then | lies on: does it lie on the left or the right? If the line is horizontal, then | ||
this question becomes meaningless. Also, notice that if we flip the signs of | this question becomes meaningless. Also, notice that if we flip the signs of |
Revision as of 03:56, 8 November 2009
Contents
- 1 Introduction and Scope
- 2 Points
- 3 Lines
- 3.1 What is a line?
- 3.2 The equation of a line
- 3.3 Standard Form of the equation of a line
- 3.4 Slope and intercepts of the line in standard form
- 3.5 Determining if a point is on a line
- 3.6 Construction of the line through two given points
- 3.7 Parallel and coincident lines
- 3.8 Finding the point of intersection of two lines
- 3.9 Direction numbers for a line
- 3.10 Dropping a perpendicular
- 3.11 The distance from a point to a line
- 3.12 On which side of a line does a point lie?
- 3.13 The distance between two lines
Introduction and Scope
Definition
Computational geometry, as one can easily guess from the name, is the branch of computer science encompassing geometrical problems and how their solutions may be implemented (efficiently, one would hope) on a computer.
Scope
Essentially all of the computational geometry you will encounter in high-school level competitions, even competitions such as the IOI, is plane Euclidean geometry, the noble subject on which Euclid wrote his Elements and a favorite of mathematical competitions. You would be hard-pressed to find contests containing geometry problems in three dimensions or higher. You also do not need to worry about non-Euclidean geometries in which the angles of a triangle don't quite add to 180 degrees, and that sort of thing. In short, the type of geometry that shows up in computer science contests is the type of geometry to which you have been exposed, countless times, in mathematics class, perhaps without being told that other geometries exist. So in all that follows, the universe is two-dimensional, parallel lines never meet, the area of a circle with radius is , and so on.
Points
Introduction
Many would claim that the point is the fundamental unit of geometry. Lines, circles, and polygons are all merely (infinite) collections of points and in fact we will initially consider them as such in order to derive several important results. A point is an exact location in space. Operations on points are very easy to perform computationally, simply because points themselves are such simple objects.
Representation: Cartesian coordinates
In our case, "space" is actually a plane, two-dimensional. That means that we need two real numbers to
describe any point in our space. Most of the time, we will be using the Cartesian (rectangular) coordinate
system. In fact, when points are given in the input of a programming problem, they are almost always
given in Cartesian coordinates. The Cartesian coordinate system is easy to understand and every pair of
real numbers corresponds to exactly one point in the plane (and vice versa), making it an ideal choice for
computational geometry.
Thus, a point will be represented in the computer's memory by an ordered pair of real numbers. Due to the
nature of geometry, it is usually inappropriate to use integers, as points generally do not fit neatly into the
integer lattice! Even if the input consists only of points with integer coordinates, calculations with these
coordinates will often yield points with non-integral coordinates, which can often cause counter-intuitive
behavior that will have you scratching your head! For example, in C++, when one integer is divided by
another, the result is always truncated to fit into an integer, and this is usually not desirable.
Determining whether two points coincide
Using the useful property of the Cartesian coordinate system discussed above, we can determine whether or not two given points coincide. Denote the two points by and , with coordinates and , respectively, and then:
Read: The statement that and are the same point is equivalent to the statement that their corresponding coordinates are equal. That is, and having both the same x-coordinates and also the same y-coordinates is both sufficient and necessary for the two to be the same point.
The distance between two points
To find the distance between two points, we use the Euclidean formula. Given two points and , the distance between them is given by:
(Note that when we write , we mean that is a point with x-coordinate and y-coordinate .)
The midpoint of the line segment joining two points
Given two points, how may we find the midpoint of the line segment joining two points? (Intuitively, it is the point that is "right in the middle" of two given points. One might think that we require some knowledge about line segments in order to answer this, but it is for precisely the reason that, in a certain sense, no such knowledge is required to understand the answer, that this operation is found in the Points section. So, given two points and , this midpoint is given by
Lines
What is a line?
In axiomatic geometry, some terms such as point and line are left undefined, because an infinite regression of definitions is clearly absurd. In the algebraic approach we are taking, the line is defined in terms of the points which lie on it; that will be discussed in the following section. It will just be pointed out here that the word line is being used in the modern mathematical sense. Lines are straight; the terms line and straight line shall have identical meaning. Lines extend indefinitely in both directions, unlike rays and line segments.
The equation of a line
In computational geometry, we have to treat all aspects of geometry algebraically. Computers are excellent at dealing with numbers but have no mechanism for dealing with geometrical constructions; rather we must reduce
them to algebra if we wish to accomplish anything.
In Ontario high schools, the equation of a line is taught in the ninth grade. For example, the line which passes through the points (0,1) and (1,0) has the equation . Precisely, this means that for a given point , the statement is equivalent to, or sufficient and necessary for, the point to be on the line.
The form of the equation of the line which is first introduced is generally the , in which is the slope of the line and is the y-intercept. For example, the line discussed above has the equation , that is, and . By substituting different values for and , we can obtain various (different) lines. But there's a problem here: if your line is vertical, then it is not
possible to choose values of and for the line. (Try it!) This is because the y-coordinate is no longer a function of the x-coordinate.
Thus, when dealing with lines computationally, it seems we would need to have
a special case: check if the line is vertical; if so, then do something,
otherwise do something else. This is a time-consuming and error-prone way of
coding.
Standard Form of the equation of a line
Even though the slope-intercept form cannot describe a vertical line, there is an equation that describes a vertical line. For example, the line passing through (3,1) and (3,8) is . In fact, almost any line can be described by an equation of the form . (Try it if you don't believe me. I have merely switched around and from the slope-intercept form.) Except... horizontal lines. So we have two forms of the equation of a line: one which fails on vertical lines and one which fails on horizontal lines. Can we combine them to give an equation of the line which is valid for any
line?
As it turns out, it is indeed possible.
That equation, the standard form of the equation of the line is:
By substituting appropriate values of , , and , one can
describe any line with this equation. And by storing values of , , and , one can represent a line in the computer's memory.
Here are some pairs of points and possible equations for each:
As you can see, it handles vertical and horizontal lines properly, as well
as lines which are neither.
Note that the standard form is not unique: for example, the equation of the
first line could have just as well been or perhaps
. Any given line has infinitely many representations
in the standard form. However, each standard form representation describes
at most one line.
If and are both zero, the standard form describes no line
at all.
Slope and intercepts of the line in standard form
By isolating from the standard form, we obtain the slope and y-intercept form for line () when (that is, when the line is not vertical):
The y-intercept is obtained by letting and then:
Similarly, the x-intercept is given by:
In order for the x-intercept to exist, the line must not be horizontal, that is, .
Determining if a point is on a line
Using the definition of the equation of a line, it becomes evident that to determine whether or not a point lies on a line, we simply substitute its coordinates into the equation of the line, and check if the LHS is, indeed, equal to zero. This allows us to determine, for example, that is on the last line given in the table above, whereas is not on that line.
Construction of the line through two given points
A good question is: how do we determine that fourth equation above, the equation of the line through (6,6) and (4,9)? It's not immediately obvious from the two points given, whereas the other three are pretty easy.
For the slope-y-intercept form , you first determined the slope
, and then solved for . A similar procedure can be used for
standard form.
We state here the following pseudocode for determining the
coefficients , , of the equation of the line through
points and in standard form:
(It is one thing to derive a formula or algorithm and quite another thing to prove it. The derivation of this formula is not shown, but proving it is as easy as substituting to determine that the line really does pass through the two given points.)
Parallel and coincident lines
In the slope and y-intercept form, two lines are either parallel or coincident if they have the same slope. So given two lines () and (), we obtain, for :
Cross-multiplying gives a result that is valid even if either or both lines are vertical, that is, it is valid for any pair of lines in standard form:
Now, in the slope-y-intercept form, two lines coincide if their slopes and y-intercepts both coincide. In a manner similar to that of the previous section, we obtain:
or, if x-intercepts are used instead:
Two lines coincide if and either of the two equations above holds. (As a matter of fact, if the two lines are coincident, they will both hold, but only one of them needs to be checked.) If but the lines are not coincident, they are parallel.
Finding the point of intersection of two lines
If two lines are coincident, every point on either line is an intersection
point. If they are parallel, then no intersection points exist. We consider the
general case in which neither is true.
In general, two lines intersect at a single point. That is, the intersection
point is the single point that lies on both lines. Since it lies on both lines,
it must satisfy the equations of both lines simultaneously. So to find the
intersection point of and , we seek the ordered pair which satisfies:
This is a system of two linear equations in two unknowns and is solved by Gaussian elimination. Multiply the first by and the second by , giving:
Subtracting the former from the latter gives, with cancellation of the term:
Instead of redoing this to obtain the value of , we take advantage of symmetry and simply swap all the 's with the 's. (If you don't believe that this works, do the derivation the long way.)
or:
Notice the quantity , and how it forms the denominator of the expressions for both and . When solving for the intersection point on the computer, you only need to calculate this quantity once. (This quantity, called a determinant, will resurface later on.) Here is pseudocode for finding the intersection point:
When , the lines are either parallel or coincident. We now see algebraically that the division by zero prevents us from finding a unique intersection point for such pairs of lines.
Direction numbers for a line
This in itself is not very useful, but it will become important in the
following sections as a simplifying concept.
Lines are straight; effectively they always point in the same direction. One
way to express that direction has been slope, which unfortunately is undefined
for vertical lines. The slope for a line told us that you could
start at any point on the line, move units to the right, then
move units up, and you would again be located on the line.
Thus we can say that is a pair of direction numbers for that line.
This means that if is on a line, and and
are in the ratio , for that line, then
is on the same line. This means that
is also a set of direction numbers for that line, or, indeed, any
multiple of other than . (
clearly tells you nothing about the line.)
We can define something similar for the line in standard form. Choose some
starting point on line . Now, move to a new point
. In order for this point to be on the line
, we must have
Expanding and rearranging gives
We know that since is on line . Therefore,
Convince yourself, by examining the equation above, that is a set
of direction numbers for line . Similarly, if we have a pair of
direction numbers , although this does not define a
unique line, we can obtain possible values of and as
and , respectively.
The relationship between direction numbers and points on the corresponding line
is an "if-and-only-if" relationship. If and are
in the ratio , then we can "shift" by ,
and vice versa.
Any line perpendicular to will have the direction numbers ,
and thus a possible equation starts .
(This is the same as saying, for non-vertical lines, that the product of slopes
of perpendicular lines is -1. Examine the equation for the slope of a line
given in standard form and you'll see why.) In fact, in an algebraic treatment of geometry
such as this, we do not prove this claim, but instead proclaim it the definition of
perpendicularity: given two lines with direction numbers and
, they are perpendicular if and only if
.
Given some line, all lines parallel to that one have the same direction numbers. That is, the direction
numbers, while providing information about a line's direction, provide no
information about its position. However, sometimes all that is needed is the direction, and here the
direction numbers are very useful.
Dropping a perpendicular
Given a line and a point which may or may not be on , can we find the line perpendicular to passing through ? By Euclid's Fifth Postulate, there exists exactly one such line. The algorithm to find it is given below:
where is the perpendicular line desired.
There is nothing difficult to memorize here: we already noted in the previous
section how to find the values of and , and finding the value
of is merely setting equal to zero (so that the
point will be on the resulting line).
The foot of the perpendicular is the point at which it intersects the
line . It is guaranteed to exist since two lines cannot, of course, be
both perpendicular and parallel. Combining the above algorithm with the line intersection algorithm
explained earlier gives a solution for the location of the point. A bit of algebra gives
this optimized algorithm:
where are the coordinates of the foot of the perpendicular from to .
The distance from a point to a line
By the distance from a point to a line
what is meant is the closest possible distance from
to any point on . What point on is closest to ?
It is intuitive perhaps that it is obtained by dropping a perpendicular
from to . That is, we choose a point such that
, and the distance from to is then the length
of line segment , denoted .
The reason why this is the shortest distance possible is this: Choose any other
point on . Now, is right-angled at .
The longest side of a right triangle is the hypotenuse, so that
. Thus is truly the shortest possible distance.
Now, as noted earlier, the line , being perpendicular to , has the direction numbers . Thus, for any , the point is on
. For some choice of , this point must coincide with .
Since that point lies on , we have
This instantly gives the formula for the foot of the perpendicular given in
the previous section.
Now, the distance is found with the Euclidean formula:
The last line is the formula to remember. To restate,
(It was noted earlier that if and are both zero, then we don't actually have a line. Therefore, the denominator above can never be zero, which is a good thing.)
On which side of a line does a point lie?
A line partitions the plane into two regions. For example, a vertical line
divides the plane into a region on the left and a region on the right. Now,
when a point does not satisfy the equation of a line
, can we determine on which side of the line it lies?
Yes we can, with a certain restriction. If , then the
point lies on one side of the line; if , then it lies
on the other side. However, it's a bit pointless to say which side it
lies on: does it lie on the left or the right? If the line is horizontal, then
this question becomes meaningless. Also, notice that if we flip the signs of
, , and , then the value of is
negated also, but that changes neither the point or the line. It is enough,
however, to tell if two points are on the same side of the line or on opposite
sides; simply determine whether has the same sign for both,
or different signs.
The distance between two lines
If two lines intersect, the closest distance between them is zero, namely at their intersection point. If they are coincident, then the distance is similarly zero. If two lines are parallel, however, there is a nonzero distance between them, and it is defined similarly to the distance between a point and a line. To find this distance, we notice that the lines and are coincident, where is the origin, is the foot of the perpendicular from to , and is the foot of the perpendicular from to . We know, by substituting for both () and () that:
Now here we come up against a complication. If is on the line segment , then we have to add and to get the desired . That is, if is on the same side of both lines. Otherwise, we have to take the difference. Here's some code that takes care of these details: