2022年5月24日 星期二

電腦圖學筆記week14

 Step01-1

  • 在codeblocks建立一個新的Empty file,再建立一個week14-1_fprintf裡面放week14-1.cpp

  • 讀入(fopen開啟檔案、fprintf寫檔、fclose關檔)


#include <stdio.h>
int main()
{
    FILE * fout = fopen("file.txt", "w+");
        printf("Hello World\n"); ///小黑印出來
        fprintf(fout,"Hello World\n"); ///檔案印出來
        fclose(fout);
}
  • 讀入+印出(跟上一步一樣,先建立一個week14-1_fprintf_fscanf裡面放week14-2.cpp)
#include <stdio.h>
int main()
{
    FILE * fout = fopen("file.txt", "w+");
    fprintf(fout,"3.1515926");
    fclose(fout);

    float angle=0;
    FILE * fin = fopen("file.txt", "r");
    fscanf(fin,"%f", &angle);
    printf("讀到了角度%f",angle);
    fclose(fin);
}

Step01-2
    將week13_rect_many_TRT拿來修改
  • 新增一個新的glut專案 week14_angle_fprintf
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]);
    }
}
  • 並在 void motion裡面新增myWrite();  讓myWrite可以運作

  • 因為上面的圖不好看,所以新增兩行程式碼來讓它變好看

Step02-1
    開始做動畫!
  • 建立一個新glut專案  week14_angles_fprintf_fscanf
  • 新增下面的程式碼讓手臂轉起來然後按住'r'可以讓手臂照著之前的軌跡自動旋轉
void myWrite(){
    if(fout == NULL) fout = fopen("file.txt", "w+");
    for(int i=0 ; i<20 ; i++){
        printf(" %.1f ", angle[i]);    /////"%.1f前後要空格不然數字會擠再一起"
        fprintf(fout, " %.1f ",angle[i]);    /////"%.1f前後要空格不然數字會擠再一起"
    }
    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();
}
  • 在keyboard這個函式內新增 if(key=='r') myread(); 這樣按'r'手臂才會自動旋轉

Step02-2
    了解為甚麼有時候檔案file.txt會放在奇怪的地方
    ans: 因為glut專案需要freeglut.dll所以會被放到freeglut\bin裡面
    解決辦法: 
    1.將專案中的.cbp檔案打開然後把紅色框框""中的路徑改成"."
    2.執行這個專案,但發現freeglut.dll出問題了
    3.把freeglut\bin裡面的freeglut.dll這個檔案複製到現在執行的專案的資料夾內
    4.成功!

Step03-1
    glutTimerFunc() 計時器
  • 開新GLUT專案 week14_timer
  • void timer (int t) 寫timer
  • glutTimerFunc( 等多久  ,  timer  ,  t參數  );
#include <stdio.h>
#include <GL/glut.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(2000, timer, 1);
    glutTimerFunc(3000, timer, 2);
    glutTimerFunc(4000, timer, 3);
    glutTimerFunc(5000, timer, 4);
    glutTimerFunc(6000, timer, 5);
    glutDisplayFunc(display);
    glutMainLoop();
}


Step03-2
    期末作品30秒,每秒30格,900個timer,太多了,所以程式應       該自動化,利用函式呼叫函式
  • 建立新GLUT專案week14_timer_one_by_one
  • 設定過五秒後第0個t
#include <stdio.h>
#include <GL/glut.h>
void timer (int t){
    printf("起床,現在時間: %d\n",t);
    glutTimerFunc(1000,timer, t+1);
}
void display(){
}
int main (int argc, char** argv){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 timer");     ////glutTimerFunc( 等多久  ,  timer  ,  t參數  );

    glutTimerFunc(5000, timer, 0);

    glutDisplayFunc(display);
    glutMainLoop();
}

Step03-3
    播放聲音
  • 到Teams的電腦圖學第14周下載do.wav
  • 修改week14_timer_one_by_one的程式碼
  • PlaySound("do.wav", NULL , SND_ASYNC);



    







沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

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