I know the end points of a line segment and the distance/size of the perpendicular end caps I'd like to create but I need to calcuate the end points of the perpendicular line. I've been banging my head against the wall using either 45-45-90 triangles and dot products but I just can't seem to make it come together.
I know the points in blue and the distance to the points in red, I need to find the points in red.
Before marking as duplicate, I tried the answer posted in this question but it resulted in end caps which were always vertical.
http://rauros.net/files/caps.png http://rauros.net/files/caps.png
First, put the equation of the line given into slope-intercept form by solving for y. You get y = -2x +5, so the slope is –2. Perpendicular lines have opposite-reciprocal slopes, so the slope of the line we want to find is 1/2. Plugging in the point given into the equation y = 1/2x + b and solving for b, we get b = 6.
A line segment is a part of a line that is bounded by two distinct endpoints, and contains every point on the line between its endpoints. A closed line segment includes both endpoints, while an open line segment excludes both endpoints; a half-open line segment includes exactly one of the endpoints.
A line segment has two endpoints.
If B1 is the blue point between the 2 red points, and B2 is the other blue point then the way to do this is:
All of the above is fairly straightforward - the trickiest bit would be figuring out how to write it out in text!
This might be helpful though - matrix to rotate by 90 degrees:
[ 0 -1 ]
[ 1 0 ]
The easy way around this one is not to think in terms of slope m, but rather the change in x and y, which I call dx, dy (from the calculus notation). The reason is for one thing, that dealing with a slope for a vertical line is infinite, and in any case, you don't need to use trig functions, this code will be faster and simpler.
dx = x2 - x1;
dy = y2 - y1;
I am assuming here that point 2 is the intersection of the desired line.
Ok, so the perpendicular line has a slope with the negative reciprocal of the first. There are two ways to do that:
dx2 = -dy
dy2 = dx
or
dx2 = dy
dy2 = -dx
this corresponds to the two directions, one turning right, and the other left.
However, dx and dy are scaled to the length of the original line segment. Your perpendicular has a different length.
Here's the length between two points:
double length(double x1, double y1, double x2, double y2) {
return sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
}
Do what you want, to go to one side or the other, is:
double scale = length(whatever length you want to go)/sqrt(dx*dx+dy*dy);
double dx2 = -dy * scale;
double dy2 = dx * scale
and then the same again for the other side. I just realized my example is somewhat c++, since I used sqrt, but the differences are trivial. Note that you can write the code more efficiently, combining the square roots.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With