Finding equations of tangent lines to a circle

9 views (last 30 days)
Given the position vectors of a point A and the center of a circle B of radius r,
pA = [pAx; pAy];
pB = [pBx; pBy];
r = 2;
Using this data alone, is it possible to find the position vectors of tangent points H and K drawn from point A to the circle B? I would then use this information to form equations of tangent lines AH and AK

Accepted Answer

John D'Errico
John D'Errico on 8 Jul 2017
Edited: John D'Errico on 8 Jul 2017
WTP? When all else fails, apply Pythagoras. I'll be lazy, and just throw it into solve.
P1 = [22; 20];
P2 = [31; 26];
r = 2.5;
syms xh yh
Q = [xh;yh];
% Q lies on the circle.
E1 = r^2 - [1 1]*(P2 - Q).^2 == 0;
% Pythagoras applies
E2 = [1 1]*(P1 - P2).^2 == r^2 + [1 1]*(Q - P1).^2
res = solve(E1,E2);
res.xh
ans =
(5*443^(1/2))/78 + 1587/52
1587/52 - (5*443^(1/2))/78
vpa(res.xh)
ans =
31.868433665374947976737252727146
29.170027873086590484801208811316
res.yh
ans =
2003/78 - (5*443^(1/2))/52
(5*443^(1/2))/52 + 2003/78
vpa(res.yh)
ans =
23.655682835270911368227454242615
27.70329152370344760613152011636
Two solutions, because there are two tangents. Surely you can do the rest.
Be careful when you plot things, because if the x and y axes do not use the same scale, the lines won't appear to be tangent. Of course then the circle won't appear to be circular either.
t = linspace(0,2*pi,100);
plot([P1(1),P2(1)],[P1(2),P2(2)],'-ro')
hold on
axis equal
grid on
plot(P2(1) + r*cos(t),P2(2) + r*sin(t),'b-')
plot(double(res.xh(1)),double(res.yh(1)),'go')
plot(double(res.xh(2)),double(res.yh(2)),'go')
Looks right to me. So WTP?
Just for kicks, there is another approach we can try.
Given the two points P1 and P2, and a radius r, solve for the point Q=(x,y), such that the vectors formed from (Q-P1) and (Q-P2) are orthogonal, as well, we need the distance, norm(Q-P2) to be r.
That is, we have one equation
(Q-P1).'*(Q-P2) == 0
as well as
norm(Q-P2) == r
The latter can be written as
(Q-P2).'*(Q-P2) == r^2
Again, solve could be used here to solve the problem, and we should recover the same two solutions.
Hmm. How about a simple alternative solution that has no need for the symbolic toolbox? Again, we rely on the presence of a right triangle. But this time, we will use trig.
P1 = [22; 20];
P2 = [31; 26];
r = 2.5;
Assume the angle between the line connecting P1 and P2 and the tangent line is theta. Assume the tangent line touches the circle at point Q. Then {P1,Q,P2} forms a right triangle, with hypotenuse as the edge {P1,P2}. We get theta from the sine relation:
sin(theta) = r/norm(P2-P1)
Therefore
theta = asin(r/norm(P2-P1))
By default here, theta will be positive, but -theta will also suffice to get the other tangent line. So what is the angle of the tangent line? The two tangent lines fall at angles:
psi = atan2(P2(2)-P1(2),P2(1)-P1(1)) + [-1 1]*theta
psi =
0.35477 0.82124
How far along those tangent lines do they touch the circle? So what is the length of that segment?
L = cos(theta)*norm(P2-P1)
L =
10.524
This makes perfect sense, since remember the distance between points P1 and P2 was
norm(P1-P2)
ans =
10.817
Q = [P1,P1] + L*[cos(psi);sin(psi)]
Q =
31.868 29.17
23.656 27.703
Q has two columns, corresponding to the two tangent points. Happily, they are the same that we found using the symbolic toolbox. Note that this last expression can be made slightly simpler if we are using the latest (R2017) MATLAB release. I could then have written it as
Q = P1 + L*[cos(psi);sin(psi)]
Q =
31.868 29.17
23.656 27.703
  10 Comments
Image Analyst
Image Analyst on 8 Jul 2017
That's fine. No worries. You provided an excellent answer (that I voted for).
Lee Quan
Lee Quan on 10 Jul 2017
Wonderfully explained! Thanks again, John!
Sorry for the trouble, Image Analyst.

Sign in to comment.

More Answers (1)

Image Analyst
Image Analyst on 7 Jul 2017
Yes. Find point H, knowing that angle AHB is a right angle. Then knowing points H and A (or K and A) you can use the regular point-slope formula for the equation of a line.
  2 Comments
John D'Errico
John D'Errico on 8 Jul 2017
Basic geometry. The trick is in recognizing where you can draw a right triangle. Once you have that, the problem becomes trivial. Pythagoras saves the day again.
Lee Quan
Lee Quan on 8 Jul 2017
Edited: Lee Quan on 8 Jul 2017
Based on Roger's code,
P1 = [22; 20];
P2 = [31; 26];
r = 2.5;
P = P1-P2;
d2 = dot(P,P);
Q0 = P2+r^2/d2*P;
T = r/d2*sqrt(d2-r^2)*P*[0,1;-1,0]; % points from Q0 to Q1
Q1 = Q0+T
Q2 = Q0-T
Could you please tell me how to correct the error in the expression for T?

Sign in to comment.

Categories

Find more on Mathematics in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!