### 14.4. `Line.twoPoint()`

: Define a line
through two points

homcoord.py

# - - - L i n e . t w o P o i n t
@staticmethod
def twoPoint(p1, p2):
'''Find the equation of a line between two points.
'''

The first order of business is to eliminate the case
where the points coincide; see Section 7.12, “`Pt.__cmp__()`

: Compare two points”.

homcoord.py

#-- 1 --
# [ if p1 and p2 coincide ->
# raise ValueError
# else ->
# x1 := abscissa of p1
# y1 := ordinate of p1
# x2 := abscissa of p2
# y2 := ordinate of p2 ]
if p1 == p2:
raise ValueError("Points are not distinct.")
else:
x1, y1 = p1.xy()
x2, y2 = p2.xy()

Here is the formula for a line through two points:

Notice that for vertical lines `x`_{2} = x_{1}

, which would require dividing by zero.
In this case, a vertical line through `x`_{1}

has the
equation `x`

= `x`_{1}

, which in
standard form would be:

If the line is not vertical, we calculate the slope
`m`

.

homcoord.py

#-- 2 --
# [ if x1 == x2 ->
# return a vertical line through x1
# else ->
# m := (y2-y1)/(x2-x1) ]
if x1 == x2:
return Line(1.0, 0.0, -x1)
else:
m = (y2-y1)/(x2-x1)

After substituting `m`

in the
two-point formula, we rearrange the terms into the
standard form `ax + by + c = 0`

.

homcoord.py

#-- 4 --
# [ return a new Line instance having a=(-m), b=1, and
# c=(m*x1-y1) ]
return Line(-m, 1.0, (m*x1-y1))