Extend a line segment a specific distance
Solution 1
You can do it by finding unit vector of your line segment and scale it to your desired length, then translating end-point of your line segment with this vector. Assume your line segment end points are A
and B
and you want to extend after end-point B
(and lenAB
is length of line segment).
#include <math.h> // Needed for pow and sqrt.
struct Point
{
double x;
double y;
}
...
struct Point A, B, C;
double lenAB;
...
lenAB = sqrt(pow(A.x - B.x, 2.0) + pow(A.y - B.y, 2.0));
C.x = B.x + (B.x - A.x) / lenAB * length;
C.y = B.y + (B.y - A.y) / lenAB * length;
Solution 2
If you already have the slope you can compute the new point:
x = old_x + length * cos(alpha);
y = old_y + length * sin(alpha);
I haven't done this in a while so take it with a grain of salt.
Admin
Updated on January 02, 2020Comments
-
Admin over 4 years
I am trying to find a way to extend a line segment by a specific distance. For example if I have a line segment starting at 10,10 extending to 20,13 and I want to extend the length by by 3 how do I compute the new endpoint. I can get the length by sqrt(a^2 +b^2) in this example 10.44 so if I wanted to know the new endpoint from 10,10 with a length of 13.44 what would be computationally the fastest way? I also know the slope but don't know if that helps me any in this case.
-
andrew cooke over 12 yearswhere lenAB = sqrt((A.x - B.x)**2 + (A.y - B.y)**2)
-
andrew cooke over 12 yearswhere alpha = atan2(y-old_y, x-old_x)
-
Admin over 12 yearsThank you for your help, this solution seems a little slower then the lower solution. I appreciate the help, this worked also.
-
fersarr over 10 yearsjust in case you are wondering where this comes from, (B.x - A.x) / lenAB * length is the same as cos(slope_alpha) * length...helped for me
-
Mark about 9 yearswhere length is the extra length to add to the line
-
Peter Pohlmann about 4 yearsthis didn't really work for me, the new point was never parallel to the 2 given line points. so it was not a straight line anymore. could be a mistake on my side, maybe doublecheck