2018年9月27日 星期四

Week 03 Hankins

一、圓形上的點

畫出一個圓形(半徑240),並且在圓形上想畫出三角形,但要如何在圓形上找到一個無禮數的點呢?


三角形的參數(x1,y1,x2,y2,x3,y3)。


利用COS()、SIN()。

X座標其實是COS(),Y座標其實是SIN()。

圓的半徑不為1,目前是240,每個X,Y的位置要乘上240,又圓心在(250,250),因此加上250。半個圓為PI,兩個圓為2*PI,將半個圓分為三個再除以3。利用FOR迴圈帥氣做出圓內的三角形。

Bingo


前面說到,半徑是240,乘上240可表示三角形的大小,所以用第二個FOR迴圈來描述R表示三角形的大小,這裡用到noFill()函數,可以讓圖形不上色。
noFill()說明


程式碼:
void setup(){
  size(500,500); 
}

void draw(){
  ellipse(250,250,480,480); 
  for(float angle=0; angle<PI*2;  angle+=PI/3){
    for(int R =0 ; R<=240; R+=10){  
    noFill();
    triangle(250,250,
            250+R*cos(angle),250+R*sin(angle)
           ,250+R*cos(angle+PI/3),250+R*sin(angle+PI/3));
    }
  }       
           
}


二、做出有規律的小小三角形

先用圓做出一個模型再慢慢刻劃,利用簡單的雙FOR迴圈完成。

再來要開始用三角形了,如果自行宣告一個函數來畫三角形會很輕鬆,因此宣告mytriangle()函數來畫三角形。

(cx,cy)為圓心,R是半徑可表示三角形大小,畫三個三角形


把R及a寫死,看看成為甚麼樣子。




最後加入FOR迴圈,a重新給值。


程式碼:
void setup(){
 size(800,400);

}

void mytriangle(int cx, int cy){
  float  a=-PI/2;
  for(int R=15; R>0; R-=5){
    triangle( cx+R*cos(a),cy+R*sin(a),
              cx+R*cos(a+2*PI/3),cy+R*sin(a+2*PI/3),
              cx+R*cos(a-2*PI/3),cy+R*sin(a-2*PI/3));
  }
}

void draw(){
 background(255);
 for(int cx=20; cx<800; cx+=40){
  for(int cy=20; cy<400; cy+=40){
   mytriangle(cx,cy);
  }
 }

  float  a=-PI/2;
}


三、做出一個人物可以跳跳跳(Super Mario)

先把Mario放進程式裏頭,要注意以下是錯誤示範!

這樣會浪費記憶體空間,程式會越來越大(因為讀不只一次)

正確做法


加入函式keyCode(),讓人物可以往上下左右動動動。

ax,ay為加速度,Vx,Vy為給予的速度,關閉重洗背景,觀察會有甚麼結果:

woo,有拋物線的感覺了,那試著讓人誤不要掉出邊界吧!



將萬有引力G加到程式哩,讓整體更真實。

如果Y座標>500,則被萬有引力影響往下墜,但不會超過邊界。X座標界在0到300,超過了則速度為反向移動。

程式碼:
PImage imgMario;
float marioX=0, marioY=0, marioVX=2, marioVY=0, marioAX=0, marioAY=0.1;
void setup(){
 size(400,600);
 imgMario = loadImage("mario.png");//read once
}

void draw(){
  //background(255);
  image (imgMario, marioX, marioY, 125, 150);
  marioX += marioVX; marioVX+= marioAX;
  marioY += marioVY; marioVY+= 0.98;
  if(marioY>500){
    marioVY = -marioVY * 0.8;
    marioY = 500;
  }
  if(marioX>300) marioVX = -marioVX;
  if(marioX<0) marioVX = -marioVX;
}
void keyPressed(){
 if(keyCode==UP)     {marioY-=5;}
 if(keyCode==DOWN)   {marioY+=60;}
 if(keyCode==LEFT)   {marioX-=5;}
 if(keyCode==RIGHT)  {marioX+=5;}
 }


圖片支援

沒有留言:

張貼留言