题一

// 提示:在合适的地方修改或添加代码
#include <GL/freeglut.h>
#include<stdio.h>
#include
// 评测代码所用头文件-开始
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
// 评测代码所用头文件-结束
// 请在此添加你的代码
/********** Begin /
GLfloat points1[4][3] = {{-1,0,1},{1,0,1},{0,0,-0.7},{0,1.7,0}};
GLfloat Colors1[4][3] = {{0,1,0},{1,0,0},{1,1,0},{0,0,1}};
int vertice1[4][3] = {{0,1,2},{1,2,3},{0,2,3},{0,1,3}};
/
** End /
void InitGL(GLvoid)
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_COLOR_MATERIAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void Create() //创建三棱锥
{
glBegin(GL_TRIANGLES);
for (int i = 0; i < 4; i++)
{
glColor3fv(Colors1[i]);
for (int j = 0; j < 3; j++)
{
int VtxId = vertice1[i][j];
glVertex3fv(points1[VtxId]);
}
}
glEnd();
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// 请在此添加你的代码
/
Begin /
glPushMatrix();
glTranslatef(0.0f,0.2f,-3.0f); //平移至左侧
glRotatef(95.0,1.0,0.0,0.0);
/
** End **********/
Create(); //三棱锥
glPopMatrix();
glutSwapBuffers();
}
void reshape(int width, int height)
{
if (height == 0)
height = 1;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

int main(int argc, char argv[])
{
GLubyte
pPixelData = (GLubyte*)malloc(400 * 400 * 3);//分配内存
GLint viewport[4] = {0};
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow(“几何变换示例”);
InitGL();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoopEvent();

/*************以下为评测代码,与本次实验内容无关,请勿修改**************/
glReadBuffer(GL_FRONT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glGetIntegerv(GL_VIEWPORT, viewport);
glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3], GL_RGB, GL_UNSIGNED_BYTE, pPixelData);
cv::Mat img;
std::vector<cv::Mat> imgPlanes;
img.create(400, 400, CV_8UC3);
cv::split(img, imgPlanes);for (int i = 0; i < 400; i++) {unsigned char* plane0Ptr = imgPlanes[0].ptr<unsigned char>(i);unsigned char* plane1Ptr = imgPlanes[1].ptr<unsigned char>(i);unsigned char* plane2Ptr = imgPlanes[2].ptr<unsigned char>(i);for (int j = 0; j < 400; j++) {int k = 3 * (i * 400 + j);plane2Ptr[j] = pPixelData[k];plane1Ptr[j] = pPixelData[k + 1];plane0Ptr[j] = pPixelData[k + 2];}
}
cv::merge(imgPlanes, img);
cv::flip(img, img, 0);
cv::namedWindow("openglGrab");
cv::imshow("openglGrab", img);
//cv::waitKey();
cv::imwrite("../img_step1/test.jpg", img);
return 0;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
题二(别人的代码,我的画好过不来,我看了看画球的函数不一样,参数一样)

// 提示:在合适的地方修改或添加代码
#include <GL/freeglut.h>
#include<stdio.h>

// 评测代码所用头文件-开始
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
// 评测代码所用头文件-结束

GLint winWidth = 500, winHeight =500 ; //设置初始化窗口大小

/观察坐标系参数设置/
GLfloat x0 = 2.0, yy = 2.0, z0 = 5.0; //设置观察坐标系原点
GLfloat xref = 0.0, yref = 0.0, zref = 0.0; //设置观察坐标系参考点(视点)
GLfloat Vx = 0.0, Vy = 1.0, Vz = 0.0; //设置观察坐标系向上向量(y轴)

/*观察体参数设置 */
GLfloat xwMin = -1.0, ywMin = -1.0, xwMax = 1.0, ywMax = 1.0;//设置裁剪窗口坐标范围
GLfloat dnear = 1.5, dfar = 20.0; //设置远、近裁剪面深度范围

void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);

