2020年3月17日 星期二

圖學筆記-03

前情提要:




程式碼:

#include<GL/glut.h>///函式庫
void display()
{
    glColor3f(0.5,1.0,0.2);
    ///gl開頭 3f結尾 (3個float數字)中間color
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc,char**argv)
{
    glutInit(&argc,argv); ///將main()的參數放進來
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    ///啟動3D的顯示能力(兩倍顯示 |看3D的深度)
    glutCreateWindow("Week02");///3D視窗名
    glutDisplayFunc(display);///用display這個func畫
    glutMainLoop();///主要迴圈
}


詳細複習上周

注:上課前先把freeglut壓縮檔解壓縮並且設定完!



1.glutMouseFunc



顏色:新增的程式碼/註解

#include<GL/glut.h>///函式庫
#include<stdio.h>///為了printf

void display()
{
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}

void mouse(int button,int state,int x,int y)
///mouse函式:左中右鍵,Down/Up,X座標,y座標
{

    printf("%d %d %d %d\n",button,state,x,y);
    ///測試給你「值」

}
int main(int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Week03");///3D視窗名
    glutDisplayFunc(display);///用display這個func畫

    glutMouseFunc(mouse);

    glutMainLoop();///主要迴圈
}

成果:









2.Translatef


程式碼:
#include<GL/glut.h>///函式庫
#include<stdio.h>///為了printf

void display()
{
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}

void mouse(int button,int state,int x,int y)
///mouse函式:左(0)中(1)右(2)鍵,Down/Up,X座標,y座標
{

    printf("%f %f\n",(x-150)/150.0,(y-150)/150.0);
    ///x:0  ~ 300 變成 -1 ~ +1
    ///y:300~   0 變成 -1 ~ +1

}
int main(int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Week03");///3D視窗名
    glutDisplayFunc(display);///用display這個func畫

    glutMouseFunc(mouse);

    glutMainLoop();///主要迴圈
}

解說:

以這個視窗的中點為中心,實際上座標為(150,150),





由於printf("%f %f\n",(x-150)/150.0,(y-150)/150.0);的關係,
將我們滑鼠所點擊的位置呈現為相對位置!
正題開始:

程式碼:

#include<GL/glut.h>///函式庫
#include<stdio.h>///為了printf
float teapotX=0,teapotY=0;///宣告目標的座標
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清上個痕跡
    glPushMatrix(); ///備份矩陣
    glTranslatef(teapotX,teapotY,0); ///移動
    glutSolidTeapot(0.3);
    glPopMatrix();///備份矩陣
    glutSwapBuffers();
}

void mouse(int button,int state,int x,int y)
///mouse函式:左(0)中(1)右(2)鍵,Down/Up,X座標,y座標
{

    printf("%f %f\n",(x-150)/150.0,(y-150)/150.0);
    ///x:0  ~ 300 變成 -1 ~ +1
    ///y:300~   0 變成 -1 ~ +1
    teapotX=(x-150)/150.0;
    ///更改X位置
    teapotY=-(y-150)/150.0;
    ///更改Y位置
}
int main(int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Week03");///3D視窗名
    glutDisplayFunc(display);///用display這個func畫

    glutMouseFunc(mouse);

    glutMainLoop();///主要迴圈
}

成果:



注:為了讓teapotY的位置出現在正確的位置上,必須加負號。
例子:點的Y值為160(絕對位置)(圖一)
-(160-150)/150.0=-(10)/150.0 
得到:teapotY=-0.06666...
相對於(150,150)只要Y往左移動0.0666格(圖二)

位置表示
圖一
圖二


















3.用滑鼠來寫程式

程式碼:

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ///清背景
    glBegin(GL_POLYGON);
    glEnd();
    glutSwapBuffers();
}

void mouse(int button,int state,int x,int y)
///mouse函式:左(0)中(1)右(2)鍵,Down/Up,X座標,y座標
{
    if(state==GLUT_DOWN)///只判定滑鼠按下的座標
        {
                printf("        glVertex2f( (%d-150)/150.0,-(%d-150)/150.0);\n",x,y);
        }
}

正題:
變成









4.小畫家座標換算

透過吸管可以知道該顏色的RGB
透過鼠標位置可以知道其(X,Y)

glClearColor(240/255.0,106/255.0,53/255.0,1);///RGB 240 106 53///背景顏色


通過描點後得到結果





6.cos()sin()可畫圓


#include<GL/glut.h>///函式庫
#include<stdio.h>///為了printf
#include<math.h>///為了cos和sin
float teapotX=0,teapotY=0;///宣告目標的座標
void display()
{
    glClearColor(240/255.0,106/255.0,53/255.0,1);///RGB 240 106 53///背景顏色
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ///清背景
    glBegin(GL_POLYGON);
        for(float angle=0;angle<=3.1415;angle+=0.01)
        {
            glVertex2f( cos(angle),sin(angle));
        }
    glEnd();
    glutSwapBuffers();

}
結果:
解說:

3.1415->圓周率
透過cos和sin可以變成圓形的曲線




示意圖

沒有留言:

張貼留言