计算机图形Opengl的实验报告,计算机图形学OpenGL实验一

#include int SCREEN_HEIGHT = 480;//屏幕高度

// 跟踪鼠标点击次数,达到3次后绘制Bezier曲线

int NUMPOINTS = 0;

//点

class Point {

public:

float x, y;

void setxy(float x2, float y2) { x = x2; y = y2; }

const Point & operator=(const Point &rPoint) {

x = rPoint.x;

y = rPoint.y;

return *this;

}

};

Point abc[3];

void myInit() {

glClearColor(0.0,0.0,0.0,0.0);

glColor3f(1.0,0.0,0.0);

glPointSize(4.0);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0,640.0,0.0,480.0);

}

void drawDot(int x, int y) {

glBegin(GL_POINTS);

glVertex2i(x,y);

glEnd();

glFlush();

}

void drawLine(Point p1, Point p2) {

glBegin(GL_LINES);

glVertex2f(p1.x, p1.y);

glVertex2f(p2.x, p2.y);

glEnd();

glFlush();

}

// 计算下一个Bezier曲线上的点

Point drawBezier(Point A, Point B, Point C, double t) {

Point P;

P.x = pow((1 - t), 2) * A.x + 2 * t * (1 -t) * B.x + pow(t, 2) * C.x;

P.y = pow((1 - t), 2) * A.y + 2 * t * (1 -t) * B.y + pow(t, 2) * C.y;

return P;

}

void myMouse(int button, int state, int x, int y) {

//左键按下

if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {

//存储鼠标点击的点

abc[NUMPOINTS].setxy((float)x,(float)(SCREEN_HEIGHT - y));

NUMPOINTS++;

// 绘制红点

drawDot(x, SCREEN_HEIGHT - y);

// 绘制Bezier曲线

if(NUMPOINTS == 3) {

glColor3f(1.0,1.0,1.0);

// 绘制控制多边形

drawLine(abc[0], abc[1]);

drawLine(abc[1], abc[2]);

Point POld = abc[0];

//绘制Bezier曲线段,控制t的增量可以控制曲线精度

for(double t = 0.0;t <= 1.0; t += 0.1) {

Point P = drawBezier(abc[0], abc[1], abc[2], t);

drawLine(POld, P);

POld = P;

}

glColor3f(1.0,0.0,0.0);

NUMPOINTS = 0;

}

}

}

void myDisplay() {

glClear(GL_COLOR_BUFFER_BIT);

glFlush();

}

int main(int argc, char *argv[]) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize(640,480);

glutInitWindowPosition(100,150);

glutCreateWindow("Bezier Curve");

glutMouseFunc(myMouse);

glutDisplayFunc(myDisplay);

myInit();

glutMainLoop();

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验OpenGL+GLUT开发平台搭建 5 小实验1: 开发环境设置 5 小实验2: 控制窗口位置和大小 6 小实验3:默认的可视化范围 6 小实验4:自定义可视化范围 7 小实验5: 几何对象变形的原因 8 小实验6: 视口坐标系及视口定义 8 小实验7:动态调整长宽比例,保证几何对象不变形 9 实验二 动画和交互 10 小实验1: 单缓冲动画技术 10 小实验2: 双缓冲动画技术 11 小实验3:键盘控制 13 小实验4:鼠标控制【试着单击鼠标左键或者右键,试着按下鼠标左键后再移动】 14 实验三 几何变换、观察变换、三维对象 16 小实验1:二维几何变换 16 小实验2:建模观察(MODELVIEW)矩阵堆栈 17 小实验3:正平行投影1 19 小实验4:正平行投影2 19 小实验5:正平行投影3 20 小实验6:透射投影1 21 小实验6:透射投影2 22 小实验7:三维对象 24 实验四 光照模型和纹理映射 26 小实验1:光照模型1----OpenGL简单光照效果的关键步骤。 26 小实验2:光照模型2----光源位置的问题 28 小实验3:光照模型3----光源位置的问题 31 小实验4:光照模型4----光源位置的问题 33 小实验5:光照模型5----光源位置的问题 35 小实验6:光照模型6----光源位置的问题 38 小实验7:光照模型7----光源位置的动态变化 40 小实验8:光照模型8----光源位置的动态变化 43 小实验9:光照模型9---光源位置的动态变化 45 小实验10:光照模型10---聚光灯效果模拟 48 小实验11:光照模型11---多光源效果模拟 50 小实验12:光照效果和雾效果的结合 53 小实验13:纹理映射初步—掌握OpenGL纹理映射的一般步骤 56 小实验13:纹理映射—纹理坐标的自动生成(基于参数的曲面映射) 59 小实验14:纹理映射—纹理坐标的自动生成(基于参考面距离) 61
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值