2021年6月7日 星期一

我不想出錢 Week16



先開啟15週的程式碼






















開一個新專案week16_interpolation,把15週的程式碼貼到16週的!






















///新專案,刪光光,放入上週程式,改成week16,把 float angle 改成 float angle[20]
#include <stdio.h>
#include <GL/glut.h>
float angle[20]={},diff=2;///都是0的陣列 angle;///上週程式,會增加、會減少!!!
int angleID=0;///上週程式,會增加、會減少!!!

void timer(int t)///上週程式,會增加、會減少!!
{
    glutTimerFunc( 30, timer, t+1 );///上週程式 設定新的timer
    angle[angleID] += diff;///上週程式,會增加、會減少!!!
    if(angle[angleID]>90) diff = -2;///上週程式,會增加、會減少!!!
    if(angle[angleID]<0) diff = +2;///上週程式,會增加、會減少!!!
    glutPostRedisplay();///上週教display();
}
void keyboard(unsigned char key, int x, int y)
{
    if( key=='0') angleID=0; ///之後timer()會改變關節 angle()
    if( key=='1') angleID=1;
    if( key=='2') angleID=2;
    if( key=='3') angleID=3;
}
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glPushMatrix();///Step05-2
        glutSolidTeapot( 0.3 );///身體
        glPushMatrix();///Step05-2
            glTranslatef(-0.3,0,0);
            glRotatef(angle[0], 0,0,1);//(下週Week16-1接著教) angle[0]
            glTranslatef(-0.3,0,0);
            glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置
            glPushMatrix();
                glTranslatef(-0.3, 0,0);
                glRotatef(angle[1], 0,0,1);//(下週Week16-1接著教) angle[1]
                glTranslatef(-0.3, 0,0);
                glutSolidTeapot( 0.3 );///左手肘
            glPopMatrix();
        glPopMatrix();///Step05-2
        glPushMatrix();///Step05-2
            glTranslatef(+0.3,0,0);
            glRotatef(-angle[2], 0,0,1);//(下週Week16-1接著教) angle[2]
            glTranslatef(+0.3,0,0);
            glutSolidTeapot( 0.3 );///右手臂
            glPushMatrix();///step05-3
                glTranslatef(+0.3,0,0);
                glRotatef(-angle[3], 0,0,1);//(下週Week16-1接著教) angle[3]...
                glTranslatef(+0.3,0,0);
                glutSolidTeapot( 0.3 );///右手肘
            glPopMatrix();///Step05-3
        glPopMatrix();///Step05-2
    glPopMatrix();///Step05-2
    glutSwapBuffers();
}
int main( int argc, char** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow( "week15 many angles" );

    glutKeyboardFunc( keyboard );
    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0);
    glutMainLoop();
}///先不放貼圖, 先不放打光









































///新專案,刪光光,放入上週程式,改成week16,把 float angle 改成 float angle[20]
#include <stdio.h>
#include <GL/glut.h>
float angle[20]={},diff=2;///都是0的陣列 angle;///上週程式,會增加、會減少!!!
int angleID=0;///上週程式,會增加、會減少!!!

