白二娃
不知你還記得百歲山有個(gè)美少女給路邊老頭送水的廣告嗎?是不是不明所以?其實(shí)這個(gè)廣告講述的是一個(gè)“笛卡爾曲線”的愛情故事。
1649年18歲的瑞典公主克里斯汀在斯德哥爾摩的街頭邂逅了52歲窮困潦倒的數(shù)學(xué)家笛卡爾。閑談后,公主聘請(qǐng)笛卡爾成為自己的數(shù)學(xué)老師,教授她研究數(shù)學(xué)的新領(lǐng)域——直角坐標(biāo)系。兩人在教學(xué)中彼此產(chǎn)生愛慕之心,這事被國(guó)王知道后下令流放笛卡爾,軟禁克里斯汀。笛卡爾直到去世依然堅(jiān)持寫信給公主,可惜這些信都被國(guó)王攔截了。笛卡爾去世前的最后一封信中寫了一個(gè)特殊的方程式r=a(1-sinθ),因?yàn)闆]人能看懂國(guó)王就把這封信給了公主。公主解開這個(gè)方程式得到了一個(gè)心形曲線,也知道了笛卡爾的心意,這就是著名的“笛卡爾曲線”(圖1)。
我們根據(jù)一些簡(jiǎn)單的函數(shù)方程式就可以繪制出美妙的曲線,但是在計(jì)算機(jī)沒有普及的時(shí)候,繪制函數(shù)曲線是很復(fù)雜的工作(圖2)。
數(shù)學(xué)中“函數(shù)”的定義:給定一個(gè)數(shù)集A,假設(shè)其中的元素為x。現(xiàn)對(duì)A中的元素x施加對(duì)應(yīng)法則f,記作f(x),得到另一數(shù)集B。假設(shè)B中的元素為y,則y與x之間的等量關(guān)系可以用y=f(x)表示。我們把這個(gè)關(guān)系式就叫函數(shù)關(guān)系式,簡(jiǎn)稱函數(shù)。函數(shù)概念含有三個(gè)要素:定義域A、值域B和對(duì)應(yīng)法則f。其中核心是對(duì)應(yīng)法則f,它是函數(shù)關(guān)系的本質(zhì)特征。
編程中的函數(shù)也有類似但不完全相同的概念,其中函數(shù)的輸入?yún)?shù)可以看作是定義域A,函數(shù)的運(yùn)行所改變的結(jié)果可以看作值域B,而函數(shù)的算法(過程)就是對(duì)應(yīng)法則f。
Scratch里我們可以在“自制積木→制作新的積木”里建立新函數(shù)。
在二維平面,如果有函數(shù) f(x) = y,其中任意一組(x,y)值是該曲線上的點(diǎn)的橫坐標(biāo)和縱坐標(biāo)值,描繪出符合函數(shù)的全部點(diǎn)時(shí)可以在平面直角坐標(biāo)系上呈現(xiàn)為一條曲線。
要想掌握使用Scratch根據(jù)各種不同的函數(shù)方程式繪制曲線的通用方法,我們要從最基礎(chǔ)的一次函數(shù)開始,逐步掌握更加復(fù)雜的曲線繪制方法,畫出各種優(yōu)美的函數(shù)曲線圖形感受數(shù)學(xué)之美。
若兩個(gè)變量x,y間的關(guān)系式可以表示為y=kx+b(k,b為常數(shù),k≠0)的形式,則稱y是x的一次函數(shù)(x為自變量,y為因變量)。
我們先從最簡(jiǎn)單的一次函數(shù)y=x開始。x是橫坐標(biāo),y是縱坐標(biāo)。y=x函數(shù)的意思就是橫坐標(biāo)和縱坐標(biāo)的值永遠(yuǎn)一樣,即:
x=1 時(shí) y=1 …… x=100 時(shí) y=100
在Scratch里,我們就可以畫100個(gè)縱橫坐標(biāo)相等的點(diǎn),把它們連起來就是y=x的函數(shù)曲線,一根從(0,0)開始的向(1,1)的直線(圖3)。
我們之后再增加兩個(gè)變量k、b,并改變函數(shù),就可以畫出任意一次函數(shù)y=kx+b的曲線。為了更好地 規(guī)范和簡(jiǎn)化代碼,我們將畫圖和函數(shù)部分分開了,為函數(shù)新建了積木“一次函數(shù)‘k‘b‘x”,這個(gè)積木有3個(gè)數(shù)字參數(shù)。這樣每次計(jì)算y=kx+b時(shí),只需要拖動(dòng)這個(gè)積木到需要的地方就可以了。
而要改變函數(shù)內(nèi)部結(jié)構(gòu)時(shí),也只需要修改一次函數(shù)的定義部分就可以了,函數(shù)越復(fù)雜就越能節(jié)省開發(fā)時(shí)間并避免出錯(cuò)。
二次函數(shù)基本表示形式為y=ax2+bx+c(abc為常量,a≠0)。 二次函數(shù)的圖像是一條對(duì)稱軸與y軸平行或重合于y軸的拋物線。x2用x*x表示。a、b、c可以自己設(shè)置,x從-50增加到50(圖4、圖5)。
接下來我們畫一些和三角函數(shù)相關(guān)的曲線。Scratch里有三角函數(shù)積木,運(yùn)算→“絕對(duì)值”積木下拉菜單中可以選擇使用。
正弦曲線函數(shù)可表示為y=Asin(ωx+φ)+k,其中sin為正弦符號(hào),A、k、ω和φ是常數(shù)(A、k、ω、φ∈R,R是實(shí)數(shù)域即A、k、ω、φ均為實(shí)數(shù),且ω≠0),正弦曲線是一條波浪線。只需要根據(jù)函數(shù)設(shè)定和修改相應(yīng)積木即可。具體常數(shù)設(shè)置如圖7。
橢圓的+=1,其中a>0,b>0,當(dāng)a=b時(shí)就是正圓形。將這個(gè)公式轉(zhuǎn)為參數(shù)方程方便計(jì)算xy的值:x=acosθy=bcosθ,θ為角度,畫圖時(shí)用循環(huán)代碼重復(fù)360次,將θ從0度增加到360度,a、b為常量控制橢圓的外形,代碼如圖8,圖9,效果如圖10。
最后我們來畫笛卡爾曲線。我們已知的r=a(1-sinθ)是笛卡爾曲線的極坐標(biāo)公式,沒有x和y坐標(biāo),需要轉(zhuǎn)為直角坐標(biāo),變成下面的函數(shù):
x=cos t*a(1-sint)
y=sin t*a(1-sint)
其中a是控制心形大小的常量。t為角度參數(shù),通過Scratch編程讓畫筆跟隨t轉(zhuǎn)一圈即從0度-360度就可完成作畫,代碼如圖11,圖12,效果如圖2。
只要知道曲線函數(shù)的表達(dá)公式你可以用此種方法畫出各種美麗的圖形,搜索“proe曲線方程”可以找到幾十種漂亮的曲線方程。當(dāng)你有更多的數(shù)學(xué)知識(shí)就可以把這些公式轉(zhuǎn)化為程序畫出來了,因?yàn)槠渲杏胁簧偾€需要縱坐標(biāo)z,這要用公式將(x,y,z)坐標(biāo)轉(zhuǎn)換為當(dāng)前視角(xz,yz)的坐標(biāo)才能畫出來。再添加上變換顏色的代碼,整個(gè)圖形就非常漂亮了。
在本版掃碼下載中有一個(gè)莫比烏斯環(huán)3D源程序(@科技傳播坊),你可以下載后自行學(xué)習(xí)如何換算z坐標(biāo)(如圖13)。
根據(jù)函數(shù)公式畫曲線,首先需要找到曲線的直角坐標(biāo)系公式,如果是極坐標(biāo)公式需要提前轉(zhuǎn)換,這樣才可確定曲線上點(diǎn)的x和y坐標(biāo)。接著根據(jù)公式設(shè)定相應(yīng)變量,并在新建積木中組合好x和y的表達(dá)方程式。循環(huán)給自變量x賦值,根據(jù)方程式算出因變量y的值,讓畫筆循環(huán)在(x,y)畫點(diǎn)就可以畫出相應(yīng)的曲線了。
如果是有sin、cos等三角函數(shù)相關(guān)曲線,一般需要將角度變量變化360次(一個(gè)圓周)。