Blog Μαθηματικών και Εκπαιδευτικών Θεμάτων

Proof of Problem 10 – A Geometric Locus: Isogonal Image of a Line

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$$

Python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
import sympy as sp
def 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_eq
if __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.

The graph of the ellipse.

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.

The graph of the hyperbola.

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$$

The graph of the parabola.
Fediverse reactions

Discover more from Blog Μαθηματικών και Εκπαιδευτικών Θεμάτων

Subscribe now to keep reading and get access to the full archive.

Continue reading