欢迎光临散文网 会员登陆 & 注册

S5G1 圆面积的扇形分割

2022-02-25 11:49 作者:学用数学  | 我要投稿

学用数学第五季的第一个任务,就来庆祝 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

S5G1 圆面积的扇形分割的评论 (共 条)

分享到微博请遵守国家法律