第1关:简单实体构建

// 提示:在合适的地方修改或添加代码
#include <GL/freeglut.h>
#include<stdio.h>
#include<iostream>
// 评测代码所用头文件-开始
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
// 评测代码所用头文件-结束
// 请在此添加你的代码
/********** Begin ********/
GLfloat points1[4][3] = { {0,1.7,0},{-1,0,1},{1,0,1},{0,0,-0.7} };
GLfloat Colors1[4][3] = { {0,0,1},{1,0,0},{1,1,0},{0,1,0} };
int vertice1[4][3] = { {0,1,2},{0,2,3},{0,1,3},{1,2,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.0f,1.0f,0.0f, 0.0f);/********** 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[])
{glutInit(&argc, argv);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("几何变换示例");InitGL();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoopEvent();     /*************以下为评测代码,与本次实验内容无关,请勿修改**************/GLubyte* pPixelData = (GLubyte*)malloc(400 * 400 * 3);//分配内存GLint viewport[4] = {0};    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;
}

第2关:简单机器人构建

// 提示:在合适的地方修改或添加代码
#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.0f,1.0f,1.0f);glTranslatef(0.0f,1.4f,0.0f);glScalef(0.5,0.7,0.5);glutSolidCube(0.5);glPopMatrix();glPushMatrix();glColor3f(1.0f,0.5f,0.2f);glTranslatef(0.0f,1.9f,0.0f);glScalef(1.5,1.5,0.5);glutSolidCube(0.5);glPopMatrix();glPushMatrix();glColor3f(1.0f,0.0f,0.0f);glTranslatef(0.0f,0.25f,0.0f);glScalef(4.0f,4.0f,0.5f);glutSolidCube(0.5);glPopMatrix();glPushMatrix();glColor3f(1.0f,1.0f,0.0f);glTranslatef(-1.25f,0.5f,0.0f);glScalef(1.0,3.0,0.5);glutSolidCube(0.5);glPopMatrix();glPushMatrix();glColor3f(1.0f,1.0f,0.0f);glTranslatef(1.25f,0.5f,0.0f);glScalef(1.0,3.0,0.5);glutSolidCube(0.5);glPopMatrix();glPushMatrix();glColor3f(0.5f,0.5f,1.5f);glTranslatef(-0.5f,-1.5f,0.0f);glScalef(1.0,3.0,0.5);glutSolidCube(0.5);glPopMatrix();glPushMatrix();glColor3f(0.5f,0.5f,1.5f);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[])
{glutInit(&argc, argv);glutInitWindowPosition(100, 100);glutInitWindowSize( 500 , 500 );        //设置初始化窗口大小glutCreateWindow("三维观察");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoopEvent();/*************以下为评测代码,与本次实验内容无关,请勿修改**************/GLubyte* pPixelData = (GLubyte*)malloc(500 * 500 * 3);//分配内存GLint viewport[4] = { 0 };    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;
}

第3关:Bezier曲线和B样条曲线

