[Math] Calculating the x, y coordinate a set distance between two points

coordinate systemsinterpolationparametrictrigonometry

I'm trying to calculate the x and y coordinates that are a set distance between the coordinates of two pixels in an image.

For example, if I travel from my original location (x1=4, y1=3) to a new location (x2=4, y2=11), it is pretty straight-forward to calculate that these points are 8 pixels apart:

import math
x_dist = (x2 - x1)
y_dist = (y2 - y1)
distance = math.sqrt(x_dist * x_dist + y_dist * y_dist)

However, I'm having difficulty working out the coordinate that is 2 pixels along this path. I know that in this case the answer should be x=4, y=5, however I can't seem to work out how to do this. Most of the equations I've looked at on interpolation require you to know x or the y coordinate you're searching for, and finding the midpoint coordinate doesn't help much either.

EDIT Thank-you Arpan for your amazing help, this is how I've implemented your suggestion in Python. I've also calculated the midpoint to check that the answer was corect:

import math

def calc_distance(x1, y1, x2, y2):
    x_dist = (x2 - x1)
    y_dist = (y2 - y1)
    return math.sqrt(x_dist * x_dist + y_dist * y_dist)

x1, y1, x2, y2 = 0, 3, 2, 11

distance = calc_distance(x1,y1,x2,y2)
first_point_dist = distance / 2

mid_x, mid_y = (x1 + x2) / 2, (y1 + y2) / 2

x_diff = x2 - x1
y_diff = y2 - y1
if x_diff == 0:
    new_x = x1
    if y_diff > 0:
        new_y =  y1 + dist_to_point
    else:
        new_y =  y1 - dist_to_point
elif y_diff == 0:
    new_y = y1
    if x_diff > 0:
        new_x = x1 + dist_to_point
    else:
        new_x = x1 - dist_to_point
else:
    tan_angle = y_diff / x_diff
    angle = math.atan(tan_angle)
    new_x = round(x1 + first_point_dist * math.cos(angle))
    new_y = round(y1 + first_point_dist * math.sin(angle))

print(new_x, new_y, mid_x, mid_y, distance)

Final Edit I just realised that the angle had to be in radians, NOT degrees, I was converting it to degrees but ending up with strange answers, that has been modified now and seems to be working well. Thanks for all the help!

Final Final Edit Forgot to check if the points on the same x or y axis were positive or negative.

Best Answer

I think what you're looking for is the parametric form.

Given your initial point $(x_0,y_0)$ and another point of the line $(x_1,y_1)$, you can write the slope of line as $$\tan\theta=\frac{y_1-y_0}{x_1-x_0}$$

For a point $(x,y)$ at a distance $r$ along the line from $(x_0,y_0)$, $$x=x_0+r\cos\theta,y=y_0+r\sin\theta$$ Where $\tan\theta$ is the slope as above.

Related Question