2020年3月24日 星期二

Week03-LSD's HW

1.複習基礎茶壺
程式碼
#include <GL/glut.h>

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

int main(int a,char**b){
    glutInit(&a,b);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Week03");

    glutDisplayFunc(display);
    glutMainLoop();

}


2.點出茶壺座標
程式碼:
#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();///主要迴圈
}


3.移動茶壺
程式碼:
#include <GL/glut.h> 
#include <stdio.h> ///為了printf
float teapotX=0, teapotY=0; /// -1.0 ~ +1.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)
{
    printf("%f %f\n",(x-150)/150.0,(y-150)/150.0);
    teapotX=(x-150)/150.0; /// 讓X:0...300變成 -1...+1
    teapotY=-(y-150)/150.0; ///讓 Y:300...0 變成 -1...+1
}
int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week03");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMainLoop();
}
4.MOUSE畫出圖形

程式碼:
#include <GL/glut.h>
#include <stdio.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清理背景
    glBegin(GL_POLYGON); ///實心圖形
        glColor3f(211/255.0, 203/255.0, 87/255.0); ///顏色
        glVertex2f( (144-150)/150.0, -(78-150)/150.0);
        glVertex2f( (118-150)/150.0, -(73-150)/150.0);
        glVertex2f( (109-150)/150.0, -(42-150)/150.0);
        glVertex2f( (84-150)/150.0, -(22-150)/150.0);
        glVertex2f( (55-150)/150.0, -(22-150)/150.0);
        glVertex2f( (39-150)/150.0, -(40-150)/150.0);
        glVertex2f( (7-150)/150.0, -(72-150)/150.0);
        glVertex2f( (7-150)/150.0, -(101-150)/150.0);
        glVertex2f( (16-150)/150.0, -(150-150)/150.0);
        glVertex2f( (49-150)/150.0, -(160-150)/150.0);
        glVertex2f( (88-150)/150.0, -(202-150)/150.0);
        glVertex2f( (120-150)/150.0, -(252-150)/150.0);
        glVertex2f( (139-150)/150.0, -(268-150)/150.0);
        glVertex2f( (188-150)/150.0, -(250-150)/150.0);
        glVertex2f( (219-150)/150.0, -(206-150)/150.0);
        glVertex2f( (257-150)/150.0, -(158-150)/150.0);
        glVertex2f( (267-150)/150.0, -(86-150)/150.0);
        glVertex2f( (270-150)/150.0, -(38-150)/150.0);
        glVertex2f( (232-150)/150.0, -(38-150)/150.0);
        glVertex2f( (184-150)/150.0, -(38-150)/150.0);
        glVertex2f( (147-150)/150.0, -(47-150)/150.0);
        glVertex2f( (147-150)/150.0, -(75-150)/150.0);
        /// 圖形是300*300大小
   
        glEnd();
        glutSwapBuffers();
}
void mouse(int button, int state, int x,int y)
{
    if(state==GLUT_DOWN){
        printf(" glVertex2f( (%d-150)/150.0, -(%d-150)/150.0);\n",x,y);
    }
}
int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week03");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMainLoop();
}
*圓的畫法
       glBegin(GL_POLYGON);
           for(float angle=0;angle<=2*3.1415;angle+=0.01)///兩個拍就是圓,一個拍是半圓
            {
               glVertex2f(0.1*cos(angle),0.5*sin(angle));///前面的係數是大小
            }
        glEnd();

沒有留言:

張貼留言