// 提示:在合适的地方修改或添加代码
#include <GL/freeglut.h>
#include<stdio.h>
#include <stdlib.h>
#include <vector>
// 评测代码所用头文件-开始
#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[])
{glutInit(&argc, argv);glutInitWindowPosition(100, 100);glutInitWindowSize( 800 , 400 );        //设置初始化窗口大小glutCreateWindow("三维观察");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoopEvent();/*************以下为评测代码,与本次实验内容无关,请勿修改**************/GLubyte* pPixelData = (GLubyte*)malloc(800 * 400 * 3);//分配内存GLint viewport[4] = { 0 };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. 计算机图形学头歌实训平台作业OpenGL立方体三维观察

    立方体三维观察 第一关 立方体模型变换 第二关 立方体视图变换 第三关 立方体三点透视 第四关 立方体平行投影 第五关 立方体视口变换 第一关 立方体模型变换 // 提示:在合适的地方修改或添加代码 ...

  2. 计算机图形学头歌实训平台——立方体三维观察

    第1关:立方体模型变换 // 提示:在合适的地方修改或添加代码 #include <GL/freeglut.h> #include<stdio.h>// 评测代码所用头文件-开 ...

  3. 计算机图形学头歌实训平台作业OpenGL二维几何变换

    二维几何变换 第1关 正方形的平移与缩放 第2关 正方形的平移和旋转 第3关 正方形的变换组合 第4关 三菱形状 第1关 正方形的平移与缩放 // 提示:写完代码请保存之后再进行评测 #include ...

  4. 计算机图形学头歌实训平台——二维几何变换

    第1关:正方形的平移与缩放 // 提示:写完代码请保存之后再进行评测 #include <GL/freeglut.h> #include<stdio.h>// 评测代码所用头文 ...

  5. 头歌实训平台Python

    目录 Python 初体验-- Hello world 第1关  Hello Python,我来了! Python控制结构(一)※ 第1关  if分支入门※ 第2关  while循环分支入门※ 学习- ...

  6. 头歌实训平台C语言答案

    C语言程序设计编辑与调试环境 第1关:打印输出 Hello Word 任务描述 本关任务:通过运行一个C语言程序,让你初步了解程序的运行方法. 相关知识(略) 编程要求 请补充Begin-End之间的 ...

  7. educoder头歌实训 web课——JavaScript语言基础:JS循环语句

    educoder头歌实训 太原理工大学web课程----JavaScript语法基础:JS运算符_玛卡巴卡的博客-CSDN博客 第1关:while类型 任务描述 质数的定义如下:大于1的自然数,且除 ...

  8. JAVA程序设计-头歌实训-------# 第一阶段 Java语言快速入门

    第一阶段 Java语言快速入门 第1关:Java程序的基本框架:Hello Java World! 任务描述 本关的任务是编写你人生中第一个Java程序,从此开启你的Java实训之旅,显示效果如下: ...

  9. 数据库原理 头歌实训 数据库常用对象

    SQL视图的定义与操纵 第1关:创建行列子集视图 任务描述 本关任务:创建计算机系的学生信息的视图 student_cs. 相关知识 行列子集视图是指视图的结果集来源于基本表,没有经过二次计算. ## ...

最新文章

  1. php自动打印小票_错题打印机哪个品牌质量好?【2020双12】错题打印机品牌排行...
  2. mysql数据集_Mysql 数据库-我的测试环境
  3. 刷新页面时间不重置 前端倒计时_brackets:前端开发工程师必备编辑器之一
  4. 基于.NET平台常用的框架整理(转)
  5. 在SMARTFORMS中取消使用WORD作为编辑器
  6. 百度兴趣点下载工具设计和实现
  7. php临时目录没有文件夹里,PHP上传 找不到临时文件夹的解决方法
  8. 在 Pycharm下使Python2和Python3共用Anaconda中的各种库/包的解决方法
  9. C++笔记-基于邻接表的BFS(宽度优先遍历)
  10. OpenCV:Mat数据类型/16to8bit/RECT/画线填充
  11. 技术人如何转型产品?
  12. 因严重缺陷,Rust 撤销所有 Crates 包的 API 令牌
  13. linux中的strip命令简介------给文件脱衣服
  14. 无语!JDK 8 中的 HashMap 依然会死循环…
  15. excel数据分析 - 17个计算统计类函数
  16. 【工具-DVWA】DVWA的安装和使用
  17. 【MATLAB】用地图表白:绘制Bonne投影下的世界地图
  18. usb转com口驱动
  19. 探花交友_第10章_实现推荐功能
  20. Null value appeared in non-nullable field java.lang.NullPointerException

热门文章

  1. 你以为在用SharePoint但其实不是
  2. JPA 主键ID生成策略
  3. list 分批_java 数据分批插入
  4. js函数形参、实参、arguments[]的一探究竟
  5. 【原创】vSAN推荐的IO控制器的配置方式
  6. 流媒体云时代的声与色,融云铺就的桥与路
  7. 20191105 csp-s模拟T1(贪心+模拟)
  8. MATLAB:subplot(mnq)什么意思【示例解答,简单易懂】
  9. 11个激发LOGO 标志设计灵感的网站
  10. Linux 云服务器数据恢复案例3则