i would like to find out what is the general formula of finding a point in between(and not necessarily in the middle) of 2 other random points.
i am using this to test for 2D line intersections and need this.
lets say i have a point (3.5, -1) and the next point i have is (1, 3), moving clockwise.
i know that the line crossed at the y-axis at 0 at some point. what i need to find out is what the x value at this point should be.
point x1:(3.5, -1)
point x3:(???, 0) what is the value of x?
point x2(1, 3)
thanks!!
You can find the slope of the line between x1 and x2, then use that to calculate the X value of x3 based on the given Y value.
(I’m gonna use A,B,C to represent your x1, x2, and x3, to avoid confusion in the code)
slope = (B.y - A.y) / (B.x - A.x);
delta_y = C.y - A.y;
delta_x = delta_y / slope;
C.x = A.x + delta_x;
Optimizing to get rid of a division (we find the inverse slope rather than the slope, so we can multiply instead of divide later):
inv_slope = (B.x - A.x) / (B.y - A.y);
delta_y = C.y - A.y;
delta_x = delta_y * inv_slope
C.x = A.x + delta_x;
There may be more optimizations you can do to make it run faster, but that’s the basic algorithm.
PaladinOfKaos:
You can find the slope of the line between x1 and x2, then use that to calculate the X value of x3 based on the given Y value.
(I’m gonna use A,B,C to represent your x1, x2, and x3, to avoid confusion in the code)
slope = (B.y - A.y) / (B.x - A.x);
delta_y = C.y - A.y;
delta_x = delta_y / slope;
C.x = A.x + delta_x;
Optimizing to get rid of a division (we find the inverse slope rather than the slope, so we can multiply instead of divide later):
inv_slope = (B.x - A.x) / (B.y - A.y);
delta_y = C.y - A.y;
delta_x = delta_y * inv_slope
C.x = A.x + delta_x;
There may be more optimizations you can do to make it run faster, but that’s the basic algorithm.
thanks for the quick response. in contrast, if you know the x value and you need to get the Y value it would be:
inv_slope = (B.y - A.y) / (B.x - A.x);
delta_x = C.x - A.x;
delta_y = delta_x * inv_slope
C.y = A.y + delta_y;
does this look correct???
your math is correct, but when finding Y the first thing you compute is the slope rather than the inverse slope . Your variable is named wrong. It won’t affect program execution, but it could cause confusion later on in life.
PaladinOfKaos:
your math is correct, but when finding Y the first thing you compute is the slope rather than the inverse slope . Your variable is named wrong. It won’t affect program execution, but it could cause confusion later on in life.
ok so just compute -> inv_slope = (B.x - A.x) / (B.y - A.y);
this way whether finding x or y yes?
For X:
inv_slope = (B.x - A.x) / (B.y - A.y);
delta_y = C.y - A.y;
delta_x = delta_y * inv_slope;
C.x = delta_x + A.x;
For Y:
slope = (B.y - A.y) / (B.x - A.x);
delta_x = C.x - A.x;
delta_y = delta_x * slope;
C.y = delta_y + A.y
In the X version of the algorithm, you calculate the inverse slope - that is 1/slope, or dX/dY. Hence the variable is named “inv_slope”. In the Y version, you find the slope (dY/dX), so it’s simply samed “slope”. The wikipedia article on Slope might be a bit more descriptive than I’m being: http://en.wikipedia.org/wiki/Slope
PaladinOfKaos:
For X:
inv_slope = (B.x - A.x) / (B.y - A.y);
delta_y = C.y - A.y;
delta_x = delta_y * inv_slope;
C.x = delta_x + A.x;
For Y:
slope = (B.y - A.y) / (B.x - A.x);
delta_x = C.x - A.x;
delta_y = delta_x * slope;
C.y = delta_y + A.y
In the X version of the algorithm, you calculate the inverse slope - that is 1/slope, or dX/dY. Hence the variable is named “inv_slope”. In the Y version, you find the slope (dY/dX), so it’s simply samed “slope”. The wikipedia article on Slope might be a bit more descriptive than I’m being: http://en.wikipedia.org/wiki/Slope
ok thanks! sorry for the confusion. ive worked it out onpaper and it seems to work
another algorithm can be the linear interpolation.
in vec2 A;
in vec2 B;
float alpha;
// for X
alpha = (C.x-A.x)/(B.x-A.x)
// for Y
alpha = (C.y-A.y)/(B.y-A.y)
vec2 C = A + alpha * (B - A)
Remember to check that the input point should be inside the bound [A, B].
Remember to handle the two special cases slope = infinite and slope = 0 (B.x == A.x and B.y == B.a)