计算机图形学-Code 3

版权声明:本文为博主原创文章,欢迎转载,转载请贴上博客地址 http://blog.csdn.net/xdg_blog https://blog.csdn.net/xdg_blog/article/details/52849036
/*------------------------------------
author:XD_G
location:SWUN
time:09/2015~01/2016
course:Computer Graphics
teacher:Tianyun Huang
如果认识黄天云老师,请代我向他问好!
------------------------------------*/
#include <iostream>
#include <GL/glut.h>
#include <cmath>

#define PI 3.141592653

#pragma comment( lib , "opengl32.lib")
#pragma comment( lib , "glu32.lib" )
#pragma comment( lib , "glut32.lib" )

using namespace std;

int Wnd_W = 800 / 2;
int Wnd_H = 600 / 2;
double aspect = Wnd_W / Wnd_H;

double Ortho_left = -Wnd_W / 1.5;
double Ortho_right = Wnd_W / 1.5;
double Ortho_bottom = -Wnd_H / 1.5;
double Ortho_top = Wnd_H / 1.5;
double near = -500.0;
double far = 2000.0;

double LookAt_eyex = 125;
double LookAt_eyey = 105;
double LookAt_eyez = -175;
double LookAt_centerx = 10;
double LookAt_centery = 0;
double LookAt_centerz = 0;
double LookAt_upx = 0.25;
double LookAt_upy = -0.5;
double LookAt_upz = -2.5;


class Point {       //point struct
public:
    int x;
    int y;
    int z;
    Point() :x(0), y(0), z(0) {}
    Point(int  a, int  b, int c) :x(a), y(b), z(c) {}
    Point(const Point& src) : x(src.x), y(src.y), z(src.z) {}
    Point& operator=(const Point &src) {
        if (this != &src) {
            this->x = src.x;
            this->y = src.y;
            this->z = src.z;
        }
        return *this;
    }
};