void timer(int t)///上週程式,會增加、會減少!!
{///timer()什麼都不做
 ///   glutTimerFunc( 30, timer, t+1 );///上週程式 設定新的timer
}
///想要用 mouse() 及 motion() 來操作關節!!! (期末作品),第07週教過
int oldX=0, oldY=0;
void mouse( int button, int state, int x, int y)
{///mouse按下去時,記下現在的位置,冰箱門打開, 把大象放進去, 冰箱門關起來
    oldX = x;
    oldY = y;
}
void motion(int x, int y)
{///mouse motion時,會叫這個 motion()
    angle[angleID] += x - oldX;
    oldX = x;
    glutPostRedisplay();///上週教display();
}
void keyboard(unsigned char key, int x, int y)
{
    if( key=='0') angleID=0; ///之後timer()會改變關節 angle()
    if( key=='1') angleID=1;
    if( key=='2') angleID=2;
    if( key=='3') angleID=3;
}
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glPushMatrix();///Step05-2
        glutSolidTeapot( 0.3 );///身體
        glPushMatrix();///Step05-2
            glTranslatef(-0.3,0,0);
            glRotatef(angle[0], 0,0,1);//(下週Week16-1接著教) angle[0]
            glTranslatef(-0.3,0,0);
            glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置
            glPushMatrix();
                glTranslatef(-0.3, 0,0);
                glRotatef(angle[1], 0,0,1);//(下週Week16-1接著教) angle[1]
                glTranslatef(-0.3, 0,0);
                glutSolidTeapot( 0.3 );///左手肘
            glPopMatrix();
        glPopMatrix();///Step05-2
        glPushMatrix();///Step05-2
            glTranslatef(+0.3,0,0);
            glRotatef(-angle[2], 0,0,1);//(下週Week16-1接著教) angle[2]
            glTranslatef(+0.3,0,0);
            glutSolidTeapot( 0.3 );///右手臂
            glPushMatrix();///step05-3
                glTranslatef(+0.3,0,0);
                glRotatef(-angle[3], 0,0,1);//(下週Week16-1接著教) angle[3]...
                glTranslatef(+0.3,0,0);
                glutSolidTeapot( 0.3 );///右手肘
            glPopMatrix();///Step05-3
        glPopMatrix();///Step05-2
    glPopMatrix();///Step05-2
    glutSwapBuffers();
}
int main( int argc, char** argv )
{

    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow( "week15 many angles" );

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc( keyboard );
    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0);
    glutMainLoop();
}///先不放貼圖, 先不放打光





















///新專案,刪光光,放入上週程式,改成week16,把 float angle 改成 float angle[20]
#include <stdio.h>
#include <GL/glut.h>
float angle[20]={},diff=2;///都是0的陣列 angle;///上週程式,會增加、會減少!!!
int angleID=0;///上週程式,會增加、會減少!!!

void timer(int t)///上週程式,會增加、會減少!!
{///timer()什麼都不做
 ///   glutTimerFunc( 30, timer, t+1 );///上週程式 設定新的timer
}
///想要用 mouse() 及 motion() 來操作關節!!! (期末作品),第07週教過
int oldX=0, oldY=0;
void mouse( int button, int state, int x, int y)
{///mouse按下去時,記下現在的位置,冰箱門打開, 把大象放進去, 冰箱門關起來
    oldX = x;
    oldY = y;
}
void motion(int x, int y)
{///mouse motion時,會叫這個 motion()
    angle[angleID] += x - oldX;
    oldX = x;
    glutPostRedisplay();///上週教display();
}
#include <stdio.h> ///step03: 上週教的第0步 才能用 fopen() printf() fprintf()
FILE * fout = NULL;///step03: 上週教的第1步
void keyboard(unsigned char key, int x, int y)
{
    if( key=='0') angleID=0; ///之後timer()會改變關節 angle[0]
    if( key=='1') angleID=1; ///之後timer()會改變關節 angle[1]
    if( key=='2') angleID=2; ///之後timer()會改變關節 angle[2]
    if( key=='3') angleID=3; ///之後timer()會改變關節 angle[3]
    if( key=='s')
    {///step03: 想要存檔 Save
        if(fout == NULL) fout = fopen("angle.txt", "w+");///step03 若NULL, fopen()
        for(int i=0; i<20; i++) printf("%.2f", angle[i] );///step03 for迴圈印陣列
        printf("\n");
        for(int i=0; i<20; i++) fprintf(fout, "%.2f", angle[i] );///step03 for迴圈印陣列
        fprintf(fout,"\n");
    }
}
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glPushMatrix();///Step05-2
        glutSolidTeapot( 0.3 );///身體
        glPushMatrix();///Step05-2
            glTranslatef(-0.3,0,0);
            glRotatef(angle[0], 0,0,1);//(下週Week16-1接著教) angle[0]
            glTranslatef(-0.3,0,0);
            glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置
            glPushMatrix();
                glTranslatef(-0.3, 0,0);
                glRotatef(angle[1], 0,0,1);//(下週Week16-1接著教) angle[1]
                glTranslatef(-0.3, 0,0);
                glutSolidTeapot( 0.3 );///左手肘
            glPopMatrix();
        glPopMatrix();///Step05-2
        glPushMatrix();///Step05-2
            glTranslatef(+0.3,0,0);
            glRotatef(-angle[2], 0,0,1);//(下週Week16-1接著教) angle[2]
            glTranslatef(+0.3,0,0);
            glutSolidTeapot( 0.3 );///右手臂
            glPushMatrix();///step05-3
                glTranslatef(+0.3,0,0);
                glRotatef(-angle[3], 0,0,1);//(下週Week16-1接著教) angle[3]...
                glTranslatef(+0.3,0,0);
                glutSolidTeapot( 0.3 );///右手肘
            glPopMatrix();///Step05-3
        glPopMatrix();///Step05-2
    glPopMatrix();///Step05-2
    glutSwapBuffers();
}
int main( int argc, char** argv )
{

    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow( "week15 many angles" );

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc( keyboard );
    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0);
    glutMainLoop();
}///先不放貼圖, 先不放打光























