Function Repository Resource:

Exparabolas

Source Notebook

Describe three parabolas tangent to the three sides of a triangle analogous to the excircles

Contributed by: Shenghui Yang

ResourceFunction["Exparabolas"][{p1,p2,p3},λ1,λ2,λ3]

returns properties of three external contact parabolas of a triangle with vertices {p1,p2,p3} given a triplet of affine parameters {λ1,λ2,λ3}.

Details

Given a triangle A1A2A3, the specified contact point within the segment of A2A3 (opposite to A1) is A2+λ1·(A3-A2) with 0<λ1<1. The same rule applies for λ2 and λ3.
For numerical stability, the accepted range of the affine parameters is 0.02<=λi<=0.98 for i=1,2,3.
The function returns an Association for each exparabola.
Each exparabola contains the following entries:
"ImplicitEquation"The implicit equation for the parabola in terms of x and y
"ParametricEquation"The parametric equation for the parabola in terms of t
"Focus"The focus point of the contact parabola
"Vertex"The vertex point of the contact parabola
"Directrix"The directrix expressed as an InfiniteLine object
"ContactPoints"The three contact points on the parabola
The foci of these contact parabolas are on the circumcircle of the reference triangle. This is the result of the geometric property of Simson line.
The directrixes of these contact parabolas are through the orthocenter of the reference triangle.
A surprisingly elegant fact is that the parabolas determined by the foci and directrix above always tangent to the three sides of the reference triangle: one contact point is on one side and the other two are on the extension line of the other two sides.
Given a triangle A1A2A3, the returned parabolas are ordered such that the parabola with the internal contact point on the opposite side of A1 comes first, that of A2 comes the second and that of A3 comes the last.
ResourceFunction["Exparabolas"][{p1,p2,p3}, …] is equivalent to ResourceFunction["Exparabolas"][Triangle[{p1,p2,p3}], …].

Examples

Basic Examples (2) 

Compute the three contact parabolas given affine contact locations on each side of the reference triangle opposite to the vertices:

In[1]:=
tri = {{0, 0}, {1.9, -0.5}, {0.9, 1.9}};
ResourceFunction["Exparabolas"][tri, .5, .5, .5]
Out[2]=

Tabulate the results above:

In[3]:=
Dataset[%]
Out[3]=

Scope (2) 

Visualize three external contact parabolas, the contact points and the reference triangle using ContourPlot:

