Function Repository Resource:

IsogonalConjugate

Source Notebook

Get the isogonal conjugate of a point with respect to a triangle or tetrahedron

Contributed by: Ed Pegg Jr

ResourceFunction["IsogonalConjugate"][simplex,p]

gives the isogonal conjugate of point p with respect to the triangle or tetrahedron simplex.

Details

The simplex may be a triangle defined by three 2D points, a tetrahedron defined by four 3D points or an n-simplex defined by n+1 points.
Given a triangle ΔABC, the isogonal conjugate of P is constructed by reflecting the lines PA, PB and PC about the angle bisectors and taking the intersection.
Given a tetrahedron ABCD, the isogonal conjugate of P is constructed by reflecting the lines PA, PB, PC and PD about the angle bisectors of the dihedral edges and taking the intersection.
In triangle ΔABC, the trilinear coordinates of a point are the ratio a:b:c of signed distances to the sides. The trilinear coordinates of the isogonal conjugate are the ratio a-1:b-1:c-1.
In tetrahedron ABCD, the barycentric coordinates of a point are the ratio of signed volumes of the four tetrahedra points by replacing a vertex with the point a:b:c:d. Let ΔA be the squared face area of ΔBCD. The barycentric coordinates of the isogonal conjugate are then ΔA/a:ΔB/b:ΔC/c:ΔD/d.

Examples

Basic Examples (2) 

Compute the isogonal conjugate of a point with respect to a given triangle:

In[1]:=
ResourceFunction[
 "IsogonalConjugate"][{{5, 2}, {4, 5}, {0, -4}}, {1, 0}]
Out[1]=

Find the isogonal conjugate of a point with respect to a triangle:

In[2]:=
tri = {{7, 2}, {4, 5}, {0, 1}};
p = {3, 3};
i = ResourceFunction["IsogonalConjugate"][tri, p]
Out[4]=

The isogonal conjugate of the isogonal conjugate is the original point:

In[5]:=
ResourceFunction["IsogonalConjugate"][tri, i]
Out[5]=

Show the triangle, point (green) and isogonal conjugate (blue):

In[6]:=
Graphics[{EdgeForm[Black], White, Polygon[tri],
  Green, Disk[p, .1], Blue, Disk[i, .1], Red, Line /@ Tuples[{tri, {p, i, Insphere[tri][[1]]}}] }]
Out[6]=

The centers of the incircle and excircles are the only four self-conjugate points:

In[7]:=
four = Sort[
  Prepend[First /@ ResourceFunction["Exspheres"][tri], First[Insphere[tri]]]]
