Let \(ABC\) be a triangle in \(\mathbb{P}^2_{\mathbb{R}}\) and \(L\) a line not through any vertex. Then the isogonal conjugate
$$
\mathcal{L} = {\tau(P) : P \in L}
$$
is a circumconic of \(ABC\). Moreover \(\mathcal{L}\) is a parabola, ellipse, or hyperbola according as \(L\) is tangent to, disjoint from, or secant to the circumcircle \(\mathcal{O}\).
Proof
Barycentrics: \(P=[x:y:z]\), \(A=[1:0:0],\ B[0:1:0],\ C= [0:0:1]\), etc. Let \(a=|BC|\), \(b=|CA|\), \(c=|AB|\).

$$
\tau([x:y:z])=[a^{2}yz : b^{2}zx : c^{2}xy], \quad \mathcal{O}: a^{2}yz + b^{2}zx + c^{2}xy =0.
$$
Lemma 1: \(\tau\) is an involution. \(\square\)
Lemma 2: \(P\in\mathcal{O} \iff \tau(P)\in L_{\infty}:X+Y+Z=0\).
Lemma 3: If \(L:\ ux+vy+wz=0\) avoids vertices then \(uvw\ne0\).
For \([X:Y:Z]=\tau([x:y:z])\) we have \(X=a^{2}yz\) etc., hence
$$
x:y:z = \frac{a^{2}}{X} : \frac{b^{2}}{Y} : \frac{c^{2}}{Z}.
$$
Substituting in \(ux+vy+wz=0\):
$$
\mathcal{L}: \; u a^{2} YZ + v b^{2} ZX + w c^{2} XY = 0.
$$
This is degree 2, non-degenerate (\(uvw\ne0\) ), and \(A,B,C\) satisfy it, so \(\mathcal{L}\) is a circumconic.
A conic meets \(L_{\infty}\) in \(0,1,2\) real points iff it is ellipse, parabola, hyperbola. By Lemma 2, \(\mathcal{L}\cap L_{\infty}\) corresponds bijectively to \(L\cap\mathscr{O}\), giving the three cases. \(\blacksquare\)
Below, we provide Python code that can accept parameters \(a=5,\ b=4,\ c=7,\ p=-1.5,\ q=-3\) then, the algorithm gives the equation of the ellipse: $$16.0x^2 + 8.35714285714286xy – 80.0x + 3.92857142857143y^2 – 51.7857142857143y = 0$$
import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.patches import Circleimport sympy as spdef isogonal_locus(a, b, c, d, e, save_name='locus_output.png'): """ A(0,0), B(a,0), C(b,c) Ευθεία: y = d*x + e """ if abs(c) < 1e-12: raise ValueError("Το C δεν μπορεί να είναι στην ευθεία AB, δηλαδή c≠0") # 1. Πλευρές στο τετράγωνο a2 = (a - b)**2 + c**2 # BC^2 b2 = b**2 + c**2 # CA^2 c2 = a**2 # AB^2 # 2. Ευθεία y = d*x + e σε βαρυκεντρικές lx + my + nz = 0 # x = a*Y + b*Z, y = c*Z, X+Y+Z=1 # d*(aY + bZ) + e = cZ => e*X + (d*a + e)*Y + (d*b - c + e)*Z = 0 l = e m = d*a + e n = d*b - c + e # 3. Κωνική σε βαρυκεντρικές: l*a2*Y*Z + m*b2*Z*X + n*c2*X*Y = 0 # Μετατροπή σε καρτεσιανές: X = 1-Y-Z, Y = (c*x - b*y)/(a*c), Z = y/c xs, ys = sp.symbols('x y') Zs = ys / c Ys = (c*xs - b*ys) / (a*c) Xs = 1 - Ys - Zs conic_eq = sp.expand(l*a2*Ys*Zs + m*b2*Zs*Xs + n*c2*Xs*Ys) conic_eq = sp.Eq(conic_eq, 0) # 4. Σχεδίαση def conic_xy(x, y): Z = y / c Y = (c*x - b*y) / (a*c) X = 1 - Y - Z return l*a2*Y*Z + m*b2*Z*X + n*c2*X*Y x_min = min(0, a, b) - 0.5*abs(a) x_max = max(0, a, b) + 0.5*abs(a) y_min = min(0, c) - 0.5*abs(c) y_max = max(0, c) + 0.5*abs(c) x_vals = np.linspace(x_min, x_max, 600) y_vals = np.linspace(y_min, y_max, 600) Xg, Yg = np.meshgrid(x_vals, y_vals) F = conic_xy(Xg, Yg) # Περιγεγραμμένος κύκλος D = 2 * (a*c) if abs(D) > 1e-10: ux = (a**2 * c) / D uy = (a * (b**2 + c**2 - a*b)) / D circ_center = (ux, uy) circ_R = np.hypot(ux, uy) else: circ_center, circ_R = (0, 0), 0 plt.figure(figsize=(8, 8)) plt.contour(Xg, Yg, F, levels=[0], colors='blue', linewidths=2, label='Ισογωνικός τόπος') plt.plot(x_vals, d*x_vals + e, 'r--', label=f'Ευθεία: y = {d}x + {e}') plt.plot([0, a, b, 0], [0, 0, c, 0], 'k-', lw=2, label='Τρίγωνο ABC') plt.scatter([0, a, b], [0, 0, c], c='k', zorder=5) for pt, name in [((0, 0), 'A'), ((a, 0), 'B'), ((b, c), 'C')]: plt.text(pt[0] + 0.1, pt[1] + 0.1, name, fontsize=12) if circ_R > 0: circ = Circle(circ_center, circ_R, fill=False, color='green', ls=':', lw=1.5, label='Περιγεγραμμένος κύκλος') plt.gca().add_patch(circ) plt.gca().set_aspect('equal') plt.grid(True, alpha=0.3) plt.legend() plt.title(f'A(0,0), B({a},0), C({b},{c}) | y={d}x+{e}') plt.tight_layout() plt.savefig(save_name, dpi=150) # Τοπικό path plt.show() return conic_eqif __name__ == "__main__": print("Δώσε τα a,b,c για A(0,0), B(a,0), C(b,c)") a = float(input("a = ")) b = float(input("b = ")) c = float(input("c = ")) print("Δώσε τα d,e για ευθεία y = dx + e") d = float(input("d = ")) e = float(input("e = ")) eq = isogonal_locus(a, b, c, d, e) print("\nΕξίσωση κωνικής:") sp.pprint(eq) print("\nΤο σχήμα αποθηκεύτηκε ως 'locus_output.png'")
The graph illustrating the configuration.

If \(a=5,\ b=4,\ c=7,\ p=-0.5,\ q=3\) then, the algorithm gives the equation of the hyperbola: $$6.0x^2 + 0.785714285714285xy – 30.0x – 3.07142857142857y^2 + 21.7857142857143y = 0$$ with the graph illustrating the configuration.

If \(a=10,\ b=1,\ c=6,\ p=2.2222,\ q=4.5\), (tangent to the circle) hen, the algorithm gives the equation of the parabola: $$-0.7222x^2 – 8.6665xy + 7.222x – 25.9998y^2 + 163.582y = 0$$

