Cyclologic Triangles

Author

Eric W. Weisstein
August 12, 2026

This notebook downloaded from https://mathworld.wolfram.com/notebooks/PlaneGeometry/CyclologicTriangles.nb.

For more information, see Eric's MathWorld entry https://mathworld.wolfram.com/CyclologicTriangles.html.

©2026 Wolfram Research, Inc. except for portions noted otherwise

Illustration

The blue circles meet at P, while the reciprocal orange circles meet at P'.

Module[{a, ap, b, bp, c, circleData, circleIntersections, cp, first, labelBackground, 
   neutral, p, pp, second}, {a, b, c, ap, bp, cp} = {{-1.4606741573, -0.3370786517}, 
     {1.5068493151, -0.6849315068}, {0.1015228426, 1.421319797}, {1.2346793487, 0.9002851161}, 
     {0.4197123905, -0.1334839109}, {1.2265381482, -0.8415280637}}; p = {0, 0}; 
   neutral = LightDarkSwitched[Black, White]; labelBackground = LightDarkSwitched[White, Black]; 
   circleData[{u_, v_, w_}] := Module[{center}, 
     center = LinearSolve[2*{v - u, w - u}, {v . v - u . u, w . w - u . u}]; 
      {center, Norm[center - u]}]; circleIntersections[{c1_, r1_}, {c2_, r2_}] := 
    Module[{d, distance, foot, height, normal}, d = Norm[c2 - c1]; 
      distance = (r1^2 - r2^2 + d^2)/(2*d); height = Sqrt[Max[0, r1^2 - distance^2]]; 
      foot = c1 + distance*((c2 - c1)/d); normal = {-1, 1}*Reverse[(c2 - c1)/d]; 
      {foot + height*normal, foot - height*normal}]; 
   first = circleData /@ {{a, bp, cp}, {b, cp, ap}, {c, ap, bp}}; 
   second = circleData /@ {{ap, b, c}, {bp, c, a}, {cp, a, b}}; 
   pp = First[MaximalBy[circleIntersections[second[[1]], second[[2]]], Norm[#1 - c] & ]]; 
   Graphics[{Directive[Blue, AbsoluteThickness[2], Opacity[0.58]], Circle @@@ first, 
     Directive[Red, AbsoluteThickness[2], Opacity[0.58]], Circle @@@ second, 
     Directive[neutral, AbsoluteThickness[2], Opacity[1]], Line[Append[{a, b, c}, a]], 
     Line[Append[{ap, bp, cp}, ap]], Directive[PointSize[0.022], Blue], Point[p], 
     Directive[PointSize[0.022], Red], Point[pp], Directive[PointSize[0.013], neutral], 
     Point[{a, b, c, ap, bp, cp}], Text[Style["P", 17, Blue, Background -> labelBackground, 
       FontFamily -> "Times", FontSlant -> "Italic"], p + {-0.12, 0.14}], 
     Text[Style["P'", 17, Red, Background -> labelBackground, FontFamily -> "Times", 
       FontSlant -> "Italic"], pp + {-0.14, -0.14}]}, PlotRange -> {{-2, 2}, {-1.5, 2}}]]