# Finding Points of Tangency of a Circle and a Parametric Curve

I have the following Parametric plot

Generated from the following:

Manipulate[
ParametricPlot[{(A*Cos[t]^2 + B)*{Cos[t], Sin[t]},
C*{Cos[t] + 1, Sin[t]}}, {t, 0, 2*Pi},
PlotRange -> {{-5, 5}, {-5, 5}}], {A, 1, 10}, {B, 1, 10}, {C, 1,
10}]


I would like to find the exact values of $C$ and $t$ such that the inner circle, with one point fixed to the origin is tangent to the outer curve. This would mean, if I'm not mistaken, for $t\in\left[0,\pi/2\right]$, solving the following system of equations for $t$ and $C$

x1 = (A*Cos[t]^2 + B)*Cos[t]
y1 = (A*Cos[t]^2 + B)*Sin[t]
x2 = C*(Cos[t] + 1)
y2 = C*Sin[t]
x1 == x2
y1 == y2


i.e. find the intersection of the curves, but also they should have the same tangent, so we have:

D[y1,t]/D[x1,t] == D[y2,t]/D[x2,t]


But, for some reason I can't find a solution. What am I doing wrong?

• You might want to avoid using C, D, I, or N as constants in Mathematica. More generally, use initial lowercase for your constants. Mar 21, 2014 at 23:48
• Did mean for the circle to be osculating or merely tangent? Mar 22, 2014 at 0:07
• yes, just tangent is enough.
– okj
Mar 22, 2014 at 0:27

You don't have to calculate anything by hand in MMA. Use D and Cross to formulate your expectations.

### One solution can be found analytically:

ClearAll[a, b , p1, p2, c]
p1[t_] := (a Cos[t]^2 + b)*{Cos[t], Sin[t]}
p2[t_] := c*{Cos[t] + 1, Sin[t]}

Solve[{
Cross[D[p1[t], t]].D[p2[t], t] == 0,
p1[t] == p2[t],
0 <= t <= Pi/2, c > 1
}, {t, c}, Reals] // Normal

{{t -> 0, c -> (a + b)/2}}


### General case with a and b fixed:

a = 5; b = 1;
sol = NSolve[{
Cross[D[p1[t1], t1]].D[p2[t2], t2] == 0,
p1[t1] == p2[t2],
c > 1,
0 <= t1 <= Pi, 0 <= t2 <= Pi}, {t1, t2, c}, Reals]

{{t1 -> 0, t2 -> 0, c -> 3.}, {t1 -> 1.10715, t2 -> 2.2143, c -> 2.23607}}

ParametricPlot[Evaluate[Join @@ ({p1[t], p2[t]} /. sol)], {t, 0, 2 Pi},
PlotRange -> {{0, 8}, {-3, 3}}, AspectRatio -> Automatic,
Epilog -> { [email protected], Green, p2[t2] /. sol // Point},
PlotStyle -> {Black, Red, Black, Blue}, BaseStyle -> Thick]


### Edit: with FindRoot it can be instantaneous:

(trivial soluion is not calculated)

ClearAll[a, b, p1, p2, c]
p1[t_, a_, b_] := (a Cos[t]^2 + b)*{Cos[t], Sin[t]}
p2[t_, c_] := c*{Cos[t] + 1, Sin[t]}

Manipulate[
sol = FindRoot[{Cross[D[p1[t1, a, b], t1]].D[p2[t2, c], t2] == 0,
p1[t1, a, b] - p2[t2, c] == 0},
{{t1, Pi/2.}, {t2, Pi/2.}, {c, a}}];

ParametricPlot[ Evaluate[{p1[t, a, b], p2[t, c] /. sol}], {t, 0, 2 Pi},
PlotRange -> {{-15, 15}, {-10, 10}}, AspectRatio -> Automatic,
PlotStyle -> {Orange, Blue}, BaseStyle -> Thick, ImageSize -> 600,
Epilog -> {[email protected], Red, p2[t2, c] /. sol // Point,
Point[{(a + b), 0}], Blue, Circle[{(a + b)/2, 0}, (a + b)/2]},
]
, {a, 1, 10}, {b, 1, 5}]


• Why does not the following directly work?ClearAll[a, b, p1, p2, c] a = 5.; b = 1; p1[t_, c_] := (a Cos[t]^2 + b)*{Cos[t], Sin[t]} p2[t_, c_] := c*{Cos[t] + 1, Sin[t]} NSolve[{Cross[D[p1[t, c], t]].D[p2[t, c], t] == 0, p1[t, c] == p2[t, c], 0 <= t <= Pi/2}, {t, c}, Reals] // Normal Sep 16, 2014 at 12:37

--- edit ---

I forgot to address an issue which I now see was raised in a comment by @Michael E2. This setup is only going to give a tangent circle. If it osculates it is largely by accident. (Outright snogging, now that might be intentional.)

--- end edit ---

The issue is that these curves need not intersect at the same value of the parameter. So you can proceed as below.

aa = 2;
bb = 1;
x1[t_] = (aa*Cos[t]^2 + bb)*Cos[t];
y1[t_] = (aa*Cos[t]^2 + bb)*Sin[t];
x2[t_] = cc*(Cos[t] + 1);
y2[t_] = cc*Sin[t];
eqns = Flatten[{x1[t1] - x2[t2],
y1[t1] - y2[t2], {D[x1[t1], t1], D[y1[t1], t1]} -
lam*{D[x2[t2], t2], D[y2[t2], t2]}}];
sol = Solve[
GroebnerBasis[eqns, {t1, t2, cc}, lam] == 0 && 0 <= t1 <= Pi/2 &&
0 <= t2 <= 2*Pi, {cc, t1, t2}]

(* {{cc -> 3/2, t1 -> 0, t2 -> 0}, {cc -> 3/2, t1 -> 0,
t2 -> 2 \[Pi]}, {cc -> Sqrt[2], t1 -> -2 ArcTan[1 - Sqrt[2]],
t2 -> -4 ArcTan[1 - Sqrt[2]]}} *)

{x1[t1], x2[t2], y1[t1], y2[t2]} /. sol // N

(* Out[304]= {{3., 3., 0., 0.}, {3., 3., 0.,
0.}, {-1.41421356237, -1.41421356237, 1.41421356237,
1.41421356237}, {1.41421356237, 1.41421356237, 1.41421356237,
1.41421356237}} *)


A careful look will indicate that there are two such circles. One intersects at the east-most crossing of the x axis.

p1 = ParametricPlot[{x1[t], y1[t]}, {t, 0, 2*Pi},
ColorFunction -> (Green &)];
p2 = ParametricPlot[{x2[t], y2[t]} /. sol[[1]], {t, 0, 2*Pi},
ColorFunction -> (Blue &)];
p3 = ParametricPlot[{x2[t], y2[t]} /. sol[[3]], {t, 0, 2*Pi},
ColorFunction -> (Red &)];

Show[p1, p2, p3]


• +1 because of GroebnerBasis Mar 21, 2014 at 23:55
• I think you may explain the role of lam Mar 22, 2014 at 0:03
• @Artes Yep, I understand. I was thinking that Daniel's explanation could enrich his answer. Thanks! Mar 22, 2014 at 0:15
• @belisarius Well, I needed to sacrifice a variable. Okay, I could have cross multiplied I guess. But that lam is still getting fleeced. Mar 22, 2014 at 0:15
• It fails to take into account that the two curves are parametrized, and the intersection point(s) of interest need not arise from the same value of the respective parameters. Ergo, you need two separate time parameters. Mar 22, 2014 at 0:38