2017年3月18日 星期六

Week03陳冠霖的上課筆記

複習上周的畫茶壺:
打開GLUT project,將多餘的程式碼刪掉,由178行變成10行。
程式碼如下:
#include <GL/glut.h>
static void display(void)
{
    glutSolidTeapot(0.3);~~~畫茶壺。
    glutSwapBuffers();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("GLUT Shapes");
    glutDisplayFunc(display);
    glutMainLoop();
}
本周課程:
每次點擊放開能顯示出滑鼠的資料(一次顯示2筆資料)
在程式碼中加入滑鼠的點擊函式:void mouse(int button, int state,int x, int y)。
button:滑鼠按鍵種類
state:滑鼠按鍵狀態,點下0,放開1
x,y:滑鼠的座標
在滑鼠的點擊函式中加入printf("%d %d %d %d\n", button, state, x, y);P.S:要使用printf標投必須有#include <stdio.h>
在main()的主程式裡加入glutMouseFunc(mouse);用來呼叫滑鼠的點擊函式。
程式碼如下:
#include <GL/glut.h>
#include <stdio.h>
void mouse(int button, int state, int x, int y)
{
    printf("%d %d %d %d\n", button, state, x, y);
}
static void display(void)
{
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("GLUT Shapes");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMainLoop();
}
每次點擊能根據座標變換圖案的顏色
在void mouse(int button, int state,int x, int y)滑鼠的點擊函式中加入 glColor3f(1,x/300.0,y/300.0);
    glutPostRedisplay();。
glColor3f(1,x/300.0,y/300.0);可以改變圖案的顏色,300.0代表視窗大小,除300.0可隨時調整作改變。
glutPostRedisplay();用來重新顯示(整理)display的程式,讓void mouse滑鼠的點擊函式能順利執行顯示。PS:Post便利貼用來提醒程式碼。
程式碼如下:
#include <GL/glut.h>
#include <stdio.h>
void mouse(int button, int state, int x, int y)
{
    printf("%d %d %d %d\n", button, state, x, y);
    glColor3f(1,x/300.0,y/300.0);
    glutPostRedisplay();
}
static void display(void)
{
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("GLUT Shapes");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMainLoop();
}
不只滑鼠點擊能顯示資料和變換顏色,增加能讓滑鼠移動也能顯示資料和變換顏色
在程式碼裡新增一個void motion(int x, int y)滑鼠的移動函式,在滑鼠的移動函式中加入printf("%d %d\n", x, y);,再加入glColor3f(1,x/300.0,y/300.0);glutPostRedisplay();
在main()的主程式裡加入glutMotionFunc(motion);用來呼叫滑鼠移動函式。
程式碼如下:
#include <GL/glut.h>
#include <stdio.h>
void mouse(int button, int state, int x, int y)
{
    printf("%d %d %d %d\n", button, state, x, y);
    glColor3f(1,x/300.0,y/300.0);
    glutPostRedisplay();
}
static void display(void)
{
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void motion(int x, int y)
{
    printf("%d %d\n", x, y);
    glColor3f(1,x/300.0,y/300.0);
    glutPostRedisplay();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("GLUT Shapes");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}
顯示座標的另一種方式
在void motion(int x, int y)滑鼠的移動函式新增printf("glVertex(%.2f,%.2f)\n",(x-250)/500.0,-(y-250)/500.0);
程式碼如下:
void motion(int x, int y)
{
    printf("%d %d\n", x, y);
    printf("glVertex(%.2f,%.2f)\n",(x-250)/500.0,-(y-250)/500.0);
    glColor3f(1,x/300.0,y/300.0);
    glutPostRedisplay();
}
畫出圓形或多角形圖案
在標投加入#include <math.h> ,讓數學符號能在程式中運算,EX:cos, sin.....等。
刪除static void display(void)中畫茶壺的程式碼 glutSolidTeapot(0.3);
在static void display(void)加入glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_POLYGON);
 for(float angle = 0; angle < 3.1415926*2; angle+=0.001)
    {
        glVertex2f( cos(angle), sin(angle));
    }
        glEnd();
程式碼如下:
#include <GL/glut.h>
#include <math.h>
static void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_POLYGON);~~~清出一些設定值。
    for(float angle = 0; angle < 3.1415926*2; angle+=0.001)
    {
        glVertex2f( cos(angle), sin(angle));
    }~~~整個for迴圈的程式,就是主要畫出圓的程式,做一次迴圈就代表一個點,形成很多點就成了圓型。如果點變少,像只有8個點,就會變成八角形。
        glEnd();
        glutSwapBuffers();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("GLUT Shapes");
    glutDisplayFunc(display);
    glutMainLoop();
}

沒有留言:

張貼留言