前段時間,我們一位三年級的小學員為了向媽媽表達愛意,給AC柴提了一個要求:“老師,下節課我要學畫愛心,畫好多好多的愛心”。可AC柴作為一條害羞腼腆的編程狗,從來沒有畫過半個愛心啊。于是AC柴硬着頭皮,開始了畫愛心之旅~
首先,編程狗是有追求的,所以AC柴堅決不用現成的愛心表情包,明明能用輸入法打出的[心],偏偏要用代碼來畫。經過一番激烈的選型,他決定采用一種三年級小朋友也能上手的編程方式來畫,那就是Processing!!!,Procesisng号稱是編程界的藝術大師
1 做好畫畫的準備打開它的界面,一個空白文檔呈現在AC柴面前,這個界面雖然不好說美觀,但是足夠簡潔直觀,代碼往空白的地方寫,寫完了點一下左上角第一個圖标(就兩個圖标),就可以查看畫出的玩意兒,當然現在還什麼都沒畫呢。
界面
AC柴開始大展身手,它打下了一行代碼,這麼一行代碼就幫我們創建了一個長方形的畫布,長800px,寬600px。點擊“運行”,彈出一個灰色的窗口,它就是我們的畫布。
size(800, 600);
運行結果
小同學審美在線,說灰不拉秋真難看。要求修改畫布的顔色,并且給了AC柴三個數字 218 182 250, 然後AC柴接着寫了一行 background(218,182,250); 這行代碼就是把畫布的背景顔色設為RGB(218,182,250)對應的顔色,這樣,我們就把畫布給弄好了
size(800,600);
background(218,182,250);
2 趕快畫愛心吧
前一節課AC柴和小同學一起學了怎麼畫圓,所以我們決定用圓畫出一個愛心,怎麼畫?看圖說話!
我們先要準備一個6行9列的長方形,标出要畫圓的格子。AC柴讓小同學标記出了要畫圓的格子,記下格子的行号和列号,做出下面的表
第幾行 |
第幾列要畫圓 |
1 |
2、3、 7、8 |
2 |
1、2、3、4、 6、7、8、9 |
3 |
2、3、4、5、6、7、8 |
4 |
3、4、5、6、7 |
5 |
4、5、6 |
6 |
5 |
然後我們用 變量 i 表示行号,用 變量 j 表示列号,那麼每一個格子都可以表示為( i , j )的形式,比如(1,2)這個格子我們要畫,(1,3)也要畫,(1、4)就不用畫
确定了哪些格子要畫,AC柴和小同學迅速地開始動手,先搭了一個雙重for循環的框架
for (int i = 1; i <= 6; i ) {
for (int j = 1; j <= 9; j ) {
// 汪汪汪
}
}
什麼?!雙重for循環不知道是啥?上節課白學啦?!好吧,本柴再來解釋一下,敲黑闆
[666] 雙重for循環可以用來遍曆多行多列,外層的for循環先去鎖定某一行/列,然後通過内層的for循環一個一個去檢查這一行/列裡的每一列/行 [666]
言歸正傳,//汪汪汪 這邊寫什麼呢?“畫圓呗”,小同學脫口而出。好,這就畫給你看。AC柴用 ellipse(j*50, i*50, 50, 50) 來代替 //汪汪汪,點一點運行,發生了什麼呢?
小同學敏銳地意識到,我們隻需要在前面表格中記錄的格子裡畫圓,而不需要每一個都畫。
沒錯,有條件地畫,就得用上條件判斷語句,本柴給你畫第一行打個樣例啊,看仔細
size(800,600);
background(218,182,250);
for (int i = 1; i <= 6; i ) {
for (int j = 1; j <= 9; j ) {
if ( i == 1 & ( j == 2 || j == 3 || j == 7 || j == 8)) {
ellipse(j*50, i*50, 50, 50);
}
}
}
第一行
類似的,對于第2到6行,我們也是隻在部分格子畫。AC柴把剩下的5行交給小學員去打,小學員打到第二和第三行的時候傻了眼。讓我們再來看看前面的表。哇哦,第2、3行有好多列要畫
第幾行 |
第幾列要畫圓 |
1 |
2、3、 7、8 |
2 |
1、2、3、4、 6、7、8、9 |
3 |
2、3、4、5、6、7、8 |
4 |
3、4、5、6、7 |
5 |
4、5、6 |
6 |
5 |
别怕,給你個簡單的方法,如果要畫的格子太多了,那麼不畫的格子就少。所以我們可以反過來,用條件語句指定列号不等于幾的時候要畫。比如對第二行的格子來說,列号不等于5時要畫。再給你寫第二行啊,看着
size(800,600);
background(218,182,250);
for (int i = 1; i <= 6; i ) {
for (int j = 1; j <= 9; j ) {
if ( i == 1 & ( j == 2 || j == 3 || j == 7 || j == 8)) {
ellipse(j*50, i*50, 50, 50);
}
if (i == 2 & ( j != 5)) {
ellipse(j*50, i*50, 50, 50);
}
}
}
第1、2行
經過一番敲敲打打,AC柴和小同學終于打完了,最後出來了下面的效果。
小同學繼續審美上線,白色圓多醜啊,于是親自在前面加了一行 fill(234,158, 245),fill(R,G,B)用來給圖像填充某種顔色
填充顔色後
大功告成!這是一種方式
用方塊拼愛心小同學靈機一動,既然圓可以拼,正方形不是也可以拼嗎?于是她隻修改了一個地方,把ellipse(j*50,i*50,50,50)替換成了rect(j*50,i*50,50,50)
心髒線
給大家講個很扯的故事
Christine是十七世紀時瑞典的一位公主,她美麗善良,而且很聰明,尤其很喜歡數學。她遇到一個窮困潦倒的小夥子,這個小夥子隻能靠乞讨為生,還沉迷于研究數學問題。
這個公主看到之後把他請過來作為自己的數學老師,和她一起讨論數學問題。兩個人相愛了。國王覺得小夥子配不上自己的女兒,于是把他驅逐出國,扣押了他們之間所有的書信。公主收不到小夥子的信件,以為他抛棄了自己。
沒想到有一天,她收到了一封小夥子的信件。原來這封信 國王和大臣誰也讀不懂,所以拿去給公主試試看,信裡面隻有一行公式 r =a (1 - sin θ) 。公主根據這個公式,在畫紙上描畫。最後,一個愛心赫然呈現在她眼前。于是她一下子就懂了,可是小夥子寒病交加,不久就去世了
size(800,600);
fill(255,0,0);
float step = 0.1;
float r = 100;
translate(width/2, height/2);
rotate(-PI/2);
for (float i = 0; i < PI*2; i = step) {
line(r*(2*cos(i)-cos(2*i)), r*(2*sin(i)-sin(2*i)), r*(2*cos(i step)-cos(2*i 2*step)), r*(2*sin(i step)-sin(2*i step*2)) );
}
心髒線
畫完之後,小同學把這些愛心發給了媽媽,媽媽為她續報了一年的課程……
好吧,藍色的話隻是AC柴的幻想,不過看到小同學和她的媽媽都很開心,并且學到了一些東西,我們也挺滿足。汪汪!!我們安排Processing的課程作為進階到C 語法之前的補充,最後的目标是帶孩子參加科技節比賽,打信奧。
如果你也在打算讓孩子學編程、參加比賽,卻不知道如何入手,歡迎點擊下方鍊接,加入交流群或者直接聯系AC柴 ~ 明年3月的青少年等級考試安排出爐,正好可以拿來練手哦~
戳戳戳 向 青少年等級考試最新安排出爐!要報名的同學趕快看過來~
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!