I wrote a basic code which accepts two point coordinates, derives the eqaution of the line passing through it and of the perpendicular, then outputs two points which are the edges of the same perpendicular line. My aim is to do something like what is shown in the pictures of this answer, but without all those third-party packages, and without a GIS.
Now, talking about performance, I think my code could greatly benefit of the numpy package, especially in view of using this calculations in a loop with lots (even millions) of pair of point coordinates. Since I didn't use numpy so much, can anyone:
- (confirm that adapting the code to use
numpywould enhance the performance) - suggest of should I adapt the code (e.g. some good hint to start)?
Here is the code, hope someone would find it useful (matplotlib is there just to visualize the result).
import matplotlib.pyplot as plt
# calculate y from X coord, slope and intercept
def calculate_y(x, m, q):
y = m * x + q
return y
# the two point coordinates
point_A = [5,7] # First considered point
point_B = [4,10] # Second considered point
# calculate the slope between the point pair
m = (point_A[1] - point_B[1]) / (point_A[0] - point_B[0])
# calculate slope and intercept of the perpendicular (using the second original point)
m_perp = -(1/m)
q_perp = point_B[1] - m_perp * point_B[0]
##print "Perpendicular Line is y = {m}x + {q}".format(m=m_perp,q=q_perp)
# calculate corods of the perpendicular line
distance_factor = 1 #distance from central point
min_X = point_B[0] - distance_factor # left-side X
min_Y = calculate_y(min_X, m_perp, q_perp) # left-side Y
max_X = point_B[0] + distance_factor # right-side X
max_Y = calculate_y(max_X, m_perp, q_perp) # right-side Y
perp_A = (min_X, min_Y)
perp_B = (max_X, max_Y)
x_coord, y_coord = zip(*[point_A, point_B])
x_perp_coord, y_perp_coord = zip(*[perp_A, perp_B])
plt.scatter(x_coord, y_coord)
plt.scatter(x_perp_coord, y_perp_coord)
plt.show()