环形跑道与折线动点交互动画
首页地址https://geogebra.kz16.top/
预览效果
所有代码
环形跑道所有GeoGebra代码如下
A=(0,0)
B=(2,0)
C=(2,1)
D=(0,1)
f=Segment(A,B)
g=Segment(C,D)
c:Semicircle(C,B)
d:Semicircle(A,D)
s = {f,c,g,d}
LN = 0..length(s)
Lx = zip(Sum(s,k), k, LN)
L = dataFunction(Lx, LN/length(s))
setvisibleInView(L,1,false)
t = slider(0, Lx(-1), 0.01)
P = point(s, L(t))
如果想让它循环跑,只需要稍微修改下t
就行了
也就是最后两行代码改成
t = slider(0, 3*Lx(-1), 0.01)
P = point(s, L(mod(t,Lx(-1))))
折线动点问题完全可以类似处理,甚至可以类似处理自定义速度和某特定点处停留
问题分析
环形跑道与折线动点的数学本质是:
求相关弧长参数方程
因此可把这类问题当成一个简单的数学问题,数学上,应该不难得到两段折线的弧长参数方程。
例如线段AB的弧长参数方程可以为
OA+∣AB∣sAB, 其中s∈[0,∣AB∣]为弧长参数.
对应的GeoGebra代码
curve(A + s/abs(AB)*(B-A), s, 0, abs(AB))
同理不难得到折线段ABC的关于s的弧长参数方程:
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧OA+∣AB∣sAB,s∈[0,∣AB∣]OB+∣BC∣(s−∣AB∣)BC,s∈[∣AB∣,∣BC∣]
根据数学公式不难理解对应的GeoGebra代码,
curve(if(s<abs(AB),
A + s/abs(AB)*(B-A),
B + (s-abs(AB))/abs(BC)*(C-B)),
s, 0, abs(AB)+abs(BC))
类似,对于线段与圆弧的组合,参数方程也不难写出来。
但是对于多段折线问题,尽管能写出来,但毕竟麻烦,因此可以考虑借助画图软件完成。
用GeoGebra构造线段AB,并且取名字为f,代码为
f = segment(A,B)
它有个隐藏的属性,指令point(f,0)
表示A点,指令point(f,1)
表示B点, 指令point(f,0.5)
表示AB中点,看到这三个例子应该不难猜出point
的第二个数字参数表示点在线段的位置。总之。这里的第二个数字参数有点像定比分点的系数。
假设f,g,h是3段首尾拼接的线段或圆弧(可以选择是否封闭),把这四段用列表放到一起代码为
s = {f,g,h}
它也有个隐藏的属性,我们都知道3段折线有4个顶点,指令point(s,0)
表示第一个顶点,指令point(s,1/3)
表示第2个顶点,point(s,2/3)
表示第3个顶点,指令point(s,1)
表示第最后一个顶点也是这里的第4个顶点。总之就是一句话,它不是一个弧长参数方程,但是它比较接近弧长参数方程,它有两个特点:
- 参数范围永远是[0,1]
- 多段折线的参数分配机制是:不管弧长长度,完全均分
因此只需要想个办法,把参数的完全均分机制变成按弧长分配。
解决方案
为了方便解析,我们把抽象的字母数字实例化,假设f,g,h
的长度依次为4,5,6
,这三段折线的4个顶点依次为A,B,C,D,我们的目的是找到弧长参数方程L ,使得
- L(0)=A
- L(4)=B
- L(9)=C,这里9=4+5表示折线ABC的长度
- L(15)=D,这里15=4+5+6表示折线ABCD的长度
我们知道GeoGebra的内部机制已经帮助我们求得
point(s,0)--->A
point(s,1/3)--->B
point(s,2/3)--->C
point(s,1)--->D
因此需要找到一个折线函数建立好0,4,9,15
与0,1/3,2/3,1
两者间的一一对应关系,也就是只找个简单的分段线性插值函数,问题自然就迎刃而解。
其实,GeoGebra内部恰好有一个专门处理这个问题的指令,DataFunction
这个指令实现功能的对应的数学术语是分段线性插值,输入指令
DataFunction({1,2,3},{0,2,1})
会得到一个过点(1,0),(2,2),(3,1)的折线函数。
于是只剩下最后一个问题,怎么通过{4,5,6}
得到{0,4,9,15}
?也就是给出一个数列,求它前n项和构成的数列。这个问题在GeoGebra可以通过循环与求和完成。
在GeoGebra中,如果s={4,5,6}
则Sum(s,2)=4+5=9
,Sum(s,3)=4+5+6=15
,因此外层来个循环就可以得到最终结果
s={4,5,6}
zip(Sum(s,k), k, 0..3)
# 结果是{0,4,9,15}
经过上面的分析,我们得到所有代码,假设f,g,h
是三条连在一起的线段,则下面的GeoGebra代码可以得到最终结果
s = {f,g,h}
LN = 0..3
Lx = zip(Sum(s,k), k, LN)
L = dataFunction(Lx, LN/3)
t = slider(0, Lx(-1), 0.01)
point(s, L(t))
上面代码中的两个数字3
都表示折线的段数,它也可以替换成length(s)
DataFunction的替代
DataFunction用于线性插值,好用是好用,但不方便做成工具,因此可以选择自定义,
利用傅里叶级数原理或拉格朗日插值原理,可以先做出好几个具有相同形式的基函数,最后做叠加。GeoGebra代码如下:
Lx = {1,2,3,4}
Ly = {2,1,5,3}
L=Sum(if(Lx(k)<x<Lx(k+1),
Ly(k)+(x-Lx(k))*(Ly(k)-Ly(k+1))
/(Lx(k)-Lx(k+1)),0),
k, 1, length(Lx)-1))
对于确定的Lx = {1,2,3,4}
还可以做优化
Ly = {2,1,5,3}
L=Sum(if(k==floor(x),
Ly(k)+(x-k)*(Ly(k+1)-Ly(k)),0),
k, 1, length(Ly)-1))
拉格朗日插值
过A(1,2),B(3,5)两点的拉格朗日线性插值函数为
f(x)=2⋅1−3x−3+5⋅3−1x−1
过A(1,2),B(3,5),C(4,6)三点的拉格朗日二次插值函数为
f(x)=2⋅(1−3)(1−4)(x−3)(x−4)+5⋅(3−1)(3−4)(x−1)(x−4)+6⋅(4−1)(4−3)(x−1)(x−3)
更多关于拉格朗日插值可参考
https://kz16.top/na/interp/
首页地址https://geogebra.kz16.top/
本文来源:
https://kz16.top/geogebra/pd.html
作者:Zhou Bingzhen
欢迎非商业转载,转载请说明来源
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