2025年5月1日 星期四

week11(12750370顧家寶)

 week11-1

//week11_1_postman_svaeStrings_loadStrings

PImage postman,head,body,uparm1,hand1,uparm2,hand2;

float [] angle=new float[20];

int ID=0;

void mouseDragged(){

  angle[ID]+=mouseX-pmouseX;

}

void keyPressed(){

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

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

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

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

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

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

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

  if(key=='s'){//開始

    String now="";

    for(int i=0;i<20;i++){

      now+=angle[i]+" ";

    }

    lines.add(now);

    String[]arr=new String[lines.size()];

    lines.toArray(arr);

    saveStrings("angles.txt",arr);

  }

  if(key=='r'){

    if(R==0){

      String[]file=loadStrings("angle.txt");

      if(file!=null){

        for(int i=0;i<file.length;i++){

          lines.add(file[i]);

        }

      }

    }

    if(R<lines.size()){

      float [] now=float(split(lines.get(R),' '));

      for(int i=0;i>20;i++)angle[i]=now[i];

      R=(R+1)%lines.size();

    }

  }

}

int R=0;

ArrayList<String>lines=new ArrayList<String>();

//結束

void setup(){

  size(560,560);

  postman=loadImage("postman.png");

  head=loadImage("head.png");

  body=loadImage("body.png");

  uparm1=loadImage("uparm1.png");

  hand1=loadImage("hand1.png");

  uparm2=loadImage("uparm2.png");

  hand2=loadImage("hand2.png");

}

