Kelsey Abreu
Kelsey Abreu

Reputation: 1124

Find point C that forms perpendicular line BC to line AB

I have Line segment AB defined by two 2D points A,B.

What I am trying to do is find a point C, with distance d away from B. The two constraints are that BC has to be perpendicular to AB and BC is always 90 degrees anti-clockwise relative to AB.

So far I have the following

double d = .01;
Coordinate C = new Coordinate(A.Lat - B.Lat, A.Long - B.Long);

C.Long = C.Long * A.Long * Math.Cos(90);
C.Lat = C.Lat * A.Lat * Math.Cos(90);

C.Long = A.Long + C.Long * d;
C.Lat = A.Lat + C.Lat * d;

Essentially what I am asking is, where am I going wrong with this? Is it the c# code? Is it the logic? What are the steps to solve for C using those two constraints.

enter image description here

Upvotes: 2

Views: 2170

Answers (2)

Spektre
Spektre

Reputation: 51933

MBo has the correct answer for your task (as you got 90 degrees turn) I just wanted to show you how to repair your own code (I deduced you wanted to do this) which is usable to any angular turn (but slower as it require goniometric):

d = .01;
a = atan2(B.y - A.y,B.x - A.x) (+/-) 90.0; // sign depends on your coordinate system
C.x = B.x + d*cos(a)
C.y = B.y + d*sin(a)

So you should obtain directional angle a of your AB and shift it by 90 deg. Then you just add d rotated by the a to the C which can be done by parametric circle equation.

Beware all the angles should be in units your goniometric functions accepts (so either degrees or radians) as I do not code in C# I have not a clue but in languages I code in it is usually in radians. In which case line:

a = atan2(B.y - A.y,B.x - A.x) (+/-) 90.0; // sign depends on your 

Would change to:

a = atan2(B.y - A.y,B.x - A.x) (+/-) 90.0*Pi/180.0; // sign depends on your 

Where Pi=3.1415926535897932384626433832795.

Upvotes: 1

MBo
MBo

Reputation: 80325

Normalize AB vector and rotate it by 90 degrees:

ABY = B.Y - A.Y
ABX = B.X - A.X
Len = Sqrt(ABY*ABY + ABX*ABX)
C.X = B.X - d * ABY / Len 
C.Y = B.Y + d * ABX / Len 

Note that for geographic coordinates (Lat/Long) and large distances result is not exact.

Link for further reference (sections Bearing then Destination point given distance and bearing from start point)

Upvotes: 6

Related Questions