📝 其他
重现几何定理图表Reproducing a geometry theorem diagram
作者在探索一个有趣的几何定理时,发现使用代码重现该定理的图表比定理本身更具挑战性和趣味性。该图表包含一个单位外圆,其中线段 AB 为直径,线段 CD 垂直于该直径。通过猜测坐标点 C = (cos(1), sin(1)),作者逐步推演并尝试还原图表的几何构造过程。文章展示了从数学定理到编程可视化过程中的具体思考步骤和坐标计算技巧。
John
我偶然看到一个几何定理,附有如下图形。
对应该图的定理很有趣,但我发现复现这个图更有趣。
线段 AB 是一条直径,直线 CD 垂直于该直径。
假设外圆是一个单位圆。我猜测 C = (cos(1), sin(1)),并绘制了下图。
我是通过目测猜测 C 的值的,但回想起来,这可能是原图创作者为了方便而选择的一个值。
利用本文给出的圆心和半径方程,绘制三角形的内切蓝圆很容易。绘制另外两个圆(绿圆和橙圆)则比较困难。它们也是内切圆,但并非内切于三角形。它们内切于一个具有两条垂直边和一条圆弧的三边形。
绿圆的半径 r 是从圆心到其各切线的距离。此外,从原点到圆心的距离必须为 1 − r。这就足以建立一个关于 r 的二次方程。同样的推理也适用于橙圆。
原图来自文献 [1],其阐述的定理指出:蓝圆的直径等于绿圆和橙圆的半径之和。
Python 代码
如果你感兴趣,这是绘制该图的代码。
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = ["numpy", "matplotlib"]
# ///
import numpy as np
import matplotlib.pyplot as plt
def connect(A, B, color='gray'):
plt.plot([A[0], B[0]], [A[1], B[1]], color=color, linewidth=2)
def circle(c, r, color='gray'):
t = np.linspace(0, 2*np.pi)
plt.plot(c[0] + r*np.cos(t), c[1] + r*np.sin(t), color=color, linewidth=2)
def quadratic(a, b, c):
det = b**2 - 4*a*c
return ((-b - det**0.5)/(2*a), (-b + det**0.5)/(2*a))
A = np.array([-1, 0])
B = np.array([ 1, 0])
C = np.array([np.cos(1), np.sin(1)])
a = np.linalg.norm(B - C)
b = np.linalg.norm(A - C)
c = np.linalg.norm(B - A)
s = (a + b + c)/2
circle([0,0], 1)
connect(A, B,)
connect(A, C)
connect(C, B)
connect(C, C*np.array([1, -1]))
center = (a*A + b*B + c*C)/(2*s)
radius = 0.5*a*b/s
circle(center, radius, 'C0')
Ex = C[0]
roots = quadratic(1, 2 + 2*Ex, Ex**2 - 1)
r = roots[1] # Smaller root is negaive
print(roots)
center = (r + Ex, -r)
circle(center, r, 'C1')
roots = quadratic(1, 2 - 2*Ex, Ex**2 - 1)
r = roots[1] # Smaller root is negaive
center = (Ex - r, -r)
circle(center, r, 'C2')
plt.gca().set_aspect("equal")
plt.axis("off")
plt.show()[1] Leon Bankoff. A Geometrical Coincidence. Mathematics Magazine, Vol. 37, No. 5 (Nov., 1964), p. 324.
需要完整排版与评论请前往来源站点阅读。