Finding equations of tangent lines to a circle

조회 수: 10 (최근 30일)
Lee Quan
Lee Quan 2017년 7월 7일
댓글: Lee Quan 2017년 7월 10일
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

채택된 답변

John D'Errico
John D'Errico 2017년 7월 8일
편집: John D'Errico 2017년 7월 8일
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
Image Analyst
Image Analyst 2017년 7월 8일
That's fine. No worries. You provided an excellent answer (that I voted for).
Lee Quan
Lee Quan 2017년 7월 10일
Wonderfully explained! Thanks again, John!
Sorry for the trouble, Image Analyst.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Image Analyst
Image Analyst 2017년 7월 7일
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
John D'Errico
John D'Errico 2017년 7월 8일
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 2017년 7월 8일
편집: Lee Quan 2017년 7월 8일
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?

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Mathematics에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by