欧几里德图例集锦
Table of Contents
收罗了 tkz-euclide 官方手册1的图例,出自两节:Different authors(用户投稿)和 Some interesting examples(经典几何问题)。每个图例配一段说明:画的是什么、难点在哪、关键代码。图由下方 tikz 代码块直接生成( ob-tikz
执行),说明里的代码只截难点,完整代码在手册里。
本文也是对 slingshot tikz 2的测试
Figure 1: Slingshot TikZ Architecture
测出了不少问题, tkz-euclide 版本间很多细小差异消除在 slingshot tikz
里,具体查看 slingshot 源码。
1. 作者图例
单位圆上的三角函数线。半径 \(AB=1\),角 \(x\) 的终边交圆于 \(C\);过 \(B\) 作切线,与 \(AC\) 交于 \(D\),则 \(BD=\tan x\);过 \(C\) 作 \(AB\) 的垂线,垂足 \(E\),则 \(CE=\sin x\)。\(D\) 的构造是两步:过 \(B\) 作垂线,再与 \(AC\) 求交。
\tkzDefLine[perpendicular=through B,K=1](A,B) \tkzGetPoint{b}
\tkzInterLL(A,C)(B,b) \tkzGetPoint{D}
花括号标注是纯 TikZ 的 decoration ,tkz-euclide 不管这个,得自己写:
\draw [decorate,decoration={brace,amplitude=10pt}]
(D) -- (B) node [midway,xshift=27pt] {$\tan x$};
Figure 2: Code from Andrew Swan
圆 \(O\) 外一点 \(M\),两条割线 \(MAB\)、\(MCA'\),标出 \(\angle
ACB\)、\(\angle AMC\)、\(\angle CAM\) 三个角。麻烦在 \(\angle CAM\)
太小, tkzMarkAngle 默认的标记位置放不下,得用 mkpos=.2 把标记往顶点方向挪:
\tkzMarkAngle[mkpos=.2, size=0.5](A,C,B)
\begin{scope}[veclen]
\tkzMarkAngle[mkpos=.2, size=1.2](C,A,M)
\end{scope}
Figure 3: Example: Dimitris Kapeta
题目:证明 \(AC/CE=BD/DF\)。三条平行线被折线截断,彩色粗线标出要比较的线段。难点在给直线加箭头——TikZ 的 decoration={markings} 配合
=postaction=,tkz 直接透传:
\tikzset{decoration={markings,
mark=at position 3cm with {\arrow[scale=2]{>}}}}
\tkzDrawLines[postaction={decorate}](E,F P,Q R,S)
Figure 4: Example : John Kitzmiller
正方形 \(ABCD\) 绕 \(D\) 转 \(45^\circ\) 得到第二个正方形,两正方形重叠部分涂灰,\(BE=EH\) 用双线标记。旋转一个点、作正方形、求交点,四行:
\tkzDefSquare(A,B) \tkzGetPoints{C}{D}
\tkzDefPointBy[rotation=center D angle 45](C) \tkzGetPoint{G}
\tkzDefSquare(G,D) \tkzGetPoints{E}{F}
\tkzInterLL(B,C)(E,F) \tkzGetPoint{H}
Figure 5: Example 1: from Indonesia
矩形 \(ABFE\) 里作平行线网格,标出各边中点,中间六边形涂色。图本身不难,就是量大:七条平行线、十来个中点、几十个交点,代码八十多行。tkz 里每条平行线都是"作线 + 取交点"两步:
\tkzDefLine[parallel=through D](A,B) \tkzGetPoint{I1}
\tkzInterLL(D,I1)(B,I2) \tkzGetPoint{C}
Figure 6: Example 2: from Indonesia
莫利定理:任意三角形,三个内角的三等分线两两相交,靠近各边的三个交点构成等边三角形(图中 \(t_a t_b t_c\))。难点在"三等分角":tkz 先
tkzFindAngle 量出角,再按 \(1/3\)、\(2/3\) 旋转。换一个三角形,角度自动重算:
\tkzFindAngle(C,A,B) \tkzGetAngle{anglea}
\tkzDefPointBy[rotation=center A angle 1*\anglea/3](C) \tkzGetPoint{TA1}
Figure 7: Illustration of the Morley theorem by Nicolas François
赵爽弦图(代码来自 Nan Geng)。四个直角三角形围成大正方形,中间是斜边上的小正方形。赵爽用"出入相补"证明勾股定理:四个直角三角形加中间正方形,正好补成大正方形。图里 dim 选项画了 \(a\)、\(b\)、\(c\) 三条尺寸线:
\tkzInterCC[R](A, 5)(A', 3) \tkzGetSecondPoint{B}
\tkzDefSquare(A,B) \tkzGetPoints{C}{D}
\tkzDrawSegment[dim={$a$,-10pt,}](D,C')
Figure 8: Gou gu theorem / Pythagorean Theorem by Zhao Shuang
勒洛三角形(Stefan Kottwitz,见《LaTeX Cookbook》第 10 章)。以等边三角形顶点为圆心、边长为半径作三段圆弧,围成等宽曲线——可以当轮子滚。旁边还画了个直角三角形,标注三边和泰勒斯圆。三段弧的填充先用
tkzSetUpArc 统一设置:
\begin{scope}
\tkzSetUpArc[thick,delta=0]
\tkzDrawArc[fill=blue!10](A,B)(C)
\tkzDrawArc[fill=blue!10](B,C)(A)
\tkzDrawArc[fill=blue!10](C,A)(B)
\end{scope}
Figure 9: Reuleaux-Triangle
2. 经典几何问题
手册的 Some interesting examples 一节,大多是几何学史上的经典问题。
只用直尺圆规画出 \(1,\sqrt2,\sqrt3,\dots\):从单位线段出发,每次在直角边上接一段 \(1\),斜边就是下一个根号。十六次重复交给 =foreach=,颜色随步数渐变:
\foreach \i [count=\j] in {0,...,16}{
\tkzDefPointWith[orthogonal normed](a\i,O) \tkzGetPoint{a\j}
\pgfmathsetmacro{\c}{5*\i}
\tkzDrawPolySeg[fill=teal!\c](a\i,a\j,O)}
Figure 10: Square root of the integers
已知线段 \(AB\),求点 \(C\) 使 \(AC=8\) 且 \(\angle ABC=90^\circ\)。尺规思路:过 \(B\) 作 \(AB\) 的垂线,以 \(A\) 为圆心、\(8\) 为半径画圆,交点就是 \(C\)。tkz 的写法几乎是这句话的直译,垂线不用算坐标,
tkzPointResult 直接引用刚生成的点:
\tkzDefPointWith[orthogonal,K=-1](B,A)
\tkzDrawLine[add = .5 and .5](B,tkzPointResult)
\tkzInterLC[R](B,tkzPointResult)(A,8) \tkzGetPoints{J}{C}
Figure 11: About right triangle
阿基米德的一道题:半圆直径 \(AB\),过 \(B\) 的切线与过 \(C\) 的切线交于 \(T\),证明 \(AT\) 平分 \(CD\)。图里 \(D\) 是 \(C\) 在 \(AB\) 上的投影,\(P\) 是交点,=s|= 双标记表示 \(CP=PD\)。\(C\) 的取法很巧:过 \(D\) 作垂线,与以 \(I\) 为圆心、\(4\) 为半径的圆相交,取第二个交点:
\tkzDefLine[orthogonal=through D](A,D)
\tkzInterLC[R](D,tkzPointResult)(I,4) \tkzGetSecondPoint{C}
Figure 12: Archimedes
《几何原本》第 II 卷命题 11:作正方形与矩形等面积。\(E\) 是 \(AD\) 中点,以 \(E\) 为圆心、\(EB\) 为半径的弧交 \(DA\) 延长线于 \(F\), \(AF\) 正好是黄金比;\(AFGH\) 正方形与 \(IGBC\) 矩形面积相等(两处 teal 填充)。交点顺序要小心,=near= 取离 \(B\) 近的那个:
\tkzInterLC[near](B,A)(A,F) \tkzGetFirstPoint{G}
\tkzDrawArc[angles](E,B)(0,120)
\tkzDrawSemiCircle(A,F)
Figure 13: square and rectangle of same area; Golden section
西姆森定理:三角形外接圆上一点 \(M\),向三边作垂线,三个垂足 \(I,J,K\) 共线(西姆森线)。\(M\) 关于三边的对称点 \(P,Q,R\) 也共线(斯坦纳线)。图里 \(M\)、\(N\) 是圆上两点,各画了一套。垂足不用作垂线:反射点与 \(M\) 的中点就是垂足,=reflection= 一次处理三个点:
\tkzDefCircle[circum](A,B,C) \tkzGetPoint{O}
\tkzDefPointsBy[reflection=over A--B](M,N){P,P'}
Figure 14: Steiner Line and Simson Line
希波克拉底月牙(公元前五世纪,希俄斯岛的希波克拉底):等腰直角三角形斜边上的半圆与直角边上的半圆围成的月牙,面积等于三角形面积。这是历史上第一个被证明"面积等于直线图形"的曲线图形。画法的关键是裁剪:先在大圆外裁剪,再画小半圆填充,月牙就"抠"出来了:
\begin{scope}
\tkzClipCircle[out](B,A)
\tkzDefMidPoint(C,A) \tkzGetPoint{M}
\tkzDrawSemiCircle[fill=teal!5](M,C)
\end{scope}
Figure 15: Lune of Hippocrates
海什木月牙(al-Haytham,拉丁名 Alhazen,965—1040):直角三角形两条直角边上的两个月牙,面积和等于三角形面积。画法与希波克拉底月牙一样,两个 scope 各裁剪一次。直角三角形不用算边长,
tkzDefTriangle[pythagore] 直接生成:
\tkzDefTriangle[pythagore,swap](A,B) \tkzGetPoint{C}
\begin{scope}
\tkzClipCircle[out](I,A)
\tkzDrawSemiCircle[fill=teal!5](x,A)
\end{scope}
Figure 16: Lunes of Hasan Ibn al-Haytham
四个半圆两两相交,交叠区域用不同组合涂色。这一节的主题是裁剪:每块颜色一个 scope=,两个 =tkzClipCircle[out] 抠出"两个圆外"的区域再填充。六块颜色六个 scope,写法完全一样:
\begin{scope}
\tkzClipCircle[out](M,B) \tkzClipCircle[out](P,D)
\tkzFillPolygon[teal!20](M,N,P,O)
\end{scope}
Figure 17: About clipping circles
3. 杂志问题:Tangente 与 Le Monde
下面两图出自同一道题,分别来自法国杂志《Tangente》和《世界报》(Le Monde)。原题见 Descartes et les Mathématiques 网站,参考资料:《Tangente》特刊第 8 期习题 11、《世界报》2004 年 2 月 17 日逻辑题 364 号。
两个相似等腰三角形 \(AXB\)、\(BYC\),顶点 \(X\)、\(Y\),\(A,B,C\) 共线,\(\angle AXB=\angle BYC=\alpha\),两三角形"间接"(反向)。再作第三个相似等腰三角形 \(XZY\)。《Tangente》问:证明 \(Z\) 在直线 \(AC\) 上。作图要点:从 \(X\)、\(Y\) 按固定方向取点,再用平移构造第三个三角形,保证相似且反向:
\tkzDefShiftPoint[X](-110:6){A} \tkzDefShiftPoint[X](-70:6){B}
\tkzDefPointBy[translation= from A' to B](Y) \tkzGetPoint{Y}
Figure 18: Revised version of "Tangente"
《世界报》版本:\(Z\) 是线段 \(AC\) 上到 \(X\)、\(Y\) 等距的点,问 \(Z\) 看 \(X\)、\(Y\) 的张角。作图几乎一样,差别只在 \(Z\) 的取法: \(XY\) 的中垂线与 \(AC\) 的交点。图里圆是 \(X,Y,B\) 的外接圆,红色线段 \(XZ\)、\(YZ\) 就是张角的两边:
\tkzDefCircle[circum](X,Y,B) \tkzGetPoint{O}
\tkzDefPointWith[orthogonal](I,Y) \tkzGetPoint{i}
\tkzInterLL(I,i)(A,B) \tkzGetPoint{Z}
Figure 19: "Le Monde" version
4. 三角形的线与圆
三条高交于一点 \(H\)(垂心)。垂足不用"作垂线":以 \(BC\) 中点 \(I\) 为圆心、\(IB\) 为半径的圆(泰勒斯圆)与 \(AC\) 交于 \(B'\),直径 \(BC\) 所对的圆周角 \(\angle BB'C=90^\circ\),\(B'\) 就是垂足。红圆是 \(A,B',C'\) 的外接圆:
\tkzDefMidPoint(C,B) \tkzGetPoint{I}
\tkzInterLC(A,C)(I,B) \tkzGetFirstPoint{B'}
Figure 20: Triangle altitudes
另一种找垂心:以 \(AB\) 为直径的圆与 \(AC\)、\(BC\) 交于 \(M\)、
\(N\),\(BM\perp AC\)、\(AN\perp BC\),交点 \(I\) 就是垂心,\(CI\)
是第三条高。两个圆都用 diameter 选项直接生成。=common=A= 指定公共点,免得取错交点:
\tkzDefCircle[diameter](A,B) \tkzGetPoint{x}
\tkzInterLC[common=A](C,A)(O,A) \tkzGetFirstPoint{M}
Figure 21: Altitudes - other construction
等边三角形内三个等圆,是马尔法蒂问题的特例。马尔法蒂(Gian Francesco
Malfatti)以为三圆各与两条边相切时总面积最大,后来发现一般三角形里并不成立——等边三角形的对称解恰好是对的。圆心是角平分线的交点,切点用
projection 投影得到:
\tkzInterLL(A,N)(M,a) \tkzGetPoint{Ia}
\tkzDefPointBy[projection = onto A--B](Ia) \tkzGetPoint{ha}
\tkzDrawCircles[gray](Ia,ha Ib,hb Ic,hc)
Figure 22: Three circles in an Equilateral Triangle
正弦定理:\(\frac a{\sin A}=\frac b{\sin B}=\frac c{\sin C}=2R\)。证明的关键一步:过 \(B\) 作外接圆直径 \(BD\),\(\angle D=\angle C\)(同弧所对圆周角),\(\sin C=c/2R\)。\(D\) 是 \(B\) 关于圆心 \(O\) 的对称点,一行:
\tkzDefTriangleCenter[circum](A,B,C) \tkzGetPoint{O}
\tkzDefPointBy[symmetry= center O](B) \tkzGetPoint{D}
Figure 23: Law of sines
5. 正多边形与圆
生命之花:六个圆围绕中心圆,交点处再画圆,层层展开。埃及阿比多斯奥西里斯神庙有石刻(Rawles 1997)。画法是一个 foreach 循环:每个圆心都是旋转出来的,循环里生成九种辅助点、画三种圆和六种弧,最后
tkzClipCircle 裁掉外圈:
\foreach \i in {0,...,5}{
\tkzDefPointBy[rotation= center O angle 30+60*\i](A) \tkzGetPoint{a\i}
\tkzDrawCircle(a\i,O)}
\tkzClipCircle(O,f0)
Figure 24: Flower of Life
《几何原本》第 IV 卷命题 11:在给定圆内作正五边形。欧几里得的尺规作法绕了个弯:先找黄金分割。tkz 的实现完全按尺规步骤——\(I\) 是 \(AO\) 中点,圆 \((I,IA)\) 与 \(BO\) 交于 \(E,F\),再以 \(B\) 为圆心、 \(BE\)、\(BF\) 为半径画弧,与圆 \((O,C)\) 相交得到四个顶点:
\tkzDefMidPoint(A,O) \tkzGetPoint{I}
\tkzInterLC(I,B)(I,A) \tkzGetPoints{F}{E}
\tkzInterCC(O,C)(B,E) \tkzGetPoints{D3}{D2}
Figure 25: Pentagon in a circle
正方形内接正五边形,比圆内接版本多一串作图:\(T\) 是半圆与 \(CD\) 的交点,\(H\) 是两个圆的交点,\(M\) 是 \(OH\) 与圆 \((O,E)\) 的交点,再往后 \(Q,P,N\) 依次迭代。每一步都要显式给出圆心和半径点,是手册里最长的纯作图链之一:
\tkzInterCC[with nodes](O,D,I)(E,D,I) \tkzGetSecondPoint{H}
\tkzInterLC(O,H)(O,E) \tkzGetSecondPoint{M}
\tkzInterCC(O,E)(E,M) \tkzGetFirstPoint{Q}
Figure 26: Pentagon in a square
等边三角形内接正六边形,六条边都贴在三边上。\(I\) 是重心,\(c_1\) 是 \(AB\) 上三分之一处的点,以 \(I\) 为圆心、\(Ic_1\) 为半径的圆与三边相交,六个交点就是六边形顶点:
\tkzDefTriangleCenter[centroid](A,B,C) \tkzGetPoint{I}
\tkzDefPointBy[homothety=center A ratio 1./3](B) \tkzGetPoint{c1}
\tkzInterLC(B,C)(I,c1) \tkzGetPoints{a1}{a2}
Figure 27: Hexagon Inscribed version 1
同一道题的另一做法:把三角形绕重心转 \(60^\circ\),两个三角形重叠部分就是正六边形。代码短了一个数量级:
\tkzDefPointsBy[rotation= center I angle 60](A,B,C){a,b,c}
\tkzDrawPolygon[fill=teal!20,opacity=.5](A,B,C)
\tkzDrawPolygon[fill=purple!20,opacity=.5](a,b,c)
Figure 28: Hexagon Inscribed version 2
6. 圆与幂
圆幂定理:\(\overline{MA}\times\overline{MB}=MT^2=MO^2-OT^2\)。\(M\) 是圆外一点,\(MT\) 是切线,\(MAB\) 是割线。切点 \(T\) 用泰勒斯圆找:以 \(MO\) 为直径的圆与原圆相交:
\tkzDefCircle[diameter](M,O) \tkzGetPoint{I}
\tkzInterCC(I,O)(O,E) \tkzGetPoints{T}{T'}
Figure 29: Power of a point with respect to a circle
根轴:到两圆幂相等的点的轨迹,一条垂直于连心线的直线("axe radical" 一词出自法国数学家沙勒)。画法用一个辅助圆(虚线)与两圆相交,公共弦 \(aa'\)、\(bb'\) 的交点 \(X\) 在根轴上,过 \(X\) 作 \(AB\) 的垂线就是根轴:
\tkzInterCC(A,a)(K,k) \tkzGetPoints{a}{a'}
\tkzDrawLines[new,add=2 and 2](a,a')
Figure 30: Radical axis of two non-concentric circles
外位似中心:两圆平行同向半径的端点连线交连心线于固定点 \(O\),\(O\) 外分连心线于半径之比。从 \(O\) 作两圆的切线,切点是 \(T,T'\)。tkz 直接支持"从圆外一点作切线":
\tkzDefLine[tangent from = O](B,M') \tkzGetPoints{X}{T'}
Figure 31: External homothetic center
两圆相离时有四条公切线,图里画两条外公切线。构造思路是把问题化成"过点作切线":辅助圆 \((B,R-r)\) 与连心线交于 \(E,F\),经泰勒斯圆找出切点 \(T'\),过 \(T'\) 的切线与连心线交于 \(O\)——外位似中心;再从 \(O\) 作小圆的切线,得另一条公切线:
\tkzDefMidPoint(A,B) \tkzGetPoint{I}
\tkzInterLC[R](A,B)(B,\rt) \tkzGetPoints{E}{F}
\tkzInterCC(I,B)(B,F) \tkzGetPoints{a}{a'}
Figure 32: Tangent lines to two circles
公切线和根轴一起画:\(D,E\) 是两圆与连心线的交点,\(P,Q\) 是外公切线的切点,\(DP\) 与 \(EQ\) 交于根轴上的点。两圆半径相等时这方法依然成立。找切点的关键:以 \(D,E\) 为直径端点的圆与根轴交于 \(M\),\(MD\)、 \(ME\) 与两圆的交点就是 \(P,Q\):
\tkzDefMidPoint(D,E) \tkzGetPoint{I}
\tkzDrawCircle[orange](I,D)
\tkzInterLC(X,H)(I,D) \tkzGetPoints{M}{M'}
Figure 33: Tangent lines to two circles with radical axis
只用圆规求线段中点(拿破仑问题)。\(B\) 绕 \(A\) 转 \(180^\circ\) 得 \(C\),一连串圆相交,最后以 \(D,E\) 为圆心的两个圆交于 \(M\)——就是中点。全程没有直尺、没有 =DefLine=,只有 =InterCC=:
\tkzInterCC(A,B)(B,A) \tkzGetPoints{I}{I'}
\tkzInterCC(D,B)(E,B) \tkzGetPoints{M}{M'}
Figure 34: Middle of a segment with a compass
7. 反演与阿波罗尼奥斯
阿波罗尼奥斯圆的定义:到两定点 \(A,B\) 的距离之比为常数 \(K\) 的点的轨迹是一个圆。图里 \(K=2\),圆上任意点 \(I\) 满足 \(IA=2\cdot IB\)。 tkz 一行画出这个圆,圆上取点也不用算坐标:
\tkzDefCircle[apollonius,K=2](A,B) \tkzGetPoints{K1}{k}
\tkzDefPointOnCircle[through= center K1 angle 30 point k] \tkzGetPoint{I}
帕普斯项链(公元三世纪,亚历山大里亚):夹在两个相切圆之间的圆链。画法用了反演:先竖着排一串等圆,再以 \(A\) 为反演中心、过 \(C\) 的圆为反演圆,把直线反演成圆、等圆反演成相切圆链。=foreach= 一次画三十三个:
\foreach \i in {-\nc,...,0,...,\nc}{
\tkzDefPoint(\xJ,2*\r*\i){J}
\tkzDefCircleBy[inversion = center A through C](J,H)
\tkzDrawCircle[fill=teal](tkzFirstPointResult,tkzSecondPointResult)}
Figure 35: Application of Inversion : Pappus chain
《引理集》命题 1(阿基米德):两圆切于 \(A\),平行直径 \(CD\)、 \(EF\),则 \(A,C,E\) 共线。\(F\) 是圆 \(O_1\) 上的点,\(E\) 是 \(F\) 关于 \(O_1\) 的对称点,过 \(O_2\) 作 \(EF\) 的平行线交圆 \(O_2\) 于 \(C,D\)。证明用等腰三角形底角相等,两步作图:
\tkzDefPointBy[symmetry=center O_1](F) \tkzGetPoint{E}
\tkzDefLine[parallel=through O_2](E,F) \tkzGetPoint{x}
\tkzInterLC(x,O_2)(O_2,A) \tkzGetPoints{D}{C}
Figure 36: Book of lemmas proposition 1 Archimedes
《引理集》命题 6:半圆 \(AC\) 被 \(B\) 按黄金比分割,\(AB\)、\(BC\) 上再作半圆,与三个半圆都相切的圆的直径 \(GH\),证明 \(BC=2\cdot PC\) (\(P\) 是 \(BC\) 中点)。这是手册里最复杂的图之一:\(M_0,M_1,M_2\) 是内外位似中心,\(O_3\) 是 \(E,F,B\) 的外接圆圆心,后面还有十几步交点。关键在"与三个半圆都相切的圆"——它的圆心由位似中心给出,tkz 直接提供:
\tkzDefGoldenRatio(A,C) \tkzGetPoint{B}
\tkzDefExtSimilitudeCenter(O_1,A)(O_2,B) \tkzGetPoint{M_0}
\tkzDefIntSimilitudeCenter(O,A)(O_1,A) \tkzGetPoint{M_1}
Figure 37: Book of lemmas proposition 6 Archimedes
压轴图:与三角形三个旁切圆都相切、并把它们包在里面的圆(Kimberling
1998, p.102),叫"阿波罗尼奥斯圆"。这张图几乎用遍了 tkz-euclide 的高级特性:五个三角形中心(外心、欧拉点、莱莫恩点、垂心、Spieker 中心)、旁切三角形、旁心投影、 next to 交点选择、 tkzClipCircle 限定范围。作者用它展示 tkz-euclide 的能力上限:
\tkzDefTriangleCenter[euler](A,B,C) \tkzGetPoint{N}
\tkzDefSpcTriangle[excentral,name=J](A,B,C){a,b,c}
\tkzDefCircle[in](Ma,Mb,Mc) \tkzGetPoint{Sp}
\tkzInterLC[next to=Ja](Ja,Q)(Q,Cb) \tkzGetFirstPoint{F'a}
Figure 38: "The" Circle of APOLLONIUS