2022年5月24日 星期二

VERY BEAUTIFUL,VERY POWERFUL

 1.開啟一個新檔案(非開啟一個新專案)


打出下列程式(讀檔)

///

#include <stdio.h>

int main()

{///檔案指標 fout 開啟檔案(檔名, write模式)

    FILE * fout = fopen("file.txt", "w+");

     printf(     "Hello World");

    fprintf(fout,"Hello World");

    fclose(fout);///關閉檔案

}

///
紅色為正確程式碼
執行程式後再資料夾可以找到以下檔案
新增一個資料夾,新增一個檔案
打出下列程式
///
#include <stdio.h>
int main()
{///檔案指標 fout 開啟檔案(檔名, write模式)
    FILE * fout = fopen("file.txt", "w+");
     printf(     "Hello World");
    fprintf(fout,"Hello World");
    fclose(fout);///關閉檔案

    float angle=0;
    FILE * fin = fopen("file.txt", "r");
    fscanf(fin,"%f", &angle );
    printf("讀到了角度:%f", angle);
    fclose(fin);
}
///
紅色為讀檔,寫出去
橘色為讀資料
變成以下結果


把上週的程式碼複製,開啟一個新專案,貼上去
///
///week14_angle_fprintf改自 week13_rect_many_TRT
#include <GL/glut.h>
#include <stdio.h>
float angle[20], oldX= 0;
int angleID=0;///0、1、2、3號關節
FILE *fout = NULL;
void myWrite(){
    if(fout == NULL ) fout = fopen("file.txt", "w+");

    for(int i=0;i<20; i++){
        printf("%.1f ", angle[i]);///從小黑印出來
        fprintf(fout, "%.1f ", angle[i]);///檔案印出來
    }///不用加fclose
}
void keyboard(unsigned char key, int x, int y){
    if( key=='0') angleID=0;
    if( key=='1') angleID=1;
    if( key=='2') angleID=2;
    if( key=='3') angleID=3;
}
void mouse(int button, int state, int x, int y){
    oldX =x;
}
void motion(int x, int y ){
    angle[angleID] += (x-oldX);
    myWrite();
    oldX = x;
    glutPostRedisplay();///讓GLUT重畫
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glColor3f(1, 1, 1);
    glRectf(0.3, 0.5, -0.3, -0.5);///身體座標

    glPushMatrix();///右半邊
        glTranslatef(0.3, 0.4, 0);///(3)把手臂接回身體
        glRotatef(angle[0], 0, 0, 1);///(2)對Z軸旋轉
        glTranslatef(-0.3, -0.4, 0);///(1)手臂旋轉中心放中心

        glColor3f(1, 0, 0);///紅色
        glRectf(0.3, 0.5, 0.7, 0.3);

        glPushMatrix();
            glTranslatef(0.7, 0.4, 0);///(3)把手軸接回去
            glRotatef(angle[1], 0, 0, 1);///(2)對Z軸旋轉
            glTranslatef(-0.7, -0.4, 0);///(1)手臂旋轉中心放中心
            glColor3f(0, 1, 0);///綠色
            glRectf(0.7, 0.5, 1.0, 0.3);///下手臂
        glPopMatrix();

    glPopMatrix();

    glPushMatrix();///左半邊
        glTranslatef(-0.3, 0.4, 0);///(3)把手臂接回身體
        glRotatef(angle[2], 0, 0, 1);///(2)對Z軸旋轉
        glTranslatef(0.3, -0.4, 0);///(1)手臂旋轉中心放中心

        glColor3f(1, 0, 0);///紅色
        glRectf(-0.3, 0.5, -0.7, 0.3);

        glPushMatrix();
            glTranslatef(-0.7, 0.4, 0);///(3)把手軸接回去
            glRotatef(angle[3], 0, 0, 1);///(2)對Z軸旋轉
            glTranslatef(0.7, -0.4, 0);///(1)手臂旋轉中心放中心
            glColor3f(0, 1, 0);///綠色
            glRectf(-0.7, 0.5, -1.0, 0.3);///下手臂
        glPopMatrix();

    glPopMatrix();
    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutInitWindowSize(700, 700);///視窗大小
    glutCreateWindow("week13 rect TRT");

    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutDisplayFunc(display);

    glutMainLoop();
}
///
這樣執行時小黑就會在轉時顯示角度
新增一個程式,讓他可以重複剛剛滑鼠移動的動作(長按r即可重複)
///
///week14_angle_fprintf改自 week13_rect_many_TRT
#include <GL/glut.h>
#include <stdio.h>
float angle[20], oldX= 0;
int angleID=0;///0、1、2、3號關節
FILE *fout = NULL, * fin =NULL;
void myWrite(){
    if(fout == NULL ) fout = fopen("file.txt", "w+");

    for(int i=0;i<20; i++){
        printf("%.1f ", angle[i]);///從小黑印出來
        fprintf(fout, "%.1f ", angle[i]);///檔案印出來
    }///不用加fclose
    printf("\n");///每呼叫一次,小黑跳行
    fprintf(fout, "\n");///每呼叫一次,檔案也跳行
}
void myRead(){
    if( fout !=NULL ){ fclose(fout); fout=NULL; }
    if( fin == NULL ) fin = fopen("file.txt", "r");
    for(int i=0; i<20 ; i++){
        fscanf(fin, "%f", &angle[i] );
    }
    glutPostRedisplay();///重畫畫面
}
void keyboard(unsigned char key, int x, int y){
    if( key=='r') myRead();
    if( key=='0') angleID=0;
    if( key=='1') angleID=1;
    if( key=='2') angleID=2;
    if( key=='3') angleID=3;
}
void mouse(int button, int state, int x, int y){
    oldX =x;
}
void motion(int x, int y ){
    angle[angleID] += (x-oldX);
    myWrite();
    oldX = x;
    glutPostRedisplay();///讓GLUT重畫
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glColor3f(1, 1, 1);
    glRectf(0.3, 0.5, -0.3, -0.5);///身體座標

    glPushMatrix();///右半邊
        glTranslatef(0.3, 0.4, 0);///(3)把手臂接回身體
        glRotatef(angle[0], 0, 0, 1);///(2)對Z軸旋轉
        glTranslatef(-0.3, -0.4, 0);///(1)手臂旋轉中心放中心

        glColor3f(1, 0, 0);///紅色
        glRectf(0.3, 0.5, 0.7, 0.3);

        glPushMatrix();
            glTranslatef(0.7, 0.4, 0);///(3)把手軸接回去
            glRotatef(angle[1], 0, 0, 1);///(2)對Z軸旋轉
            glTranslatef(-0.7, -0.4, 0);///(1)手臂旋轉中心放中心
            glColor3f(0, 1, 0);///綠色
            glRectf(0.7, 0.5, 1.0, 0.3);///下手臂
        glPopMatrix();

    glPopMatrix();

    glPushMatrix();///左半邊
        glTranslatef(-0.3, 0.4, 0);///(3)把手臂接回身體
        glRotatef(angle[2], 0, 0, 1);///(2)對Z軸旋轉
        glTranslatef(0.3, -0.4, 0);///(1)手臂旋轉中心放中心

        glColor3f(1, 0, 0);///紅色
        glRectf(-0.3, 0.5, -0.7, 0.3);

        glPushMatrix();
            glTranslatef(-0.7, 0.4, 0);///(3)把手軸接回去
            glRotatef(angle[3], 0, 0, 1);///(2)對Z軸旋轉
            glTranslatef(0.7, -0.4, 0);///(1)手臂旋轉中心放中心
            glColor3f(0, 1, 0);///綠色
            glRectf(-0.7, 0.5, -1.0, 0.3);///下手臂
        glPopMatrix();

    glPopMatrix();
    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutInitWindowSize(700, 700);///視窗大小
    glutCreateWindow("week13 rect TRT");

    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutDisplayFunc(display);

    glutMainLoop();
}
///

把這個專案的資料夾的cbp檔用nitepad++打開,把dir的位置改成".",分別是第11行跟第21行
變成以下



改完後為了正常運行,把桌面freeglut.dll複製到這個專案的資料夾中

就可以正常執行了時鐘時鐘


時鐘
一次把時鐘設好
///
#include <GL/glut.h>
#include <stdio.h>
void timer (int t){
    printf("起床,現在時間: %d\n", t);
}
void display(){
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14_timer");
    glutTimerFunc(1000, timer, 1);
    glutTimerFunc(2000, timer, 2);
    glutTimerFunc(3000, timer, 3);
    glutTimerFunc(4000, timer, 4);
}
///
自動設定Timer+聲音
///
#include <GL/glut.h>
#include <stdio.h>
#include <mmsystem.h>
void timer (int t){
    printf("起床,現在時間: %d\n", t);
    PlaySound("do.wav", NULL, SND_ASYNC);
    glutTimerFunc(2000, timer, t+1);
}
void display(){
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14_timer");

    glutTimerFunc(5000, timer, 0);///設定:5秒後
    glutDisplayFunc(display);
    glutMainLoop();
}
///
這樣每隔一秒就會提示且有聲音





沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

一.     一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam,                 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...