In[4]:=
tri = {{0, 0}, {2, -0.5}, {0.9, 1.9}};
parabs = ResourceFunction["Exparabolas"][tri, .6, .6, .4];
eqns = #["ImplicitEquation"] & /@ parabs;
In[5]:=
ContourPlot[
 eqns, {\[FormalX], -5, 5}, {\[FormalY], -5, 5}, Epilog -> {
   {Gray, Triangle[tri]},
   {Dashed, InfiniteLine[tri[[#]]] & /@ {{1, 2}, {2, 3}, {3, 1}}},
   {StandardYellow, PointSize[Large], Point /@ (#["ContactPoints"] & /@ parabs)}
   }
 ]
Out[5]=

Visualize three external contact parabolas and the reference triangle using ParametricPlot with parametric expressions:

In[6]:=
tri = {{0, 0}, {2, -0.5}, {0.9, 1.9}};
parabs = ResourceFunction["Exparabolas"][tri, .6, .6, .4];
Column[paraEqn = #["ParametricEquation"] & /@ parabs]
Out[7]=
In[8]:=
ParametricPlot[
 paraEqn, {\[FormalT], -10, 10}, PlotRange -> {{-4, 5.5}, {-4, 5.5}}, Epilog -> {
   {Gray, Triangle[tri]},
   {Dashed, InfiniteLine[tri[[#]]] & /@ {{1, 2}, {2, 3}, {3, 1}}},
   {StandardYellow, PointSize[Large], Point /@ (#["ContactPoints"] & /@ parabs)}
   }]
Out[8]=

Properties and Relations (3) 

Visualize three external contact parabolas and their foci (blue). The foci are on the circumcircle of triangle ABC according to Lambert's theorem:

In[9]:=
label[sym_, Point[pos_]] := {PointSize[Scaled[0.053]], Hue[0.58, 1, 1],
    Point[pos], Text[Style[sym, White, FontSize -> Scaled[0.03]], pos]};
In[10]:=
tri = {{0, 0}, {2, -0.5}, {0.9, 1.9}};
parabs = ResourceFunction["Exparabolas"][tri, .3, .35, .4];
eqns = #["ImplicitEquation"] & /@ parabs;
foc = #["Focus"] & /@ parabs;
In[11]:=
ContourPlot[
 eqns, {\[FormalX], -3, 5}, {\[FormalY], -3, 5}, Epilog -> {
   {Gray, Triangle[tri]}, {StandardBlue, PointSize[0.016], Point[foc]},
   {Dashed, InfiniteLine[tri[[#]]] & /@ {{1, 2}, {2, 3}, {3, 1}}},
   {Dashed, Thickness[0.002], TriangleConstruct[tri, "Circumcircle"]},
   MapThread[label[#1, Point@#2] &, {{"A", "B", "C"}, tri}]
   }
 ]
Out[11]=

The lines (orange) that link contact points and opposite vertices are concurrent at the generalized Gergonne point:

In[12]:=
tri = {{0, 0}, {3, .2}, {0.9, 1.9}};
parabs = ResourceFunction["Exparabolas"][tri, .55, .2, .3];
eqn = (#["ImplicitEquation"] & /@ parabs)[[1]];
ctnts = (#["ContactPoints"] & /@ parabs)[[1]];
In[13]:=
ContourPlot[
 eqn, {\[FormalX], -.5, 7}, {\[FormalY], -.5, 4},
 Epilog -> {
   {Opacity[0.6], Cyan, Triangle[ctnts]},
   {Opacity[0.4], Dashed, InfiniteLine[tri[[#]]] & /@ {{1, 2}, {2, 3}, {3, 1}}},
   {StandardOrange, Thick, MapThread[InfiniteLine[{#1, #2}] &, {tri, ctnts}]},
   {Transparent, EdgeForm[{Opacity[0.9], Thickness[0.006]}], Triangle[tri]},
   {StandardBlue, PointSize[0.02], Point@ctnts}
   }, AspectRatio -> 4.5/7.5
 ]
Out[13]=

The area of the triangle formed by the contacts is always twice the area of the reference triangle:

In[14]:=
Area[Triangle[ctnts]]/Area[Triangle@tri]
Out[14]=

The directrix (orange) of the external contact parabola passes through the orthocenter H of the reference triangle ABC:

In[15]:=
tri = {{0, 0}, {3, .2}, {0.9, 1.9}};
parabs = ResourceFunction["Exparabolas"][tri, .55, .2, .3];
eqn = (#["ImplicitEquation"] & /@ parabs)[[1]];
ctnts = (#["ContactPoints"] & /@ parabs)[[1]];
dir = (#["Directrix"] & /@ parabs)[[1]];
In[16]:=
ContourPlot[
 eqn, {\[FormalX], -.5, 7}, {\[FormalY], -.5, 4},
 Epilog -> {
   {Opacity[0.4], Dashed, InfiniteLine[tri[[#]]] & /@ {{1, 2}, {2, 3}, {3, 1}}},
   {StandardOrange, Thick, dir},
   {Transparent, EdgeForm[{Opacity[0.9], Thickness[0.006]}], Triangle[tri]},
   MapThread[label[#1, Point@#2] &, {{"A", "B", "C"}, tri}],
   label["H", TriangleConstruct[tri, "Orthocenter"]],
   {StandardBlue, PointSize[0.02], Point@ctnts}
   }, AspectRatio -> 4.5/7.5
 ]
Out[16]=

Possible Issues (2) 

Exparabola does not evaluate for degenerate triangles:

In[17]:=
tri = {{0, 0}, {0, 1}, {0, 2}};
parabs = ResourceFunction["Exparabolas"][tri, .6, .3, 0.1]
Out[18]=

Exparabola does not evaluate if the affine location of the contact point is not strictly within the side of the triangle:

In[19]:=
tri = {{0, 0}, {1, 2}, {0, 2}};
parabs = ResourceFunction["Exparabolas"][tri, .6, .3, -1]
Out[20]=

Neat Examples (2) 

Plot the external contact parabolas by fixing the first affine parameter. According to Pascal's theorem, there are infinite number of set of {μ1,μ2} in the configuration below such that the six external contact points (on the extension line of each side) share the same conic section:

In[21]:=
tri = {{0, 0.3}, {2, -0.5`}, {0.9, 1.9}};
Manipulate[
 parabs = ResourceFunction["Exparabolas"][tri, .4, \[Mu]1, \[Mu]2];
 cts = Flatten[Rest /@ (#["ContactPoints"] & /@ parabs), 1];
 eqns = #["ImplicitEquation"] & /@ parabs;
 ContourPlot[
  Evaluate[
   Append[eqns, Chop[ResourceFunction["FivePointConic"][cts[[;; 5]]]] == 0]]
  , {\[FormalX], -6, 7}, {\[FormalY], -6, 7}, ContourStyle -> Thickness[0.008], Epilog -> {
    {Opacity[0.4], Dashed, InfiniteLine[tri[[#]]] & /@ {{1, 2}, {2, 3}, {3, 1}}},
    {Opacity[0.4], EdgeForm[{Thickness[0.004]}], Triangle[tri]},
    {StandardBlue, PointSize[0.03], Point[cts]}
    }, ImageSize -> 460], {\[Mu]1, 0.2, 0.8}, {\[Mu]2, 0.2, 0.8}, TrackedSymbols :> {\[Mu]1, \[Mu]2}]
In[22]:=
(* Evaluate this cell to get the example input *) CloudGet["https://www.wolframcloud.com/obj/6fd0d20a-e8a5-444a-be02-2a612a4b586d"]

Nine point cubic curves pass though six external tangent point and three foci:

In[23]:=
tri = {{0, 0.3}, {2, -0.5`}, {0.9, 1.9}};
Manipulate[
 parabs = ResourceFunction["Exparabolas"][tri, \[Lambda], \[Mu], .4];
 eqns = #["ImplicitEquation"] & /@ parabs;
 cts = Flatten[Rest /@ (#["ContactPoints"] & /@ parabs), 1];
 foc = #["Focus"] & /@ parabs;
 cubic = ResourceFunction["NinePointCubic"][pt, {\[FormalX], \[FormalY]}];
 eqns = Append[eqns, cubic == 0];
 pt = cts~Join~foc;
 ContourPlot[
  eqns, {\[FormalX], -4, 6}, {\[FormalY], -4, 6}, PlotPoints -> 60, ImageSize -> 500, ContourStyle -> {
    Directive[Opacity[0.6], StandardOrange],
    Directive[Opacity[0.6], StandardOrange],
    Directive[Opacity[0.6], StandardOrange],
    Directive[Thick, StandardBlue]}, Epilog -> {
    {Opacity[0.4], Dashed, InfiniteLine[tri[[#]]] & /@ {{1, 2}, {2, 3}, {3, 1}}},
    {Opacity[0.4], EdgeForm[{Thickness[0.004]}], Triangle[tri]},
    {Directive[AbsolutePointSize[8], RGBColor[0.922526, 0.385626, 0.209179]], Point[pt]}
    }], {\[Lambda], 0.1, 0.9}, {\[Mu], 0.1, 0.9}, TrackedSymbols :> {\[Lambda], \[Mu]}]
In[24]:=
(* Evaluate this cell to get the example input *) CloudGet["https://www.wolframcloud.com/obj/faf58ba6-640c-48fb-9044-c5a720e4c17b"]

Publisher

Shenghui Yang

Version History

  • 1.0.0 – 29 September 2025

Source Metadata

Related Resources

Author Notes

The linked document by David Altizio shows detailed steps of the proof to explain why the focus point of contact parabola is on the circumcircle on the ref triangle.

License Information