S5G1 圆面积的扇形分割
学用数学第五季的第一个任务,就来庆祝 3/14 日的 Pi Day 。在这个案例将利用圆的切割来说明,圆面积公式与圆周长的关联。

你将学会
这节最主要是分析问题的拆解能力,对于上述的动画,先分析单一扇形的展开,接着再套用到多个相似结构的扇形。要点如下
1.旋转 Rotate, 平移 Translate
2.用迭代列表产生一串点 IterationList
3.用序列来绘制多个扇形 Sequence
4.利用指令 setLineStyle, setCaption 来调整显示
问题拆解
1 如何将分割成 12 块的扇形展开呢?

Q: 这个动画分为哪些步骤?
A: 四个步骤,扇形展开、水平移动、斜上移动、显示文字。
要用这四段呈现,我们建一个滑动条 t ,时间有 0 到 4。
t = Slider(0,4,0.1)
Q: 这个操作显得很复杂,该如何切入呢?
A: 从块数比较少的结构开始来研究,先个滑动条 n 来控制分割块数。至少 4 块,至多 128 块。
n = Slider(4,128,2)
Q: 如何分析第一个扇形的移动?
A:扇形在展开时,一个端点 R0 不动,但另个端点从 R10 转到水平位置 R11 。为这两点的距离是维持不变的,因此用极坐标来标示两点比较方便。 此时,动态变换的点 R1t ,用时间参数 t1 来控制。其中,t1 对应到 t 的 0~1。
Q: R0, R1 的距离为多少?
A: 因 O1R0R1 为腰长为 1 的等腰三角形。而等分为 n 份时,顶角的角度为 2*pi/n,作此角的平分线,亦将 R0R1 平分。所以 R0R1 长为 2*sin(pi/n)。
t1 = if(t<=1,t,1)
R0 = (0,-1)
sn = 2*sin(pi/n)
R10 = R0 + (sn;pi/n)
R11 = R0 + (sn;0)
R1t = R0 + (sn; (1-t1) pi/n)
Q: 标示好两端点R0, R1t,如何找出绘制扇形的圆心呢?
A:因已知底角的位置与底角的大小,通过将点旋转取得方向,再利用 UnitVector 来将长度调整为 1 ,来取得圆心 O1 的位置。而随着 R1t 的变动,O1 也变动。
A:取得 O1,R0, R1t ,再利用 circularSector 作扇形。
V1 = Rotate(R1t,pi/2-pi/n,R10)
O1 = R0 + UnitVector(Vector(O1,V1))
cs1 = CircularSector(O1,R0,R1t)
2 第二个扇形如何设定?

Q: 第二个扇形的位置为何?
A: 第二个扇形的顶点 R2t 可视为将 R0 对 R1t 旋转得到。可以先分析展开前与展开后的夹角。
A:这个旋转角在未展开时为 2*(pi/2-pi/n)。但展开后为 pi 。要让这角随着 t1 改变,可设定旋转角度为 2*(pi/2+(1-t1)*pi/n)。
R2t = Rotate(R0, -2*(pi/2-(1-t1)*pi/n), R1t)
Q:那 R3t 的位置呢?
A:其关系也是类似的,这时将 R1t 对 R2t 旋转可得到 R3t。
R3t = Rotate(R1t, -2*(pi/2-(1-t1)*pi/n), R2t)
Q:那 O2, O3 的关系呢?
A:也与 O1 类似,但这提供另个做法,可将长度先调为单位长,接着再用旋转得到,而其旋转角为底角的大小 pi/2 - pi/n。
O3 = R2t+Rotate(UnitVector(Vector(R2t,R3t)),pi/2-pi/n)
O2 = R1t+Rotate(UnitVector(Vector(R1t,R2t)),pi/2-pi/n)
cs2 = circularSector(O2,R1t,R2t)
cs3 = circularSector(O3,R2t,R3t)
3 利用迭代来做多个扇形
因 R2t 由 R1t, R0t 得到。而R3t 由 R2t, R1t 得到,因此,可用迭代列表来依序产生这些点 Rs。