glLoadIdentity();
/*观察变换*/
gluLookAt(x0, yy, z0, xref, yref, zref, Vx, Vy, Vz);        //指定三维观察参数// 请在此添加你的代码
/********** Begin ********/glPushMatrix();
glColor3f(1.0,1.0,1.0);
glTranslatef(0.0f,1.4f,0.0f); // 脖子
glScalef(0.5,0.7,0.5);
glutSolidCube(0.5);
glPopMatrix();glPushMatrix();
glColor3f(1.0, 0.5, 0.2);
glTranslatef(0.0f,1.9f,0.0f); // 头
glScalef(1.5,1.5,0.5);
glutSolidCube(0.5);
glPopMatrix();glPushMatrix();
glColor3f(1.0,0.0,0.0);
glTranslatef(0.0f,0.25f,0.0f); // 身体
glScalef(4.0,4.0,0.5);
glutSolidCube(0.5);
glPopMatrix();glPushMatrix();
glColor3f(1.0, 1.0, 0.0);
glTranslatef(-1.25f,0.5f,0.0f); // 手
glScalef(1.0,3.0,0.5);
glutSolidCube(0.5);
glPopMatrix();
glPushMatrix();
glColor3f(1.0, 1.0, 0.0);
glTranslatef(1.25f,0.5f,0.0f);
glScalef(1.0,3.0,0.5);
glutSolidCube(0.5);
glPopMatrix();glPushMatrix();
glColor3f(0.5,0.5,1.5);  // 腿
glTranslatef(-0.5f,-1.5f,0.0f);
glScalef(1.0,3.0,0.5);
glutSolidCube(0.5);
glPopMatrix();glPushMatrix();
glColor3f(0.5,0.5,1.5);
glTranslatef(0.5f,-1.5f,0.0f);
glScalef(1.0,3.0,0.5);
glutSolidCube(0.5);
glPopMatrix();GLUquadricObj *sphere;  //定义二次曲面对象
sphere=gluNewQuadric(); glPushMatrix();  // 球
glColor3f(1.0, 0.5, 0.2);
glTranslatef(-1.25f,-0.5f,0.0f);
glScalef(1,1.5,1);
gluSphere(sphere,0.25,50,50);
glPopMatrix();
glPushMatrix();
glColor3f(1.0, 0.5, 0.2);
glTranslatef(1.25f,-0.5f,0.0f);
glScalef(1,1.5,1);
gluSphere(sphere,0.25,50,50);
glPopMatrix();/********** End **********/
glFlush();

}

void reshape(GLint newWidth, GLint newHeight)
{
/视口变换/
glViewport(0, 0, newWidth, newHeight); //定义视口大小

/*投影变换*/
glMatrixMode(GL_PROJECTION);glLoadIdentity();/*透视投影,设置透视观察体*/
glFrustum(xwMin, xwMax, ywMin, ywMax, dnear, dfar);/*模型变换*/
glMatrixMode(GL_MODELVIEW);winWidth = newWidth;
winHeight = newHeight;

}
int main(int argc, char* argv[])
{
GLubyte* pPixelData = (GLubyte*)malloc(500 * 500 * 3);//分配内存
GLint viewport[4] = { 0 };
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize( 500 , 500 ); //设置初始化窗口大小
glutCreateWindow(“三维观察”);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoopEvent();

/*************以下为评测代码,与本次实验内容无关,请勿修改**************/
glReadBuffer(GL_FRONT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glGetIntegerv(GL_VIEWPORT, viewport);
glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3], GL_RGB, GL_UNSIGNED_BYTE, pPixelData);
cv::Mat img;
std::vector<cv::Mat> imgPlanes;
img.create(500, 500, CV_8UC3);
cv::split(img, imgPlanes);for (int i = 0; i < 500; i++) {unsigned char* plane0Ptr = imgPlanes[0].ptr<unsigned char>(i);unsigned char* plane1Ptr = imgPlanes[1].ptr<unsigned char>(i);unsigned char* plane2Ptr = imgPlanes[2].ptr<unsigned char>(i);for (int j = 0; j < 500; j++) {int k = 3 * (i * 500 + j);plane2Ptr[j] = pPixelData[k];plane1Ptr[j] = pPixelData[k + 1];plane0Ptr[j] = pPixelData[k + 2];}
}
cv::merge(imgPlanes, img);
cv::flip(img, img, 0);
cv::namedWindow("openglGrab");
cv::imshow("openglGrab", img);
//cv::waitKey();
cv::imwrite("../img_step2/test.jpg", img);
return 0;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
题三

