How to calculate end points of perpendicular line segments?
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 togeth开发者_开发知识库er.
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
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:
- Find B1 - B2
- Normalise this vector
- Then scale this vector up by half the distance between the red points
- Rotate by 90 degrees
- Add this vector to B1 (this is R1)
- Subtract this vector from B1 (This is R2)
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.
You know the slope of the blue line, let's call it m
. And a line perpendicular to the blue line will have slope -1/m
.
to find the x-coordinate you need some trig, sine \theta = d / delta_x
, where \theta is the angle of the blue line for the x-axis and d is the distance to one of the red points from the blue point. Then add/subtract delta_x
to the x-coordinate of the blue point you want the line to be perpendicular to. Now you can use the point-slope formula to figure out the y coordinate.
精彩评论