//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);
}
沒有留言:
張貼留言