// 提示:在合适的地方修改或添加代码
#include <GL/freeglut.h>
#include<stdio.h>
#include <stdlib.h>
#include
// 评测代码所用头文件-开始
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
// 评测代码所用头文件-结束

using namespace std;

struct Point
{
int x, y;
};

Point bz[11], bspt[11]; //bz为Bezier曲线,bspt为B样条曲线

int nInput;
//Bezier曲线控制点
Point pt[4] = { { 50, 100}, { 140,300},{250, 320}, {290, 120} };
//B样条曲线控制点
/请在此处添加你的代码/
/
*********** Begin /
Point pt2[4]={ { 450, 100}, { 540,300},{650, 320}, {690, 120} };
/
*** end **************/

void CalcBZPoints() //Bezier曲线算法
{
float a0, a1, a2, a3, b0, b1, b2, b3;
a0 = pt[0].x;
a1 = -3 * pt[0].x + 3 * pt[1].x;
a2 = 3 * pt[0].x - 6 * pt[1].x + 3 * pt[2].x;
a3 = -pt[0].x + 3 * pt[1].x - 3 * pt[2].x + pt[3].x;
b0 = pt[0].y;
b1 = -3 * pt[0].y + 3 * pt[1].y;
b2 = 3 * pt[0].y - 6 * pt[1].y + 3 * pt[2].y;
b3 = -pt[0].y + 3 * pt[1].y - 3 * pt[2].y + pt[3].y;

float t = 0;
float dt = 0.01;
for (int i = 0; t < 1.1; t += 0.1, i++)
{bz[i].x = a0 + a1 * t + a2 * t * t + a3 * t * t * t;bz[i].y = b0 + b1 * t + b2 * t * t + b3 * t * t * t;
}

}

void CalcBSPoints() //B样条曲线
{
/请在此处添加你的代码/
/
*********** Begin ************/
float a0, a1, a2, a3, b0, b1, b2, b3;
a0 = pt2[0].x + 4 * pt2[1].x + pt2[2].x;
a1 = -3 * pt2[0].x + 3 * pt2[2].x;
a2 = 3 * pt2[0].x - 6 * pt2[1].x + 3 * pt2[2].x;
a3 = -pt2[0].x + 3 * pt2[1].x - 3 * pt2[2].x + pt2[3].x;
b0 = pt2[0].y + 4 * pt2[1].y + pt2[2].y;
b1 = -3 * pt2[0].y + 3 * pt2[2].y;
b2 = 3 * pt2[0].y - 6 * pt2[1].y + 3 * pt2[2].y;
b3 = -pt2[0].y + 3 * pt2[1].y - 3 * pt2[2].y + pt2[3].y;

float t = 0;
float dt = 0.01;
for (int i = 0; t < 1.1; t += 0.1, i++)
{bspt[i].x =  ( a0 + a1 * t + a2 * t * t + a3 * t * t * t ) / 6;bspt[i].y =  ( b0 + b1 * t + b2 * t * t + b3 * t * t * t ) / 6;
}

}
/************* end ************/
void ControlPoint()
{
glPointSize(2);
for (int i = 0; i < 4; i++)
{
glBegin(GL_POINTS);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2i(pt[i].x, pt[i].y);
glEnd();

}

}

