Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 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

like image 607
basszero Avatar asked Dec 17 '09 15:12

basszero


People also ask

How do you find perpendicular lines with points?

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.

What are the end points of a line segment?

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.

How many end points a line segments has?

A line segment has two endpoints.


2 Answers

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 ]
like image 161
Justin Avatar answered Oct 15 '22 04:10

Justin


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.

like image 25
Dov Avatar answered Oct 15 '22 03:10

Dov