2025年6月5日 星期四

12750042_week14

 課堂作業1:

// week14_1_PFont_createFont_textSize_text

// 學過了 PImage PVector P...

size(300, 300);

textSize(50); // 50號字

text("Hello", 10, 50); // 預設字型

PFont font = createFont("Times New Roman",50);

textFont(font); // 換字型

text("Hello", 10, 100);

//print(PFont.list()); // 列出現在所有可用的字型

// 改用for 迴圈,把全部的字型,分行印出來

for(String name : PFont.list()) println(name); 



課堂作業2:

// week14_2_PFont_font1_font2_chinese_font_textFont_cursor

PFont font1, font2, font3;

void setup(){

  size(300, 300);

  font1 = createFont("Times New Roman Bold Italic", 50);

  font2 = createFont("微軟正黑體 Bold", 50);

  font3 = createFont("elffont-rock.otf", 50); // 注音文的精靈字體

}

void draw(){

  background(0); // 黑色的背景

  cursor(CROSS);

  fill(255); // 預設是白色的填充色

  textFont(font1);

  text("Hello 中文", mouseX+20, mouseY-20);

  fill(#FF8E8E); // Tool - Color Selector, 再 copy 你要的顏色

  textFont(font2);

  text("Hello 中文", mouseX+20, mouseY+50); // 下面一點點

  textFont(font3);

  text("ㄅㄆㄇ", mouseX+20, mouseY+100); // 再下面一點點

}



課堂作業3:

// week14_3_inverse_kinematics_part1

void setup(){

  size(400, 400); // 先用 2D

}

float [] angle = new float[5]; // 有5個關節

void draw(){

  background(255);

  translate(200, 350); // 放下面一點

  ellipse(0, 0, 12, 12); //(0,0)放圓

  

  pushMatrix();

    rotate(radians(angle[0])); // 2D 對Z軸轉

    rect(0, -5, 50, 10); // 直的棒子

  popMatrix();

}

void mouseDragged(){

  angle[0] += mouseX = pmouseX;

}



課堂作業4:

// week14_3_inverse_kinematics_part2

void setup(){

  size(400, 400); // 先用 2D

  ellipse(0, 0, 12, 12); //(0,0)放圓

}

float [] angle = new float[5]; // 有5個關節

void draw(){

  background(255);

  translate(200, 350); // 放下面一點

  ellipse(0, 0, 12, 12); //(0,0)放圓

  

  pushMatrix();

    rotate(radians(angle[ID])); // 2D 對Z軸轉

    rect(0, -5, 50, 10); // 直的棒子

    pushMatrix();

      translate(50, 0); // 2D 移動 往左

      rotate(radians(angle[1]));

      rect(0, -5, 50, 10); // 直的棒子

    popMatrix();

  popMatrix();

}

void mouseDragged(){

  angle[ID] += mouseX - pmouseX;

}

int ID = 0;

void keyPressed(){

  if(key=='0') ID = 0;

  if(key=='1') ID = 1; // 小心注音輸入法

}





課堂作業5:

// week14_5_ik_inverse_kinematics_part3

// 用簡單的線段,來解真的 ID 的運算

void setup(){

  size(400, 400);

  for(int i=0; i<2; i++){ // 把頂點從下到上放好

    p[i] = new PVector(200, 350-50*i);

  }

}

PVector [] p = new PVector[2]; // 有2個頂點

void draw(){

  background(255);

  for(int i=0; i<2; i++){ // 用迴圈,畫點、畫字

  if(i>0) line(p[i-1].x, p[i-1].y, p[i].x, p[i].y);

    fill(255, 0, 0); // 紅色的圈圈

    ellipse(p[i].x, p[i].y, 8, 8);

    fill(0); // 黑色的字

    text("p:"+1,p[i].x, p[i].y); // 字往右一點點

  }

  ellipse(mouseX, mouseY, 6, 6); //滑鼠也有一個小點,要控制座標移動

  line(p[0].x, p[0].y, mouseX, mouseY);

}



課堂作業6:

// week14_6_ik_inverse_kinematics_part4

// 用簡單的線段,來解真的 ID 的運算

void setup(){

  size(400, 400);

  for(int i=0; i<2; i++){ // 把頂點從下到上放好

    p[i] = new PVector(200, 350-50*i);

  }

}

PVector [] p = new PVector[2]; // 有2個頂點

void draw(){

  background(255);

  for(int i=0; i<2; i++){ // 用迴圈,畫點、畫字

    if(i>0) line(p[i-1].x, p[i-1].y, p[i].x, p[i].y);

    fill(255, 0, 0); // 紅色的圈圈

    ellipse(p[i].x, p[i].y, 8, 8);

    fill(0); // 黑色的字

    text("p:"+1,p[i].x, p[i].y); // 字往右一點點

  }

  PVector now = new PVector(mouseX, mouseY); //現在的位置

  PVector v = PVector.sub(now, p[0]).normalize().mult(50); // 短向量

  // 因為長度限制為50, 所以長向量 先長度變成1 再乘上50

  p[1].x = p[0].x + v.x; // 新的位置,是中心,再加上長度50這小段

  p[1].y = p[0].y + v.y; // 新的位置,是中心,再加上長度50這小段

  ellipse(mouseX, mouseY, 6, 6); //滑鼠也有一個小點,要控制座標移動

  line(p[0].x, p[0].y, mouseX, mouseY);

}



課堂作業7:

// week14_7_ik_inverse_kinematics_part5

// 用簡單的線段,來解真的 ID 的運算

void setup(){

  size(400, 400);

  for(int i=0; i<6; i++){ // 把頂點從下到上放好

    p[i] = new PVector(200, 350-50*i);

  }

}

PVector [] p = new PVector[6]; // 有6個頂點

void draw(){

  background(255);

  for(int i=0; i<6; i++){ // 用迴圈,畫點、畫字

    if(i>0) line(p[i-1].x, p[i-1].y, p[i].x, p[i].y);

    fill(255, 0, 0); // 紅色的圈圈

    ellipse(p[i].x, p[i].y, 8, 8);

    fill(0); // 黑色的字

    text("p:"+1,p[i].x, p[i].y); // 字往右一點點

  }

  PVector now = new PVector(mouseX, mouseY); //現在的位置

  for(int i=5; i>0; i--){

    PVector v = PVector.sub(now, p[i]).normalize().mult(50); // 短向量

    // 因為長度限制為50, 所以長向量 先長度變成1 再乘上50

    p[i].x = now.x - v.x; // 新的位置,是中心,再加上長度50這小段

    p[i].y = now.y - v.y; // 新的位置,是中心,再加上長度50這小段

    now = p[i];

  }

  ellipse(mouseX, mouseY, 6, 6); //滑鼠也有一個小點,要控制座標移動

  //line(p[4].x, p[4].y, mouseX, mouseY);

}




課堂作業8:

// week14_8_ik_inverse_kinematics_part6

// 用簡單的線段,來解真的 ID 的運算

void setup(){

  size(400, 400);

  for(int i=0; i<6; i++){ // 把頂點從下到上放好

    p[i] = new PVector(200, 350-50*i);

  }

}

PVector [] p = new PVector[6]; // 有6個頂點

void draw(){

  background(255);

  for(int i=0; i<6; i++){ // 用迴圈,畫點、畫字

    if(i>0) line(p[i-1].x, p[i-1].y, p[i].x, p[i].y);

    fill(255, 0, 0); // 紅色的圈圈

    ellipse(p[i].x, p[i].y, 8, 8);

    fill(0); // 黑色的字

    text("p:"+i,p[i].x+10, p[i].y); // 字往右一點點

  }

  PVector now = new PVector(mouseX, mouseY); //現在的位置

  p[5].x = now.x;

  p[5].y = now.y;

  for(int i=4; i>0; i--){

    PVector v = PVector.sub(p[i+1], p[i]).normalize().mult(50); // 短向量

    // 因為長度限制為50, 所以長向量 先長度變成1 再乘上50

    p[i].x = p[i+1].x - v.x; // 新的位置,是中心,再加上長度50這小段

    p[i].y = p[i+1].y - v.y; // 新的位置,是中心,再加上長度50這小段

  }

  for(int i=1; i<=5; i++){

    PVector v = PVector.sub(p[i], p[i-1]).normalize().mult(50);

    p[i].x = p[i-1].x + v.x;

    p[i].y = p[i-1].y + v.y;

  }

  ellipse(mouseX, mouseY, 6, 6); //滑鼠也有一個小點,要控制座標移動

  //line(p[4].x, p[4].y, mouseX, mouseY);

}




課堂作業9:

// week14_9_ik_inverse_kinematics_part7

// 用簡單的線段,來解真的 ID 的運算

void setup(){

  size(400, 400);

  for(int i=0; i<N; i++){ // 把頂點從下到上放好

    p[i] = new PVector(200, 350-L*i);

  }

}

int N = 20, L = 300 / N; // 本來是 6 個點

PVector [] p = new PVector[N]; // 有6個頂點

void draw(){

  background(255);

  for(int i=0; i<N; i++){ // 用迴圈,畫點、畫字

    if(i>0) line(p[i-1].x, p[i-1].y, p[i].x, p[i].y);

    fill(255, 0, 0); // 紅色的圈圈

    ellipse(p[i].x, p[i].y, 8, 8);

    fill(0); // 黑色的字

    text("p:"+i,p[i].x+10, p[i].y); // 字往右一點點

  }

  p[N-1].x = mouseX; // 照著mouse的位,把最後的點移過去

  p[N-1].y = mouseY;

  for(int i=N-2; i>0; i--){

    PVector v = PVector.sub(p[i+1], p[i]).normalize().mult(L); // 短向量

    // 因為長度限制為50, 所以長向量 先長度變成1 再乘上50

    p[i].x = p[i+1].x - v.x; // 新的位置,是中心,再加上長度50這小段

    p[i].y = p[i+1].y - v.y; // 新的位置,是中心,再加上長度50這小段

  }

  for(int i=1; i<N; i++){

    PVector v = PVector.sub(p[i], p[i-1]).normalize().mult(L);

    p[i].x = p[i-1].x + v.x;

    p[i].y = p[i-1].y + v.y;

  }

  ellipse(mouseX, mouseY, 6, 6); //滑鼠也有一個小點,要控制座標移動

  //line(p[4].x, p[4].y, mouseX, mouseY);

}


沒有留言:

張貼留言