小黑窗關掉後,angle.txt才會更新! 以下實際操作,請follow me往下~~~





















記事本不會更新,因為小黑窗還開著!





















小黑窗關掉後,再把記事本angle.txt重開,才會更新成剛剛小黑窗的數值!



///新專案,刪光光,放入上週程式,改成week16,把 float angle 改成 float angle[20]
#include <stdio.h>
#include <GL/glut.h>
float angle[20]={},diff=2;///都是0的陣列 angle;///上週程式,會增加、會減少!!!
int angleID=0;///上週程式,會增加、會減少!!!

void timer(int t)///上週程式,會增加、會減少!!
{///timer()什麼都不做
 ///   glutTimerFunc( 30, timer, t+1 );///上週程式 設定新的timer
}
///想要用 mouse() 及 motion() 來操作關節!!! (期末作品),第07週教過
int oldX=0, oldY=0;
void mouse( int button, int state, int x, int y)
{///mouse按下去時,記下現在的位置,冰箱門打開, 把大象放進去, 冰箱門關起來
    oldX = x;
    oldY = y;
}
void motion(int x, int y)
{///mouse motion時,會叫這個 motion()
    angle[angleID] += x - oldX;
    oldX = x;
    glutPostRedisplay();///上週教display();
}
#include <stdio.h> ///step03: 上週教的第0步 才能用 fopen() printf() fprintf()
FILE * fout = NULL;///step03: 上週教的第1步
FILE * fin = NULL;///step04: 準備讀檔的 fin input用
void keyboard(unsigned char key, int x, int y)
{
    if( key=='0') angleID=0; ///之後timer()會改變關節 angle[0]
    if( key=='1') angleID=1; ///之後timer()會改變關節 angle[1]
    if( key=='2') angleID=2; ///之後timer()會改變關節 angle[2]
    if( key=='3') angleID=3; ///之後timer()會改變關節 angle[3]
    if( key=='s')
    {///step03: 想要存檔 Save
        if(fout == NULL) fout = fopen("angle.txt", "w+");///step03 若NULL, fopen()
        for(int i=0; i<20; i++) printf("%.2f", angle[i] );///step03 for迴圈印陣列
        printf("\n");
        for(int i=0; i<20; i++) fprintf(fout, "%.2f", angle[i] );///step03 for迴圈印陣列
        fprintf(fout,"\n");
    }///你必須 fclose(fout) 或「程式關閉」後,才更新硬碟裡的 angle.txt
    if( key=='r')
    {///step04: read 想讀進來
        if(fin == NULL) fin = fopen("angle.txt", "r");///step04 若NULL, fopen() r模
        for(int i=0; i<20; i++) fscanf(fin, "%f", &angle[i]);///step04
        glutPostRedisplay();///step04 重畫畫面
    }
}
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glPushMatrix();///Step05-2
        glutSolidTeapot( 0.3 );///身體
        glPushMatrix();///Step05-2
            glTranslatef(-0.3,0,0);
            glRotatef(angle[0], 0,0,1);//(下週Week16-1接著教) angle[0]
            glTranslatef(-0.3,0,0);
            glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置
            glPushMatrix();
                glTranslatef(-0.3, 0,0);
                glRotatef(angle[1], 0,0,1);//(下週Week16-1接著教) angle[1]
                glTranslatef(-0.3, 0,0);
                glutSolidTeapot( 0.3 );///左手肘
            glPopMatrix();
        glPopMatrix();///Step05-2
        glPushMatrix();///Step05-2
            glTranslatef(+0.3,0,0);
            glRotatef(-angle[2], 0,0,1);//(下週Week16-1接著教) angle[2]
            glTranslatef(+0.3,0,0);
            glutSolidTeapot( 0.3 );///右手臂
            glPushMatrix();///step05-3
                glTranslatef(+0.3,0,0);
                glRotatef(-angle[3], 0,0,1);//(下週Week16-1接著教) angle[3]...
                glTranslatef(+0.3,0,0);
                glutSolidTeapot( 0.3 );///右手肘
            glPopMatrix();///Step05-3
        glPopMatrix();///Step05-2
    glPopMatrix();///Step05-2
    glutSwapBuffers();
}
int main( int argc, char** argv )
{

    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow( "week15 many angles" );

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc( keyboard );
    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0);
    glutMainLoop();
}///先不放貼圖, 先不放打光





