void PolylineGL(Point* pt, int num)
{
glBegin(GL_LINE_STRIP);
for (int i = 0; i < num; i++)
{
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2i(pt[i].x, pt[i].y);
}
glEnd();
}
void PolylineGL1(Point* pt, int num)
{
glBegin(GL_LINE_STRIP);
for (int i = 0; i < num; i++)
{
glColor3f(1.0f, 1.0f, 1.0f);
glVertex2i(pt[i].x, pt[i].y);
}
glEnd();
}

void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 1.0f, 1.0f);

ControlPoint();              //画4个控制点PolylineGL1(pt, 4);           //画4个点之间的线段CalcBZPoints();PolylineGL(bz, 11);PolylineGL1(pt2, 4);CalcBSPoints();PolylineGL(bspt, 11);glFlush();

}

void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
}

void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}

int main(int argc, char* argv[])
{
GLubyte* pPixelData = (GLubyte*)malloc(800 * 400 * 3);//分配内存
GLint viewport[4] = { 0 };
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize( 800 , 400 ); //设置初始化窗口大小
glutCreateWindow(“三维观察”);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoopEvent();

/*************以下为评测代码,与本次实验内容无关,请勿修改**************/
glReadBuffer(GL_FRONT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glGetIntegerv(GL_VIEWPORT, viewport);
glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3], GL_RGB, GL_UNSIGNED_BYTE, pPixelData);
cv::Mat img;
std::vector<cv::Mat> imgPlanes;
img.create(400, 800, CV_8UC3);
cv::split(img, imgPlanes);for (int i = 0; i < 400; i++) {unsigned char* plane0Ptr = imgPlanes[0].ptr<unsigned char>(i);unsigned char* plane1Ptr = imgPlanes[1].ptr<unsigned char>(i);unsigned char* plane2Ptr = imgPlanes[2].ptr<unsigned char>(i);for (int j = 0; j < 800; j++) {int k = 3 * (i * 800 + j);plane2Ptr[j] = pPixelData[k];plane1Ptr[j] = pPixelData[k + 1];plane0Ptr[j] = pPixelData[k + 2];}
}
cv::merge(imgPlanes, img);
cv::flip(img, img, 0);
cv::namedWindow("openglGrab");
cv::imshow("openglGrab", img);
//cv::waitKey();
cv::imwrite("../img_step3/test.jpg", img);
return 0;

}

