2025年5月22日 星期四

12750653-week14

//week14-1-PFont
size(300,300);
textSize(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);

// 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("elflfont-rock_otf", 50); // 注意含有的精靈字體
}

void draw() {
  background(0); // 黑色的背景
  cursor(CROSS);
  
  fill(255); // 預設是白色的填充色
  textFont(font1);
  text("Hello 中文", mouseX + 20, mouseY - 20);
  
  fill(#7AB4FC); // Tool → Color Selector,再 copy 你要的色彩
  textFont(font2);
  text("Hello 中文", mouseX + 20, mouseY + 50); // 下面一點點

  textFont(font3); // 注意含有的精靈字體
  text("ㄅㄆㄇ", mouseX + 20, mouseY + 100);
}
// week14_3_1_ik_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;
}



// week14_3_2ik_inverse_kinematics_???
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])); // 第一節:對 Z 軸旋轉
  rect(0, -5, 50, 10);       // 畫一根棒子
  pushMatrix();
  translate(50, 0);           // 第二節:移動到第一節尾端
  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;  // 小心注意輸入法
}
// week14_5_ik_inverse_kinematics_part3
// 用簡單的線段,來解真的 ID 的運算

PVector[] p = new PVector[6];

void setup() {
  size(400, 400);
  for (int i = 0; i < 6; i++) {
    p[i] = new PVector(200, 350 - 50 * i);
  }
}

void draw() {
  background(255);
  for (int i = 0; i < 6; i++) {
    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);
  }
}
// week14_6_ik_inverse_kinematics_part3
// 用簡單的線段,來解真的 ID 的運算

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

void setup() {
  size(400, 400);
  for (int i = 0; i < 2; i++) { // 把頂點從下到上放好(目前只放了前 2 個)
    p[i] = new PVector(200, 350 - 50 * i);
  }
}

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:" + i, p[i].x + 10, p[i].y);
  }

  // 滑鼠也有 1 個小圓,要控制與虛標移動
  ellipse(mouseX, mouseY, 6, 6);
  line(p[0].x, p[0].y, mouseX, mouseY);
}

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

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

void setup() {
  size(400, 400);
  for (int i = 0; i < 2; i++) { // 把頂點從下到上放好(目前只有前兩節)
    p[i] = new PVector(200, 350 - 50 * i);
  }
}

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:" + i, p[i].x + 10, p[i].y);
  }

  // 滑鼠位置處理(目標點)
  PVector now = new PVector(mouseX, mouseY); // 現在的滑鼠位置
  PVector v = PVector.sub(now, p[0]).normalize().mult(50); // p[0] 指向滑鼠方向,長度設為 50

  // 更新 p[1] 的位置(使 p[1] 剛好在指向滑鼠的方向上,且長度為 50)
  p[1].x = p[0].x + v.x;
  p[1].y = p[0].y + v.y;

  // 滑鼠上的圓與目標線
  ellipse(mouseX, mouseY, 6, 6); // 滑鼠上畫圓
  line(p[0].x, p[0].y, mouseX, mouseY); // 補助線
}


//week14-8
PVector[] p = new PVector[6];
void setup() {
  size(400, 400);
  for (int i = 0; i < 6; i++) {
    p[i] = new PVector(200, 350 - 50 * i);
  }
}
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);
  for (int i = 5; i >= 0; i--) {
    PVector v = PVector.sub(now, p[i]).normalize().mult(50);
    p[i].x = now.x - v.x;
    p[i].y = now.y - v.y;
    now = p[i];
  }
  ellipse(mouseX, mouseY, 6, 6);
}


PVector[] p = new PVector[6];
void setup() {
  size(400, 400);
  for (int i = 0; i < 6; i++) {
    p[i] = new PVector(200, 350 - 50 * i);
  }
}
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); // 滑鼠也有1個小點,要控制座標移動
//line(p[4].x, p[4].y, mouseX, mouseY);
}




沒有留言:

張貼留言