//color table
GLfloat black_color[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat red_color[] = { 1.0,0.0,0.0,1.0 };
GLfloat green_color[] = { 0.0, 1.0, 0.0, 1.0 };
GLfloat blue_color[] = { 0.0, 0.0, 1.0, 1.0 };
GLfloat white_color[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat grey_color[] = { 0.5, 0.5, 0.5, 1.0 };

inline void GL_Line(int x0, int y0, int z0, int x1, int y1, int z1, GLfloat* color, int width = 1) {//作直线
    glColor4fv(color);
    glLineWidth(width);
    glBegin(GL_LINES);
    glVertex3f(x0, y0, z0);
    glVertex3f(x1, y1, z1);
    glEnd();
}

inline void GL_Line(Point p1, Point p2, GLfloat* color, int width = 1) {//作直线
    glColor4fv(color);
    glLineWidth(width);
    glBegin(GL_LINES);
    glVertex3d(p1.x, p1.y, p1.z);
    glVertex3d(p2.x, p2.y, p2.z);
    glEnd();
}

void draw_rect(Point p1, Point p2, Point p3, Point p4, GLfloat* color, int width = 1) {
    glColor4fv(color);
    glLineWidth(width);
    glBegin(GL_LINE_LOOP);
    glVertex3d(p1.x, p1.y, p1.z);
    glVertex3d(p2.x, p2.y, p2.z);
    glVertex3d(p3.x, p3.y, p3.z);
    glVertex3d(p4.x, p4.y, p4.z);
    glEnd();
}

void draw_cube(GLfloat* color, int width = 1) {
    Point p1(-100, 100, 100);
    Point p2(100, 100, 100);
    Point p3(100, -100, 100);
    Point p4(-100, -100, 100);
    Point p5(-100, 100, -100);
    Point p6(100, 100, -100);
    Point p7(100, -100, -100);
    Point p8(-100, -100, -100);

    draw_rect(p1, p2, p3, p4, color, width);
    draw_rect(p5, p6, p2, p1, color, width);
    draw_rect(p8, p7, p6, p5, color, width);
    draw_rect(p4, p3, p7, p8, color, width);
}

inline double transradian(int angle) {
    return angle*PI / 180;//将角度转换为弧度
}

//球体
void draw_sphere(double R, int n, GLfloat* color, int width = 1) {
    int longitude = 0;//纬度
    int latitude = 0;//经度
    int incremental = 360/n;

    glColor4fv(color);
    glLineWidth(width);

    for (longitude = 0; longitude <= 180; longitude += incremental) {
        glBegin(GL_LINE_LOOP);
        for (latitude = -180; latitude <= 180; latitude += incremental) {
            glVertex3f(
                R*sin(transradian(longitude))*cos(transradian(latitude)), 
                R*sin(transradian(longitude))*sin(transradian(latitude)), 
                R*cos(transradian(longitude))
                );
        }
        glEnd();

    }

    for (latitude = -180; latitude <= 180; latitude += incremental) {
        glBegin(GL_LINE_LOOP);
        for (longitude = 0; longitude <= 180; longitude += incremental) {
            glVertex3f(
                R*sin(transradian(longitude))*cos(transradian(latitude)),
                R*sin(transradian(longitude))*sin(transradian(latitude)),
                R*cos(transradian(longitude))
                );
        }
        glEnd();
    }

}

//椭球
void draw_oblong(double Rx, double Ry, double Rz, int n, GLfloat* color, int width = 1) {
    int longitude = 0;//纬度
    int latitude = 0;//经度
    int incremental = 360 / n;

    glColor4fv(color);
    glLineWidth(width);

    for (longitude = 0; longitude <= 180; longitude += incremental) {
        glBegin(GL_LINE_LOOP);
        for (latitude = -180; latitude <= 180; latitude += incremental) {
            glVertex3f(
                Rx*sin(transradian(longitude))*cos(transradian(latitude)),
                Ry*sin(transradian(longitude))*sin(transradian(latitude)),
                Rz*cos(transradian(longitude))
                );
        }
        glEnd();

    }

    for (latitude = -180; latitude <= 180; latitude += incremental) {
        glBegin(GL_LINE_LOOP);
        for (longitude = 0; longitude <= 180; longitude += incremental) {
            glVertex3f(
                Rx*sin(transradian(longitude))*cos(transradian(latitude)),
                Ry*sin(transradian(longitude))*sin(transradian(latitude)),
                Rz*cos(transradian(longitude))
                );
        }
        glEnd();
    }
}

//环
void draw_torus(double R, double R0, int nlong, int nlat, GLfloat* color, int width = 1) {
    int longitude = 0;//纬度
    int latitude = 0;//经度
    int incremental_long = 360 / nlong;
    int incremental_lat = 360 / nlat;

    glColor4fv(color);
    glLineWidth(width);

    for (longitude = -180; longitude <= 180; longitude += incremental_long) {
        glBegin(GL_LINE_LOOP);
        for (latitude = -180; latitude <= 180; latitude += incremental_lat) {
            glVertex3f(
                (R0 + R*sin(transradian(longitude)))*cos(transradian(latitude)),
                (R0 + R*sin(transradian(longitude)))*sin(transradian(latitude)),
                    R*cos(transradian(longitude))
                );
        }
        glEnd();

    }

    for (latitude = -180; latitude <= 180; latitude += incremental_lat) {
        glBegin(GL_LINE_LOOP);
        for (longitude = -180; longitude <= 180; longitude += incremental_long) {
            glVertex3f(
                (R0 + R*sin(transradian(longitude)))*cos(transradian(latitude)),
                (R0 + R*sin(transradian(longitude)))*sin(transradian(latitude)),
                R*cos(transradian(longitude))
                );
        }
        glEnd();
    }

}


void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    GL_Line(0, -Wnd_H, 0, 0, Wnd_H, 0, grey_color, 2);//坐标轴
    GL_Line(-Wnd_W, 0, 0, Wnd_W, 0, 0, blue_color, 2);
    GL_Line(0, 0, -5000, 0, 0, 5000, green_color, 2);

    //球体
    draw_sphere(150, 30, white_color);

    //椭球
    draw_oblong(75, 75, 150, 40, white_color);

    //环
    draw_torus(40, 200, 30, 60, grey_color);


    glFlush();
}

void init(void) {
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(Ortho_left, Ortho_right, Ortho_bottom, Ortho_top, near, far);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(LookAt_eyex, LookAt_eyey, LookAt_eyez, LookAt_centerx, LookAt_centery, LookAt_centerz, LookAt_upx, LookAt_upy, LookAt_upz);
}

void main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(150, 150);
    glutInitWindowSize(Wnd_W * 2, Wnd_H * 2);
    glViewport(0, 0, Wnd_W, Wnd_H);
    glutCreateWindow("Demo");
    init();
    glutDisplayFunc(&display);
    glutMainLoop();
}
  

猜你喜欢

转载自blog.csdn.net/xdg_blog/article/details/52849036
今日推荐