计算及图形学——实验四相关推荐

  1. 计算机图形学 | 实验四:绘制一个球体

    计算机图形学 | 实验四:绘制一个球体 计算机图形学 | 实验四:绘制一个球体 封装Shader 为什么要封装Shader 如何使用 绘制球模型 球面顶点遍历 构造三角形图元 开启线框模式 开启面剔除 ...

  2. 计算机图形学——实验四 纹理映射实验

    实验四 纹理映射实验 实验项目性质:设计性实验 所属课程名称:计算机图形学A 实验计划学时:3学时 一.实验目的和要求 掌握纹理映射的基本原理,利用VC++ OpenGL实现纹理映射技术. 二.实验原 ...

  3. 【计算机图形学实验四——简单几何形体的平移、缩放、旋转等几何变换】

    一.实验内容.目的.要求 1.简单几何形体(三角形.多边形等)的平移.缩放.旋转等几何变换. 2.掌握相关算法的原理及实现 3.实现基础代码(非调用OpenGL等图形库): 缩放.旋转等能指定变换参考 ...

  4. 图形学 实验四 梁barsky算法

    核心思想: 用参数方程表示一条直线 已知一条线段的起点(x1,y1).终点(x2,y2),就可以通过一个参数u,表示这条线段所在直线上的任意一个点(x,y) x=x1+u(x2-x1) y=y1+u( ...

  5. 计算机图形学实验四——投影变换

    这里写目录标题 一级目录 一级目录 [实验名称] 投影变换 [实验目的] 理解并掌握形体的投影变换的原理: [实验原理] 绘制一点透视图的变换矩阵: T= 1  0 0 0 0  1 0 0 0  0 ...

  6. 计算机图形学实验四 OpenGL的鼠标交互绘制

    一.实验目的 1.掌握OpenGL的鼠标按钮响应函数. 2.掌握OpenGL的鼠标移动响应函数. 3.进一步巩固OpenGL的基本图元绘制基础. 二.实验内容 1.鼠标画草图--实现鼠标点到哪,线就画 ...

  7. 用dsp的c54x汇编语言编写4位数的按位输出和计算,DSP实验三实验四(精).doc

    DSP实验三实验四(精).doc 实验三.文件和Gel文件的编写 一.实验目的 1. 掌握Gel文件的编写, 2. 熟悉Code Composer Studio的使用 二.实验设备 1. 集成开发环境 ...

  8. 计算成绩平均分浮点数c语言,C实验四

    实验四 一.实验目的 1.掌握在Visual C++6.0环境下输入输出函数的使用方法. 2.掌握常用数学库函数的使用方法. 3.掌握自增.自减运算符的使用方法. 4.掌握强制类型转换(显示类型转换) ...

  9. matlab 实验四 数据处理与多项式计算

    实验四 数据处理与多项式计算 实验要求: 为达到理想的实验效果,同学们务必做到: 1.实验前认真准备,要根据实验目的和实验内容,复习好实验中可能要用到的命令,想好编程的思路,做到胸有成竹,提高上机效率 ...

最新文章

  1. linux系统宿主定制之初窥门径
  2. 正确的线程中止-标志位
  3. 鸿蒙公测新增6款手机,鸿蒙公测第二期报名入口 鸿蒙2.0第二期公测新增支持机型有哪些...
  4. TemplateBinding与Binding区别,以及WPF自定义控件开发的遭遇
  5. [汇编语言]用[bx+idata]的方式进行数组的处理-字母大小写转换
  6. lin通讯从节点同步间隔场_汽车行业必须知识--CAN FD通讯
  7. Redis(九):Redis特殊类型之geospatial
  8. yum安装报错Protected multilib versions:
  9. 端口映射 - 专业术语 - 发问篇
  10. OpenShift 4 - Knative教程 (4) 自动扩展和收缩
  11. kubernetes下的Nginx加Tomcat三部曲之一:极速体验
  12. lua和unity如何交互_(XLua)C#与Lua中的交互
  13. JAVA,如何判断点是否在面内
  14. WP7模拟器使用技巧
  15. linux系统怎么组内网,Linux/Unix操作系统处于内网的桌面控制
  16. 进入linux jed文本编辑怎么退出,尝试将 Jed 作为你的 Linux 终端文本编辑器 | Linux 中国...
  17. python 实现软件激活码验证
  18. 二叉搜索树,就这,就这啊。
  19. 百度、太一云、趣链、星合、达令共议什么是真区块链【区块链打假】
  20. mysql procedure 存储过程

热门文章

  1. linux服务器非root用户安装Anaconda,并配置tensorflow/pytorch
  2. 台达杯自动化大赛设计方案
  3. html ie动画效果,css3强大的动画效果animate使用说明及浏览器兼容介绍
  4. etag java_你知道HTTP协议的ETag是干什么的吗?
  5. java mybatis 搭建_mybatis环境搭建(转载)
  6. tlc5620输出三角波流程图_TLC5620(电压输出型)_pdf
  7. 语言常用c100单词,英语口语练习_夏普新款PW-C100-G电子词典测评_沪江英语
  8. linux sublime 命令行启动,命令行 – 使用命令行在Sublime Text 3中打开一个文件夹
  9. java 内部类 返回值_Java学习笔记:形参和返回值、内部类、常用API
  10. java对象头_什么是Java对象标头