Q:IterationList 的结构是什么?
A:先看以下用 iterationList 产生 10 项的费氏数列。可看到, IterationList 需先写 迭代规则 Y+Z,再明确变数的代号。接着用 {1, 1} 输入初始值,再指定次数 10 。
Fibs = IterationList(Y+Z, Y, Z, {1,1},10)
Q: Rs 的关系如何用迭代列表决定。
A: 主要的迭代的语法为 Rotate(Y, 2*(pi/2+(1-t1)*pi/n), Z),再将初始值定为 {R0, R1t} 。
Rs = IterationList(Rotate(Y, 2*(pi/2+(1-t1)*pi/n), Z), Y, Z, {R0,R1t},n/2)
Q:如何取得圆心的位置?
A:现在已有 Rs, 而 Os(k) 可基于 Rs(k), Rs(k+1) 经伸缩再旋转而得到 Os(k)。要对不同的 k 作这操作就可用 sequence 来达成。
A:有了 Os,Rs 就可用 Sequence 制作大量的扇形。
Q:左侧的圆该如何处理呢?
A:最简洁的写书法可用对 csRs1 旋转得到。
Os = Sequence(Rs(k)+Rotate(UnitVector(Vector(Rs(k),Rs(k+1))),pi/2-pi/n),k,1,n/2)
csRs1 = Sequence(CircularSector(Os(k),Rs(k),Rs(k+1)),k,1,n/2)
csLs1 = rotate(csRs1,pi)
4 扇形的平移
完成左右两部分的扇形后,接着就要进行平移来控制移动。稍微要注意的是 csRS1, csLs1 是对原点对称。因此,这节的重点在于平移向量的计算。

Q:如何描述第二段的水平移动?
A: 主要平移量为扇形展开后边长的一半。因此,其中扇形两端点的距离为 2*sin(pi/n) ,而 n/2 个扇形的总长度为 n/2*2*sin(pi/n) = n*sin(pi/n) 。所以 t2 时间段的位移量为 t2*(-n*sin(pi/n),0)/2。利用 translate 来达成这效果。
t2 = if(t<=1,0,if(t<=2,t-1,1))
shift2 = t2*(-n*sin(pi/n),0)/2
csRs2 = translate(csRs1,shift2)

Q:如何描述第三段的水平移动?
A: 主要观察到目的是将 RO3 移至 L3 。但因为是分成对称的两部分同时移动,因此,移动向量为 0.5*Vector(RO3,L3) 。其中水平位移位为 sin(pi/n),而垂直位移为 (2-cos(pi/n))。
A:再设定 t3 ,让 shift3 随 t3 而变动。此时,可设定 csRs3 为由 csRs1 来经过 shift2 + shift3 的平移。(思考:若设定 csRs3 由 csRs2 平移会有何问题)
t3 = if(t<=2,0,if(t<=3,t-2,1))
shift3 = t3*(sn,2-cos(pi/n))/2
csRs3 = translate(csRs1,shift2+shift3)
csLs3 = rotate(csRs3,pi)
5 讯息的显示
为了显示面积与圆周的关系,在平移结束后再显示些文字讯息。先出现长方形,再出现长方形对应的长与宽,并在下方显示文字。

Q:长方形的位置为何?
A:长为 pi, 高为 1。但因为以原点为中心,因此,四个角的坐标为 (pi/2,1/2) .... 。
rect = polygon((-pi/2,-1/2),(pi/2,-1/2),(pi/2,1/2),(-pi/2,1/2))
Q:如何标示线段长的圆弧线?
A:利用 circularArc 来标示,在使用时,要调一下圆心的位置,来让弧线的弯曲度比较合适。
A:而虚线可用 setLineStyle 来调整。
caRight = circularArc((1,0),(pi/2,-1/2),(pi/2,1/2))
caAbove = circularArc((0,-3),(pi/2,1/2),(-pi/2,1/2))
Q:弧线的标题与线型也可用指令设置?
A:对于弧线,其线型可用 setLineStyle ,其第二个参数为设置不同的线型。
A:而标题可用 setCaption 来设定,在第二个参数加入 $ $ 就可使用 LaTeX 数学式。
A:初期用指令还要记忆指令名词,长期而言,用指令设置可以让指令更方便于脚本操作。
setLineStyle(caRight,3)
setLineStyle(caAbove,3)
setCaption(caRight,"$\Large r$")
setCaption(caAbove,"$\Large \pi \times r$")
Q:文本的部分也可用指令输入?
A:文本的部分也可,先输入文本容,再输入位置。最后两个参数为用用变数来显示,与 LaTex 与斜体的数学式来显示。大家可以把他改为 False 观看效果是否有改变。
Text("$\Large 圆面积 = \pi \times r \times r = \pi r^2 $", (-π / 2, -1), true, true)
再设定好了,显示资讯,就可用用条件显示来控制上述物件出现的时间点。

总结回顾
在这节最核心的还描述一堆扇形如何移动。在这案例我用迭代的方式产生。但也有用序列同时显示扇形端点的方法。主要的观察是这些端点在移动的过程其实都是共圆的,利用在这圆弧上取等距的点也可取得扇形端点。
另外,也可鼓励考虑不同的拼贴的路径,例如下图洋葱小学的展开方式。题目最大的挑战还是去用数学分析路径变化。

参考链接
【GGB】https://www.geogebra.org/m/ucb2dsqm
【Bili】https://www.bilibili.com/video/av91280728
【YouTube】https://www.youtube.com/playlist?list=PLXH05kw-i_5JNrYOB5-dPQW_DxErQu2ck