Out[7]=
In[8]:=
ResourceFunction["IsogonalConjugate"][tri, #] & /@ four
Out[8]=
In[9]:=
Sort[{a, b} /. Solve[ResourceFunction["IsogonalConjugate"][tri, {a, b}] == {a, b}]]
Out[9]=

The product of trilinear coordinates for a point and isogonal conjugate gives three identical values:

In[10]:=
baryP = ResourceFunction["BarycentricCoordinates"][tri, p];
baryI = ResourceFunction["BarycentricCoordinates"][tri, i];
sides = Reverse[EuclideanDistance @@ # & /@ Subsets[tri, {2}]];
trilinearP = (baryP/sides);
trilinearI = (baryI/sides);
trilinearP  trilinearI
Out[15]=

Scope (3) 

Compute the isogonal conjugate of a Point with respect to a Triangle:

In[16]:=
ResourceFunction["IsogonalConjugate"][
 Triangle[{{0, 0}, {1, 2}, {2, 1}}], Point[{-1, 1}]]
Out[16]=

Compute the isogonal conjugate of a Point with respect to a Tetrahedron:

In[17]:=
ResourceFunction["IsogonalConjugate"][
  Tetrahedron[], {-1, 0, 1}] // FullSimplify
Out[17]=

Compute the isogonal conjugate of a 5D point with respect to a simplex:

In[18]:=
ResourceFunction[
 "IsogonalConjugate"][{{2, -2, 2, -1, 3}, {-3, 3, 1, 3, 2}, {2, 0, 1, -3, -3}, {-2, 1, 1, 1, 1}, {1, 2, 0, -1, -1}, {0, 1, 3, 1, 1}}, {1, 0, -1, 0, 1}]
Out[18]=

Find the Monge point of a semi-random tetrahedron:

In[19]:=
randomtetra = Select[ResourceFunction["SignedPermutations"][12 {1, 1, 1}], EvenQ[Count[Sign[#], -1]] &] + RandomSample[Tuples[{1, 0, -1}, {3}], 4];
mongefull = ResourceFunction["Monge"][randomtetra];
monge = First[mongefull]
Out[21]=

Find the isogonal conjugate of the Monge point:

In[22]:=
isog = ResourceFunction["IsogonalConjugate"][randomtetra, monge]
Out[22]=

The circumsphere of the face reflections of a point is centered at the isogonal conjugate (and vice-versa):

In[23]:=
reflectM = Flatten[ResourceFunction["ReflectPoints"][#, {monge}] & /@ Subsets[randomtetra, {3}], 1];
reflectI = Flatten[ResourceFunction["ReflectPoints"][#, {isog}] & /@ Subsets[randomtetra, {3}], 1];
Graphics3D[{Sphere[#, 1] & /@ randomtetra,
  {Red, Sphere[monge, 1], Sphere[#, 1/2] & /@ reflectM}, {Green, Sphere[isog, 1], Sphere[#, 1/2] & /@ reflectI},
  Opacity[.5], Tetrahedron[randomtetra], Opacity[.2],
  Circumsphere[reflectM], Circumsphere[reflectI]}, Boxed -> False]
Out[25]=

Neat Examples (2) 

For a tetrahedron, calculate the five insphere and exsphere points:

In[26]:=
tetra = {{-120, 300, 0}, {-120, 160, -280}, {-120, 720, -840}, {720, -540, 0}};
five = Prepend[First /@ ResourceFunction["Exspheres"][tetra], First[Insphere[tetra]]]
Out[27]=

These five points are all equal to their isogonal conjugates:

In[28]:=
ResourceFunction["IsogonalConjugate"][tetra, #] & /@ five
Out[28]=

Three other points are their own isogonal conjugate in a tetrahedron:

In[29]:=
same = {{-540, 720, -1260}, {-288, 216, 0}, {720, -1800, 0}};
ResourceFunction["IsogonalConjugate"][tetra, #] & /@ same
Out[30]=

Show the 16 collinear sets of three points formed by four tetrahedral points and eight self-conjugates:

In[31]:=
pp = Join[tetra, five, same];
lines = ResourceFunction["FindExtraordinaryLines"][pp];
ordinary = Complement[Subsets[Range[12], {2}], Flatten[Subsets[#, {2}] & /@ lines, 1]];
Graphics3D[{Sphere[#, 40] & /@ pp, Line[pp[[#]]] & /@ lines, Opacity[.5], Tetrahedron[tetra], Green, InfiniteLine[pp[[#]]] & /@ ordinary}, Boxed -> False]
Out[34]=

Find intersection points and repeat to obtain 50 lines:

In[35]:=
other = Complement[First /@ Select[RegionIntersection /@
     Subsets[
      Join[InfiniteLine[pp[[#]]] & /@ ordinary, InfiniteLine[pp[[#]]] & /@ lines], {2}], Head[#] === Point &], pp]; qq = Join[pp, other];
lines2 = ResourceFunction["FindExtraordinaryLines"][qq];
Graphics3D[{Sphere[#, 40] & /@ qq, Line[qq[[#]]] & /@ lines2, Opacity[.5], Tetrahedron[tetra]}, Boxed -> False, SphericalRegion -> True]
Out[37]=

The following triangle has nice Euler line points for the circumcenter, centroid, nine-point center and orthocenter:

In[38]:=
tri = {{-14, -6}, {10, -6}, {4, 12}};
euler = ResourceFunction["EulerLinePoints"][tri]
Out[39]=

The Jerabek hyperbola is the locus of the isogonal conjugates of points on the Euler line. Use GroebnerBasis to derive the implicit equation:

In[40]:=
jerabek = GroebnerBasis[{\[FormalX], \[FormalY]} == ResourceFunction["IsogonalConjugate"][
     tri, (1 - \[FormalU]) euler[[
        1]] + \[FormalU] euler[[-1]]], {\[FormalX], \[FormalY]}, \[FormalU]][[1]]
Out[40]=

The isogonal conjugates of the Euler points are the orthocenter, symmedian, Kosnita point and circumcenter:

In[41]:=
ResourceFunction["IsogonalConjugate"][tri, #] & /@ euler
Out[41]=

A graphic of the triangle with the Euler line (blue), circumcenter|circumcircle|perpendicular bisectors (red), centroid|medians (cyan), nine-point center|circle (brown) and orthocenter|altitudes (green) and the isogonal conjugate of the Euler line, the Jerabek hyperbola:

In[42]:=
mids = Mean /@ Subsets[Reverse[tri], {2}];
otherthree = Mean[{#, euler[[4]]}] & /@ tri;
Legended[
 Graphics[{EdgeForm[Black], White, Thick, Triangle[tri], Blue, InfiniteLine[Take[euler, 2]], Thin, Red, InfiniteLine[{euler[[1]], #}] & /@ mids, Circumsphere[tri], Disk[euler[[1]], 0.2], Cyan, InfiniteLine /@ Transpose[{tri, mids}], Disk[euler[[2]], 0.2], Brown, Circle[euler[[3]], EuclideanDistance[euler[[3]], mids[[1]]]], Disk[#, 0.1] & /@ otherthree, Disk[euler[[3]], 0.2], Green, InfiniteLine[{euler[[4]], #}] & /@ tri, Disk[euler[[4]], 0.2],
   ContourPlot[
     jerabek == 0 // Evaluate, {\[FormalX], -15, 13}, {\[FormalY], -14, 14}][[1]]}], PointLegend[{Red, Cyan, Brown, Green}, {"circumcenter", "centroid", "nine-point center", "orthocenter"}, LegendMarkers -> ConstantArray[Graphics[Disk[]], 3]]]
Out[43]=

Version History

  • 1.1.0 – 22 August 2022
  • 1.0.0 – 19 August 2022

Related Resources

License Information