working dir 一樣改"."





















複製貼上freeglut.dll





















第一次先開小視窗,按s多存幾個動作,關掉小黑,開angle.txt(16週專案資料夾裡應該有),看有沒有更新剛剛的數值,有的話再重開小黑窗,直接按r,茶壺就會根據存的動作去動了。





















多加程式碼,讓茶壺動一個關節,就可以跑出很多數值,而且不用再按"s"(想按也是可),就能自動存了!
🌟小tip:存動作時,滑鼠可以動快一點,這樣最後移動的速度會比較快,因為最後出來的動作會根據所存的速度去移動。🌟





















下個步驟一樣關掉小黑,開angle.txt檢查有沒有東西,有的話再開小黑,直接按"r"就會動了!!!!這週作業就成功!!!(淚流滿面貌💧💦)

///新專案,刪光光,放入上週程式,改成week16,把 float angle 改成 float angle[20]
#include <stdio.h>
#include <GL/glut.h>
float angle[20]={},diff=2;///都是0的陣列 angle;///上週程式,會增加、會減少!!!
int angleID=0;///上週程式,會增加、會減少!!!

void timer(int t)///上週程式,會增加、會減少!!
{///timer()什麼都不做
 ///   glutTimerFunc( 30, timer, t+1 );///上週程式 設定新的timer
}
///想要用 mouse() 及 motion() 來操作關節!!! (期末作品),第07週教過
int oldX=0, oldY=0;
void mouse( int button, int state, int x, int y)
{///mouse按下去時,記下現在的位置,冰箱門打開, 把大象放進去, 冰箱門關起來
    oldX = x;
    oldY = y;
}
#include <stdio.h> ///step03: 上週教的第0步 才能用 fopen() printf() fprintf()
FILE * fout = NULL;///step03: 上週教的第1步
FILE * fin = NULL;///step04: 準備讀檔的 fin input用
void motion(int x, int y)
{///mouse motion時,會叫這個 motion()
    angle[angleID] += x - oldX;
    oldX = x;
    glutPostRedisplay();///上週教display();

    ///step06 現在老師想要邊 motion 邊存檔!!!
    ///把剛剛 keyboard 的 if(key=='s') 的存檔, 複製到這裡
    ///啊,移到樓上 fout 還有 #include <stdio.h>

    if(fout == NULL) fout = fopen("angle.txt", "w+");///step03 若NULL, fopen()
    for(int i=0; i<20; i++) printf("%.2f ", angle[i] );///step03 for迴圈印陣列
    printf("\n");
    for(int i=0; i<20; i++) fprintf(fout, "%.2f ", angle[i] );///step03 for迴圈印陣列
    fprintf(fout,"\n");
}