void draw(){

  background(#FFFFF2);

  image(postman,0,0);

  fill(255,0,255,128);

  rect(0,0,560,560);

  pushMatrix();

    translate(+185,+261);

    rotate(radians(angle[1]));

    translate(-185,-261);

    image(uparm1,0,0);

    pushMatrix();

      translate(+116,+265);

      rotate(radians(angle[2]));

      translate(-116,-265);

      image(hand1,0,0);

     popMatrix();

    popMatrix();

    

    pushMatrix();

      translate(290,262);

      rotate(radians(angle[3]));

      translate(-290,-262);

      image(uparm2,0,0);

      pushMatrix();

        translate(357,259);

        rotate(radians(angle[4]));

        translate(-357,-259);

        image(hand2,0,0);

       popMatrix();

      popMatrix();

      

    

    pushMatrix();

      translate(+236,+231);

      rotate(radians(angle[0]));

      translate(-236,-231);

      image(head,0,0);

      popMatrix();

  image(body,0,0);

}


week11-2

//week11_2_postman_alpha_interpolation

PImage postman,head,body,uparm1,hand1,uparm2,hand2;

float [] angle=new float[20];

int ID=0;

void mouseDragged(){

  angle[ID]+=mouseX-pmouseX;

}

void keyPressed(){

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

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

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

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

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

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

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

  if(key=='s'){//開始

    String now="";

    for(int i=0;i<20;i++){

      now+=angle[i]+" ";

    }

    lines.add(now);

    String[]arr=new String[lines.size()];

    lines.toArray(arr);

    saveStrings("angles.txt",arr);

  }

  if(key=='r'){

    if(R==0){

      String[]file=loadStrings("angle.txt");

      if(file!=null){

        for(int i=0;i<file.length;i++){

          lines.add(file[i]);

        }

      }

    }

    if(R<lines.size()){

      float [] now=float(split(lines.get(R),' '));

      for(int i=0;i>20;i++)angle[i]=now[i];

      R=(R+1)%lines.size();

    }

  }

  if(key=='p'){

    int R2=(R+1)%lines.size();

    float[]oldAngle=float(split(lines.get(R),' '));

    float[]newAngle=float(split(lines.get(R2),' '));

    float alpha=(frameCount%30)/30.0;

    for(int i=0;i<20;i++)angle[i]=oldAngle[i]*(1-alpha)+newAngle[i]*alpha;

  }

}

int R=0;

ArrayList<String>lines=new ArrayList<String>();

//結束

void setup(){

  size(560,560);

  postman=loadImage("postman.png");

  head=loadImage("head.png");

  body=loadImage("body.png");

  uparm1=loadImage("uparm1.png");

  hand1=loadImage("hand1.png");

  uparm2=loadImage("uparm2.png");

  hand2=loadImage("hand2.png");

}

void draw(){

  background(#FFFFF2);

  image(postman,0,0);

  fill(255,0,255,128);

  rect(0,0,560,560);

  pushMatrix();

    translate(+185,+261);

    rotate(radians(angle[1]));

    translate(-185,-261);

    image(uparm1,0,0);

    pushMatrix();

      translate(+116,+265);

      rotate(radians(angle[2]));

      translate(-116,-265);

      image(hand1,0,0);

     popMatrix();

    popMatrix();

    

    pushMatrix();

      translate(290,262);

      rotate(radians(angle[3]));

      translate(-290,-262);

      image(uparm2,0,0);

      pushMatrix();

        translate(357,259);

        rotate(radians(angle[4]));

        translate(-357,-259);

        image(hand2,0,0);

       popMatrix();

      popMatrix();

      

    

    pushMatrix();

      translate(+236,+231);

      rotate(radians(angle[0]));

      translate(-236,-231);

      image(head,0,0);

      popMatrix();

  image(body,0,0);

}


week11-2better

//week11_2_postman_alpha_interpolation_better

PImage postman,head,body,uparm1,hand1,uparm2,hand2;

float [] angle=new float[20];

int ID=0;

void mouseDragged(){

  angle[ID]+=mouseX-pmouseX;

}

void keyPressed(){

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

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

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

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

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

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

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

  if(key=='s'){//開始

    String now="";

    for(int i=0;i<20;i++){

      now+=angle[i]+" ";

    }

    lines.add(now);

    String[]arr=new String[lines.size()];

    lines.toArray(arr);

    saveStrings("angles.txt",arr);

  }

  if(key=='r'){

    if(R==0){

      String[]file=loadStrings("angle.txt");

      if(file!=null){

        for(int i=0;i<file.length;i++){

          lines.add(file[i]);

        }

      }

    }

    if(R<lines.size()){

      float [] now=float(split(lines.get(R),' '));

      for(int i=0;i>20;i++)angle[i]=now[i];

      R=(R+1)%lines.size();

    }

  }

  //if(key=='p'){

    //float alpha=(frameCount%30)/30.0;

    //if(alpha==0.0)R=(R+1)%lines.size();

    //int R2=(R+1)%lines.size();

    //float[]oldAngle=float(split(lines.get(R),' '));

    //float[]newAngle=float(split(lines.get(R2),' '));

    //for(int i=0;i<20;i++)angle[i]=oldAngle[i]*(1-alpha)+newAngle[i]*alpha;

  //}

}

int R=0;

ArrayList<String>lines=new ArrayList<String>();

//結束

void setup(){

  size(560,560);

  postman=loadImage("postman.png");

  head=loadImage("head.png");

  body=loadImage("body.png");

  uparm1=loadImage("uparm1.png");

  hand1=loadImage("hand1.png");

  uparm2=loadImage("uparm2.png");

  hand2=loadImage("hand2.png");

}

void myInterpolate(){

  if(lines.size()>0){

    float alpha=(frameCount%30)/30.0;

    if(alpha==0.0)R=(R+1)%lines.size();

    int R2=(R+1)%lines.size();

    float[]oldAngle=float(split(lines.get(R),' '));

    float[]newAngle=float(split(lines.get(R2),' '));

    for(int i=0;i<20;i++)angle[i]=oldAngle[i]*(1-alpha)+newAngle[i]*alpha;

  }

}

void draw(){

  myInterpolate();

  background(#FFFFF2);

  image(postman,0,0);

  fill(255,0,255,128);

  rect(0,0,560,560);

  pushMatrix();

    translate(+185,+261);

    rotate(radians(angle[1]));

    translate(-185,-261);

    image(uparm1,0,0);

    pushMatrix();

      translate(+116,+265);

      rotate(radians(angle[2]));

      translate(-116,-265);

      image(hand1,0,0);

     popMatrix();

    popMatrix();

    

    pushMatrix();

      translate(290,262);

      rotate(radians(angle[3]));

      translate(-290,-262);

      image(uparm2,0,0);

      pushMatrix();

        translate(357,259);

        rotate(radians(angle[4]));

        translate(-357,-259);

        image(hand2,0,0);

       popMatrix();

      popMatrix();

      

    

    pushMatrix();

      translate(+236,+231);

      rotate(radians(angle[0]));

      translate(-236,-231);

      image(head,0,0);

      popMatrix();

  image(body,0,0);

}


week11-3

// week11_3_postman_again

//重新來一次,讓程式的架構變更清楚

PImage postman, head, body, uparm1, hand1, uparm2, hand2, foot1, foot2;

void setup(){ //把上面的圖都拉進新專案

  size(560, 560);

  postman = loadImage("postman.png");

  head = loadImage("head.png");

  body = loadImage("body.png");

  uparm1 = loadImage("uparm1.png");

  hand1 = loadImage("hand1.png");

  uparm2 = loadImage("uparm2.png");

  hand2 = loadImage("hand2.png");

  foot1 = loadImage("foot1.png");//增加腳 旋轉中心220,375

  foot2 = loadImage("foot2.png");//增加腳 旋轉中心260,372

}

float [] angleX = new float[10];

float [] angleY = new float[10];

int ID = 0;  //一開始是頭的關節

ArrayList<String> lines = new ArrayList<String>(); 

void keyPressed(){

  if(key=='s'){ 

    String now = "";// 空字串

    for(int i=0; i<10; i++){

      now += + angleX[i] + " "; //後面有空格

      now += + angleY[i] + " "; //後面有空格

    }

    lines.add(now);//把現在這行,加到lines裡

    String [] arr = new String[lines.size()];

    lines.toArray(arr);

    saveStrings("angles.txt", arr);

    println("現在存檔:" +now);

  }

  if(key=='r'){

    String [] file = loadStrings("angles.txt");

    if(file != null){

      for(int i=0; i<file.length; i++){

        lines.add(file[i]);

        println("現在讀檔:" + file[i]); 

      }

    }

  }

  if(key=='p') playing = !playing; //播動畫<=>不播動畫

  

  if(key=='1') ID = 1;//左邊臂

  if(key=='2') ID = 2;//左邊手

  if(key=='3') ID = 3;//右邊臂

  if(key=='4') ID = 4;//右邊手

  if(key=='5') ID = 5;//左邊腳

  if(key=='6') ID = 6;//右邊腳

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

}

boolean playing = false; //一開始,不撥放動畫,按下p可切換

void mouseDragged(){

  angleX[ID] += mouseX - pmouseX;

  angleY[ID] += mouseY - pmouseY; //多了這一行

}

int R = 0;

void myInterpolate(){

  if(lines.size()>=2){ //要有2行以上,才能做內插

    float alpha = (frameCount%30)/30.0; //介於0.0~1.0中間的值 

    if(alpha==0.0) R = (R+1)%lines.size(); //如果變到0就換下一組

    int R2 = (R+1)%lines.size();

    float [] oldAngle = float(split( lines.get( R ), ' '));

    float [] newAngle = float(split( lines.get( R2 ), ' '));

    for(int i=0; i<10; i++){

      angleX[i] = oldAngle[i*2+0]*(1-alpha) + newAngle[i*2+0]*alpha;

      angleY[i] = oldAngle[i*2+1]*(1-alpha) + newAngle[i*2+1]*alpha;

    }

  }

}

void draw(){ 

  background(#FFFFF2);

  if(playing) myInterpolate();

  image(body, 0, 0);//先畫身體

  

  pushMatrix(); 

    translate(+236, +231);//再放回去正確位置

    rotate(radians(angleX[0]));

    translate(-236, -231);//把頭的旋轉中心放到(0,0)

    image(head, 0, 0);//再畫我們的頭

  popMatrix();

  

  pushMatrix();//foot1

    translate(220, 375);

    rotate(radians(angleX[5]));

    translate(-220, -375);

    image(foot1, 0, 0);

  popMatrix();

  pushMatrix(); //foot2

      translate(260, 372);

      rotate(radians(angleX[6]));

      translate(-260, -372);

      image(foot2, 0, 0);

  popMatrix();

    

  pushMatrix();//要畫左邊的上手臂 手肘

    translate(+185, +261);

    rotate(radians(angleX[1]));

    translate(-185, -261);

    image(uparm1, 0, 0);

    pushMatrix();

      translate(+116, +265);

      rotate(radians(angleX[2]));

      translate(-116, -265);

      image(hand1, 0, 0);

    popMatrix();

  popMatrix();

  

  pushMatrix();

    translate(290, 262);

    rotate(radians(angleX[3]));

    translate(-290, -262);

    image(uparm2, 0, 0);

    pushMatrix();

      translate(357, 259);

      rotate(radians(angleX[4]));

      translate(-357, -259);

      image(hand2, 0, 0);

    popMatrix();

  popMatrix();

}



沒有留言:

張貼留言