void keyboard(unsigned char key, int x, int y)
{
    if( key=='0') angleID=0; ///之後timer()會改變關節 angle[0]
    if( key=='1') angleID=1; ///之後timer()會改變關節 angle[1]
    if( key=='2') angleID=2; ///之後timer()會改變關節 angle[2]
    if( key=='3') angleID=3; ///之後timer()會改變關節 angle[3]
    if( key=='s')
    {///step03: 想要存檔 Save
        if(fout == NULL) fout = fopen("angle.txt", "w+");///step03 若NULL, fopen()
        for(int i=0; i<20; i++) printf("%.2f", angle[i] );///step03 for迴圈印陣列
        printf("\n");
        for(int i=0; i<20; i++) fprintf(fout, "%.2f", angle[i] );///step03 for迴圈印陣列
        fprintf(fout,"\n");
    }///你必須 fclose(fout) 或「程式關閉」後,才更新硬碟裡的 angle.txt
    if( key=='r')
    {///step04: read 想讀進來
        if(fin == NULL) fin = fopen("angle.txt", "r");///step04 若NULL, fopen() r模
        for(int i=0; i<20; i++) fscanf(fin, "%f", &angle[i]);///step04
        glutPostRedisplay();///step04 重畫畫面
    }
}
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glPushMatrix();///Step05-2
        glutSolidTeapot( 0.3 );///身體
        glPushMatrix();///Step05-2
            glTranslatef(-0.3,0,0);
            glRotatef(angle[0], 0,0,1);//(下週Week16-1接著教) angle[0]
            glTranslatef(-0.3,0,0);
            glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置
            glPushMatrix();
                glTranslatef(-0.3, 0,0);
                glRotatef(angle[1], 0,0,1);//(下週Week16-1接著教) angle[1]
                glTranslatef(-0.3, 0,0);
                glutSolidTeapot( 0.3 );///左手肘
            glPopMatrix();
        glPopMatrix();///Step05-2
        glPushMatrix();///Step05-2
            glTranslatef(+0.3,0,0);
            glRotatef(-angle[2], 0,0,1);//(下週Week16-1接著教) angle[2]
            glTranslatef(+0.3,0,0);
            glutSolidTeapot( 0.3 );///右手臂
            glPushMatrix();///step05-3
                glTranslatef(+0.3,0,0);
                glRotatef(-angle[3], 0,0,1);//(下週Week16-1接著教) angle[3]...
                glTranslatef(+0.3,0,0);
                glutSolidTeapot( 0.3 );///右手肘
            glPopMatrix();///Step05-3
        glPopMatrix();///Step05-2
    glPopMatrix();///Step05-2
    glutSwapBuffers();
}
int main( int argc, char** argv )
{

    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow( "week15 many angles" );

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc( keyboard );
    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0);
    glutMainLoop();
}///先不放貼圖, 先不放打光


沒有留言:

張貼留言

Week18期末作業(橘貓的跳舞熊熊)

 期末作業(橘貓的跳舞熊熊) 影片: https://youtu.be/R89tptMaQZw 程式碼: #include <opencv/highgui.h> #include <opencv/cv.h> #include <GL/glut.h...