【VIP专享】实验四 自由曲线的绘制(OpenGL版)
- 格式:pdf
- 大小:279.04 KB
- 文档页数:6
实验四曲线生成算法一、目的和要求(1)根据曲线的基础知识和常用曲线的数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲线数学模型的理解。
;(2)写出Bezier曲线的算法实现;(3)写出B样条曲线的算法实现;二、实验内容(一)Bezier曲线的算法实现1、建立一个BezierCurve的工程文件:2、右击CBezierCurveView类,建立成员函数:int CBezierCurveView::Multiply_n(int m, int n)用于的函数实现:!!!()!double CBezierCurveView::Bernstein(int m, int n, double t)用于实现伯恩斯坦多项数的函数实现:,()3、编写自定义的成员函数代码:(注意:程序灰色底纹部分为自己添加,没有底纹的为工程文件自动生成。
)int CBezierCurveView::Multiply_n(int m, int n){int i,j,a;if(m!=0){a=1;for(i=m+1;i<=n;i++)a=a*i;for(j=1;j<=n-m;j++)a=a/j;return a;}elsereturn 1;}double CBezierCurveView::Bernstein(int m, int n, double t) {int i,j;double sum;sum=Multiply_n(m,n);for(i=1;i<=m;i++)sum=sum*t;for(j=1;j<=n-m;j++)sum=sum*(1-t);return sum;}4、编写OnDraw()函数:void CBezierCurveView::OnDraw(CDC* pDC){CBezierCurveDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereint i,j,k,n=3;double curx,cury,t,b;double dt=0.01;int array[4][2]={{30,100},{100,30},{50,150},{200,40}};CPen PenRed(PS_SOLID,1,RGB(255,0,0));//定义红色笔CPen PenBlue(PS_SOLID,1,RGB(0,0,255));//定义蓝色笔//绘制特征多边形pDC->SelectObject(&PenBlue);pDC->MoveTo(array[0][0],array[0][1]);for(i=0;i<=n;i++)pDC->LineTo(array[i][0],array[i][1]);//绘制Bezier曲线pDC->MoveTo(array[0][0],array[0][1]);pDC->SelectObject(&PenRed);t=0.0;for(i=0;i<=(int)1/dt;i++){curx=0;cury=0;for(j=0;j<=n;j++){b=Bernstein(j,n,t);curx=curx+array[j][0]*b;cury=cury+array[j][1]*b;}pDC->LineTo(curx,cury);t=t+dt;}}5、编译、调试和运行程序,程序结果如下:6、尝试修改特征多边形的顶点,生成其他形状的Bezier曲线。
计算机图形学中,所有的光滑曲线、曲面都采用线段或三角形逼近来模拟,但为了精确地表现曲线,通常需要成千上万个线段或三角形来逼近,这种方法对于计算机的硬件资源有相当高的要求。
然而,许多有用的曲线、曲面在数学上只需要用少数几个参数(如控制点等)来描述。
这种方法所需要的存储空间比线段、三角形逼近的方法来所需要的空间要小得多,并且控制点方法描述的曲线、曲面比线段、三角形逼近的曲线、曲面更精确。
为了说明如何在OpenGL中绘制复杂曲线和曲面,我们对上述两类比方法都进行了介绍。
下面我们先来介绍有关基础知识,然后再看是如何实现的吧。
一、曲线的绘制OpenGL通过一种求值器的机制来产生曲线和曲面,该机制非常灵活,可以生成任意角度的多项式曲线,并可以将其他类型的多边形曲线和曲面转换成贝塞尔曲线和曲面。
这些求值器能在任何度的曲线及曲面上计算指定数目的点。
随后,OpenGL利用曲线和曲面上的点生成标准OpenGL图元,例如与曲线或曲面近似的线段和多边形。
由于可让OpenGL计算在曲线上所需的任意数量的点,因此可以达到应用所需的精度。
对于曲线,OpenGL中使用glMap1*()函数来创建一维求值器,该函数原型为:表一、参数target的取值表使用求值器定义曲线后,必须要启动求值器,才能进行下一步的绘制工作。
启动函数仍是glEnable(),其中参数与glMap1*()的第一个参数一致。
同样,关闭函数为glDisable(),参数也一样。
一旦启动一个或多个求值器,我们就可以构造近似曲线了。
最简单的方法是通过调用计算坐标函数glEvalcoord1*()替换所有对函数glVertex*()的调用。
与glVertex*()使用二维、三维和四维坐标不同,glEvalcoord1*()将u值传给所有已启动的求值器,然后由这些已启动的求值器生成坐标、法向量、颜色或纹理坐标。
OpenGL曲线坐标计算的函数形式如下:为了进一步说明OpenGL中曲线的绘制方法。
实验五1、实验目的和要求了解且掌握图形填充、曲线绘制和字符输出等技术。
2、实验内容1)用OpenGL实现用黑白相间的棋盘图案填充多边形2)用OpenGL分别用点和折线模式实现正弦和余弦的绘制3)用OpenGL在屏幕上输出”OpenGL”字样3、实验步骤1)相关算法及原理描述①图案填充多边形多边形模式设置函数为:void glPolygonMode(GLenum face,GLenum mode);控制多边形指定面的绘制模式。
参数face为GL_FRONT、GL_BACK或GL_FRONT_AND_BACK;参数mode为GL_POINT、GL_LINE或GL_FILL,分别表示绘制轮廓点式多边形、轮廓线式多边形或全填充式多边形。
缺省时,绘制的是正反面全填充式多边形。
设置图案填充式多边形函数为:void glPolygonStipple(const GLubyte *mask);为当前多边形定义填充图案模式。
参数mask是一个指向32x32位图的指针。
与虚点线绘制的道理一样,某位为1时绘制,为0时什么也不绘。
注意,在调用这个函数前,必须先启动一下,即用glEnable(GL_POLYGON_STIPPLE);不用时用glDisable(GL_POLYGON_STIPPLE) 关闭。
②正弦和余弦曲线的绘制线的绘制需要用到GL_LINES模式,它指定在glBegin/glEnd函数对中,从第一个点开始,两两构成一条直线段。
绘制正余弦曲线的话,只需要编写一段循环语句,指定绘制路线,设置不同线型。
③在屏幕上显示字符实用程序工具包中包含了一些预定义的字符库,用来OpenGL在.显示点阵和矢量字符。
函数void glutBitmapCharacter(void *font,int character); 显示一个GLUT位图字符。
其中font是GLUT符号常数,指定点阵字库。
参数character采用ASCII编码的形式指定要显示的字符。
自定义xy轴的多功能曲线的实现方法实现自定义xy轴的多功能曲线可以通过以下步骤进行:
1. 数据收集和准备:首先,收集与曲线相关的数据,包括x轴和y轴上的数值。
确保数据具有一定的变化范围和数量,以获得有意义的曲线。
2. 选择合适的编程语言和库:根据你的编程经验和喜好,选择合适的编程语言
和图形库来实现曲线。
常用的选择包括Python中的Matplotlib、R语言中的ggplot2等。
3. 绘制轴线:根据x轴和y轴的范围,使用库提供的函数或方法绘制轴线。
可
以设置轴标签和刻度线。
4. 添加曲线:根据收集到的数据,使用库提供的函数或方法绘制曲线。
可以根
据需要设置曲线的颜色、线型、线宽等属性。
5. 添加标题和图例:为图形添加标题和图例,以便读者理解曲线的含义和来源。
标题可以简洁明了地描述曲线的特征,图例可以标注每条曲线的含义。
6. 自定义样式:根据个人喜好和需求,对图形进行样式的定制。
可以修改轴线
和曲线的颜色、线型、线宽,调整背景色,添加网格线等。
7. 导出和保存:完成曲线绘制后,使用库提供的函数或方法将图形导出为常见
格式(如PNG、JPEG等),或直接保存为文件供后续使用。
在实现自定义xy轴的多功能曲线时,需要根据自己的具体需求和编程能力选
择合适的工具和方法。
同时,要注意数据的准备和图形的可读性,以确保曲线能够准确地传达所需的信息。
利用OpenGL,分别用点和折线模式实现正弦和余弦曲线的绘制一、实验目的(1)掌握用OpenGL实现点和折线模式;(2)在OpenGL用点和折线模式实现正弦和余弦曲线的绘制。
二、实验内容利用OpenGL,分别用点和折线实现正弦和余弦曲线的绘制三、实验步骤(1)实验原理利用第五章所学内容,学会相关曲线的绘制,并掌握基本的算法原理,进一步理解OpenGL的成像原理(2)程序设计四、实验结果:如下图所示:五、实验心得通过本次实验,基本上对数学函数及相关的三角函数在OpenGL的函数调用有了基本的了解,并且自己调试成功了自己的程序,虽然编程技术一塌糊涂,但最终还是自己搞出来的,哈哈,开心啊!!(+﹏+)~狂晕六、附录程序源代码#include<glut.h>#include<math.h>int winWidth=400,winHeight=300;void Initial(void){glClearColor(0,0,0,0);}void ChangeSize(int w,int h){winWidth=w,winHeight=h;glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,winWidth,0.0,winHeight); }void Display(){//glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,1.0f,1.0f);glBegin(GL_LINE_STRIP);int i,x=0,y=0;for(i=0;i<400;i++){x=x+1;y=10*sin(((float)x/10))+100;glVertex2i(x,y);}glEnd();glBegin(GL_LINE_STRIP);x=0,y=0;for(i=0;i<400;i++){x=x+1;y=20*cos(((float)x/10))+250;glVertex2i(x,y);}glEnd();glutSwapBuffers();}int main(int argc,char *argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);glutInitWindowSize(400,300);glutInitWindowPosition(100,100);glutCreateWindow("何智龙-2008082269");glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);Initial();glutMainLoop();return 0;}。
计算机图形学课程实验 报 告实验题目 自由曲线和曲面的绘制 班 级 计算081 姓 名 杨 恒 学 号 3080811017 指导教师 胡钢 日 期 2011.6.3西安理工大学理学院应用数学系二零一一年春季学期信息与计算科学专业基础课 Computer GraphicsReport Of course experiment实验说明实验目的:掌握自由曲线和曲面(包括Bezier 曲线、曲面和B 样条曲线、曲面)的生成算法思想,并能上机编程绘制相应的曲线、曲面和利用曲线、曲面进行简单的几何造型设计。
实验地点: 教九楼401 数学系机房实验要求(Direction): 1.每个学生单独完成;2.开发语言为TurboC 或C++,也可使用其它语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。
实验内容实验题一1.1实验题目上机编写一个能绘制Bezier 曲线和B 样条曲线的通用程序,并调试成功。
具体要求为:(1)用户在运行程序时,可以根据提示信息来决定选择绘制Bezier 曲线,还是B 样条曲线;(2)两种曲线控制顶点的个数和坐标值要求可以随机输入(即Bezier 曲线和B 样条曲线的次数和位置可以随机输入);(3)当用户输入控制点的坐标位置后,屏幕上生成曲线的同时显示其特征多边形;且在特征多边形的顶点处输出该顶点坐标;(4)要求在可执行程序后附上运行结果(两种曲线都至少附上一个结果图)。
自由曲线和曲面的绘制实验41.2实验目的和意义掌握Bezier曲线和B样条曲线的绘制方法。
1.3程序制作步骤(包括算法的基本思想、流程图、设计步骤等)一、基本思想(1)Bezier曲线:是由一组折线来定义的,且第一个点和最后一个点在曲线上,第一条和最后一条折线分别表示出曲线在起点和终点处的切线方向。
OpenGL编程轻松入门之曲面和曲线2006-05-19 11:13作者:黄燕出处:天极开发责任编辑:方舟前面我们讲了如何绘制平面的图形,这一节我们学习如何绘制曲线和曲面。
例10:绘制一个曲面,如图十二所示。
本程序使用二维求值器绘制一个曲面。
本例中也有一些特殊效果的操作。
#include <windows.h>#include <GL/GLAUX.h>#include <GL/glut.h>#include <math.h>GLfloat ctrlpoints[5][5][3] = {{{-2,0,0},{-1,1,0},{0,0,0},{1,-1,0},{2,0,0}},{{-2,0,-1},{-1,1,-1},{0,0,-1},{1,-1,-1},{2,0,-1}},{{-2,0,-2},{-1,1,-2},{0,0,-2},{1,-1,-2},{2,0,-2}},{{-2,0,-3},{-1,1,-3},{0,0,-3},{1,-1,-3},{2,0,-3}},{{-2,0,-4},{-1,1,-4},{0,0,-4},{1,-1,-4},{2,0,-4}}};GLfloat mat_ambient[] = {0.1,0.1,0.1,1.0};GLfloat mat_diffuse[] = {1.0,0.6,0.0,1.0};GLfloat mat_specular[] = {1.0,1.0,1.0,1.0};GLfloat light_ambient[] = {0.1,0.1,0.1,1.0};GLfloat light_diffuse[] = {1.0,1.0,1.0,0.0};GLfloat light_specular[] = {1.0,1.0,1.0,0.0};GLfloat light_position[] = {2.0,23.0,-4.0,1.0};void myInit(void){glClearColor(0.0,0.0,0.0,0.0);//设置背景色/*为光照模型指定材质参数*/glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialf(GL_FRONT,GL_SHININESS,60.0);/*设置光源参数*/glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);glLightfv(GL_LIGHT0,GL_POSITIO N,light_position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);/*enable depth comparisons and update the depth buffer*/glEnable(GL_DEPTH_TEST);/*设置特殊效果*/glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE);glEnable(GL_BLEND);glEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE);glFrontFace(GL_CW);glShadeModel(GL_SMOOTH);glEnable(GL_LINE_SMOOTH);}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(0.0,0.0,0.0);glTranslatef(0.0,-1.0,0.0);glRotatef(50.0,1.0,0.0,0.0);glPushMatrix();/*绘制曲面*/glEnable(GL_MAP2_VERTEX_3);glMap2f(GL_MAP2_VERTEX_3,0,1,3,5,0,1,15,5,&ctrlpoints[0][0][0]); glMapGrid2f(10.0,0.0,1.0,10.0,0.0,1.0);glEvalMesh2(GL_FILL,0,10.0,0,10.0);glPopMatrix();glutSwapBuffers();}void myReshape(GLsizei w,GLsizei h){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0,(GLfloat)w/(GLfloat)h,1.0,100.0); glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0,0.0,-5.0);}int main(int argc,char ** argv){/*初始化*/glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(400,400);glutInitWindowPosition(200,200);/*创建窗口*/glutCreateWindow("lighted Bezier surface");/*绘制与显示*/myInit();glutReshapeFunc(myReshape);glutDisplayFunc(myDisplay);/*进入GLUT事件处理循环*/glutMainLoop();return(0);}图十二:曲面myInit()中的几个有关特殊效果的操作。
OpenGL绘制简单的参数曲线(完)三次B样条曲线001.#include <math.h>002.#include <gl/glut.h>003.#include <iostream>ing namespace std;005.006.#define NUM_POINTS 6007.#define NUM_SEGMENTS (NUM_POINTS-3) 008.009.struct Point2010.{011. double x;012. double y;013.014. Point2() { ; }015. Point2(int px, int py) { x = px; y = py; }016. void SetPoint2(int px, int py) { x = px; y = py; } 017.};018.019./*全局变量*/020.Point2 vec[NUM_POINTS];021.bool mouseLeftDown = false;022.023./*绘制B样条曲线*/024.void Bspline(int n)025.{026. float f1, f2, f3, f4;027. float deltaT = 1.0 / n;028. float T;029.030. glBegin(GL_LINE_STRIP);031. for (int num = 0; num < NUM_SEGMENTS; num++) 032. {033. for (int i = 0; i <= n; i++) {034.035. T = i * deltaT;036.037. f1 = (-T*T*T + 3*T*T - 3*T + 1) / 6.0;038. f2 =(3*T*T*T - 6*T*T + 4) / 6.0;039. f3 = (-3*T*T*T +3*T*T + 3*T + 1) / 6.0;040. f4 = (T*T*T) / 6.0;041.042. glVertex2f( f1*vec[num].x + f2*vec[num+1].x + f3*vec[num+2].x + f4*vec[num+3].x,043. f1*vec[num].y + f2*vec[num+1].y + f3*vec[num+2].y + f4*vec[num+3].y);044. }045. }046.047. glEnd();048.}049.050.051.void display()052.{053. glClear(GL_COLOR_BUFFER_BIT);054. glLoadIdentity();055.056. glLineWidth(1.5f);057. glColor3f(1.0,0.0,0.0);058. glBegin(GL_LINE_STRIP);059. for(int i = 0;i < NUM_POINTS; i++) 060. {061. glVertex2f(vec[i].x, vec[i].y); 062. }063. glEnd();064.065. glPointSize(10.0f);066. glColor3f(0.0, 0.0, 1.0);067. glBegin(GL_POINTS);068. for(int i = 0;i < NUM_POINTS; i++) 069. {070. glVertex2f(vec[i].x, vec[i].y); 071. }072. glEnd();073.074. Bspline(20);075.076. glFlush();077. glutSwapBuffers();078.}079.080.void init()081.{082. glClearColor(1.0, 1.0, 1.0, 0.0); 083. glShadeModel(GL_FLAT);084.085. vec[0].SetPoint2(200, 400);086. vec[1].SetPoint2(100, 300);087. vec[2].SetPoint2(200, 200);088. vec[3].SetPoint2(250, 300);089. vec[4].SetPoint2(400, 200);090. vec[5].SetPoint2(400, 400);091.}092.093.void reshape(int w, int h)094.{095. glViewport(0, 0, (GLsizei)w, (GLsizei)h);096. glMatrixMode(GL_PROJECTION);097. glLoadIdentity();098. gluOrtho2D(0.0, (GLsizei)w, (GLsizei)h, 0.0);099. glMatrixMode(GL_MODELVIEW);100. glLoadIdentity();101.}102.103.void mouse(int button, int state, int x, int y)104.{105. if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)106. {107. mouseLeftDown = true;108. }109.110. if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)111. {112. mouseLeftDown = false;113. }114.}116.double distance(int x1, int y1, int x2, int y2)117.{118. return sqrt((x1-x2) * (x1 -x2) + (y1-y2) * (y1-y2)); 119.}120.121.void motion(int x, int y)122.{123. if (mouseLeftDown)124. {125. for (int i = 0; i < NUM_POINTS; i++)126. {127. if (distance(vec[i].x, vec[i].y, x, y) < 20)128. {129. vec[i].SetPoint2(x, y);130. }131. }132. }133.134. glutPostRedisplay();135.}136.137.int main(int argc,char** argv)138.{139. glutInit(&argc,argv);140. glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE); 141. glutInitWindowSize(500, 500);142. glutInitWindowPosition (200, 200);143. glutCreateWindow('B-Spline Curve');144. init();146. glutDisplayFunc(display); 147. glutReshapeFunc(reshape); 148. glutMouseFunc(mouse); 149. glutMotionFunc(motion); 150. glutMainLoop();151.152. return 0;153.154.}。
实验四:实现自由曲线的生成算法一.实验目的:掌握计算机图形学中各种常见图形的各种算法及其实现。
特别要求直线,二次曲线,自由曲线,区域填充,二维图形裁剪,图形几何变换,自由曲面二.实验内容(1)巩固图形学中关于自由曲线的绘制算法;(2)编写程序实现Hermite,Bezier,B样条曲线个各一条;(3)综合利用直线,圆,自由曲线的算法设计生成一个卡通图形和或图案;注:本次实验要求不能直接使用系统提供的绘制二次曲线函数,但是可以调用相应的画点或画线函数。
三.实验原理使用VC环境开发实例步骤:打开VC++6.0运行界面;选择文件菜单—新建—工程—MFC App Wiaard[exe]:在右侧添加工程名称,单击确定。
单文档—点击完成,确定在View类中添加成员函数名(如:line);在新添加的函数(void CDDALineView::line())下添加程序实现过程;void CDDALineView::Ondraw(CDC*Pdc){CDDALineDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:add draw code for native data hereline();}四.实验环境硬件环境:PIII以上,内存为128M以上PC机即可.软件环境:开发平台为Windows或DOS,开发语言为C或C++,可以使用其他编程语言,相关知识自学掌握。
五.实验方案利用计算机图形学中直线,圆弧的形成算法熟悉所使用的开发环境,能够利用C所提供的绘图函数自行编写一个程序,使用相关函数完成图形的初使化能够编写程序实现Hermite,Bezier,B样条曲线个各一条;六.实验步骤及实验结果Hermite曲线:void CMy050401huqingguo04View::Hermite(){CClientDC dc(this);dc.TextOut(150,70,"Hermite曲线");dc.TextOut(500,40,"实验4:实现自由曲线的生成算法");dc.TextOut(500,70,"班级:计算机0503");dc.TextOut(500,100,"姓名:方磊");dc.TextOut(500,130,"学号:7");CPen pen1,pen2;pen1.CreatePen(PS_SOLID,2,RGB(255,0,255));pen2.CreatePen(PS_SOLID,3,RGB(0,0,0));inta1[9][2]={100,300,120,200,220,200,270,100,370,100,420,200,420,300,220,28 0,100,300};inta2[9][2]={70,-70,70,-70,70,-70,70,-70,70,70,70,70,-70,70,-70,70,70,-70};for(int i=0;i<8;i++){dc.SelectObject(&pen1);dc.MoveTo(a1[i][0],a1[i][1]);dc.LineTo(a1[i+1][0],a1[i+1][1]);dc.MoveTo(a1[i][0],a1[i][1]);for(double u=0;u<1;u=u+0.01){ double x,y;x=(2*u*u*u-3*u*u+1)*a1[i][0]+(-2*u*u*u+3*u*u)*a1[i+1][0]+(u*u*u-2*u*u+u)*a2[i][0]+(u*u*u-u*u)*a2[i+1][0];y=(2*u*u*u-3*u*u+1)*a1[i][1]+(-2*u*u*u+3*u*u)*a1[i+1][1]+(u*u*u-2*u*u+u)*a2[i][1]+(u*u*u-u*u)*a2[i+1][1];dc.SelectObject(&pen2);dc.LineTo(x,y);Sleep(2);}dc.SelectObject(&pen1);}pen1.DeleteObject();pen2.DeleteObject();}Bezier曲线:void CMy050401hiqingguo04View::Bezier(){CClientDC dc(this);dc.TextOut(5,50,"由七个控制点绘制的Bezier曲线(心型结构),其中起始点和终止点相同");dc.TextOut(500,40,"实验4:实现自由曲线的生成算法");dc.TextOut(500,70,"班级:计算机0503");dc.TextOut(500,100,"姓名:方磊");dc.TextOut(500,130,"学号:7");CPen pen1,pen2;pen1.CreatePen(PS_SOLID,3,RGB(255,0,0));pen2.CreatePen(PS_SOLID,1,RGB(255,0,255));inta[7][2]={{300,220},{200,100},{100,250},{300,400},{500,250},{400,100},{3 00,220}};for (int i=0;i<4;i=i+3){dc.MoveTo(a[i][0],a[i][1]);dc.LineTo(a[i+1][0],a[i+1][1]);dc.LineTo(a[i+2][0],a[i+2][1]);dc.LineTo(a[i+3][0],a[i+3][1]);dc.MoveTo(a[i][0],a[i][1]);for (double u=0;u<1;u=u+0.01){double x,y;x=(-u*u*u+3*u*u-3*u+1)*a[i][0]+(3*u*u*u-6*u*u+3*u)*a[i+1][0] +(-3*u*u*u+3*u*u)*a[i+2][0]+u*u*u*a[i+3][0];y=(-u*u*u+3*u*u-3*u+1)*a[i][1]+(3*u*u*u-6*u*u+3*u)*a[i+1][1] +(-3*u*u*u+3*u*u)*a[i+2][1]+u*u*u*a[i+3][1];dc.SelectObject(&pen1);dc.LineTo(x,y);Sleep(20);}dc.SelectObject(&pen2);}pen1.DeleteObject();pen2.DeleteObject();}卡通图:void CMy050401hiqingguo04View::duck(){CClientDC dc(this);CPen pen1,pen2;pen1.CreatePen(PS_SOLID,2,RGB(0,255,0));pen2.CreatePen(PS_SOLID,2,RGB(0,0,0));int a[50][2]={180,200,190,130,235,120,280,135,300,150,320,185,310,200,300,240,260,285,230,290,255,285,300,290,320,293,360,310,400,310,480,270,435,320,410,340,380,380,370,400,330,420,300,420,240,420,210,410,170,350,160,310,140,290,180,235,170,232,160,234,140,236,138,235,138,234,140,233,155,228,160,226,180,220,160,220,150,222,130,220,128,219,128,217,130,216,160,210,170,205,180,200};//小鸭子的外型线框dc.SelectObject(&pen1);for(int i=0;i<=44;i=i+1){dc.MoveTo(a[i][0],a[i][1]);dc.LineTo(a[i+1][0],a[i+1][1]);}pen1.DeleteObject();//Bezier曲线dc.SelectObject(&pen2);dc.Arc(215,185,245,215,245,215,245,215);dc.Arc(228,198,232,202,232,202,232,202);dc.MoveTo(250,340);dc.LineTo(320,340);dc.MoveTo(250,350);dc.LineTo(320,350);dc.MoveTo(250,360);dc.LineTo(320,360);dc.Arc(230,310,330,390,330,285,330,400);for(i=0;i<=44;i=i+3){dc.MoveTo(a[i][0],a[i][1]);for(double u=0;u<1;u=u+0.01){double x,y;x=(-u*u*u+3*u*u-3*u+1)*a[i][0]+(3*u*u*u-6*u*u+3*u)*a[i+1][0]+(-3* u*u*u+3*u*u)*a[i+2][0]+u*u*u*a[i+3][0];y=(-u*u*u+3*u*u-3*u+1)*a[i][1]+(3*u*u*u-6*u*u+3*u)*a[i+1][1]+(-3*u*u*u+3*u*u)*a[i+2][1]+u*u*u*a[i+3][1];dc.LineTo(x,y);Sleep(1);}}pen2.DeleteObject();}。
⽤OpenGL进⾏曲线、曲⾯的绘制实验⽬的理解Bezier曲线、曲⾯绘制的基本原理;理解OpenGL中⼀维、⼆维插值求值器的⽤法。
掌握OpenGL中曲线、曲⾯绘图的⽅法,对⽐不同参数下的绘图效果差异;代码1:⽤四个控制点绘制⼀条三次Bezier曲线#include "stdafx.h"#include <stdlib.h>#include <time.h>#include <GL/glut.h>//4个控制点的3D坐标——z坐标全为0GLfloat ctrlpoints[4][3] = {{ -4, -4, 0 }, { -2, 4, 0 }, { 2, -4, 0 }, { 4, 4, 0 }};void init(void){//背景⾊glClearColor(0.0, 0.0, 0.0, 1.0);//将控制点坐标映射为曲线坐标//参数1:GL_MAP1_VERTEX_3,3维点坐标//参数2和3:控制参数t或u的取值范围[0, 1]//参数4:曲线内插值点间的步长3————3维坐标//参数5:曲线间的补偿为顶点数4个————总步长为12//参数6:控制点⼆维数组⾸元素地址//注意: 若是在这⾥设置了相关参数,后续对ctrlpoints内容更改曲线不变glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);//打开开关——允许3维坐标控制点到参数点转换开关glEnable(GL_MAP1_VERTEX_3);glShadeModel(GL_FLAT);//代码开关2:去掉本注释,可启⽤反⾛样/*glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH); //允许直线反⾛样glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST); // Antialias the linesglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);*/}void display(void){int i;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 1.0, 1.0);//代码开关1:去掉本注释,查看动态的曲线绘图效果:动态更新控制点坐标/*for(int t = 0; t < 4; t++) {for(int j = 0; j < 3; j++)ctrlpoints[t][j] = (rand() % 1024 / 1024.0 - 0.5) * 10;}//动态映射glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);*/glLoadIdentity();glColor3f(1.0, 0.0, 0.0);//绘制连续线段glBegin(GL_LINE_STRIP);//参数t或u取值为i/30,共计31个点for (i = 0; i <= 30; i++)glEvalCoord1f((GLfloat)i / 30.0); //根据4个控制点坐标的参数化插值glEnd();/* 显⽰控制点 */glPointSize(5.0);glBegin(GL_POINTS);for (i = 0; i < 4; i++)glVertex3fv(&ctrlpoints[i][0]);glEnd();glTranslatef(-0.1f, 0.1f, 0.0f);glColor3f(0.0, 1.0, 0.0);//glLineWidth(2.0);//绘制连续线段——线段数越多,曲线越光滑glBegin(GL_LINE_STRIP);//设置参数t或u取值为i/60,共计61个点//实验:若让t从-2变化到+2,可看到什么效果for (i = 0; i <= 60; i++)glEvalCoord1f((GLfloat)i / 60.0); //根据4个控制点坐标的参数化插值glEnd();glTranslatef(-0.1f, 0.1f, 0.0f);glColor3f(1.0, 1.0, 1.0);//绘制连续线段glBegin(GL_LINE_STRIP);//设置参数t或u取值为i/60,共计61个点//实验:若让t从-2变化到+2,可看到什么效果for (i = 0; i <= 100; i++)glEvalCoord1f((GLfloat)i / 100.0);glEnd();glutSwapBuffers();}//3D空间中绘制2D效果,采⽤正交投影void reshape(GLsizei w, GLsizei h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-5.0, 5.0, -5.0*(GLfloat)h / (GLfloat)w, 5.0*(GLfloat)h / (GLfloat)w, -5.0, 5.0);elseglOrtho(-5.0*(GLfloat)w / (GLfloat)h, 5.0*(GLfloat)w / (GLfloat)h, -5.0, 5.0, -5.0, 5.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void keyboard(unsigned char key, int x, int y){switch (key){case'x':case'X':case27: //ESC键exit(0);break;default:break;}}int main(int argc, char** argv){srand((unsigned int)time(0));glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//使⽤双缓存模式和深度缓存 glutInitWindowSize(800, 800);glutInitWindowPosition(0, 0);glutCreateWindow("2D Bezier曲线");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutIdleFunc(display);//设置空闲时调⽤的函数glutMainLoop();return0;}此时我们打开代码开关1,查看动态Bezier曲线绘制效果:关闭代码开关1,打开代码开关2,查看直线反⾛样效果:对⽐刚开始的效果图,我们发现,使⽤了直线反⾛样后,绘制出的曲线很光滑,看着很舒服。
《计算机图形学基础》实验4 OpenGL中基本图形的绘制一、实验目的及要求1.掌握OpenGL中点的绘制方法。
2.掌握OpenGL中直线的绘制方法。
3.掌握OpenGL中多边形面的绘制方法。
4. 掌握OpenGL中字符函数的绘制方法。
二、实验环境主要是软件开发环境vc 6.0三、实验内容OpenGL实现直线段的反走样。
四、实验结果五、程序代码#include <gl/glut.h>GLuint lineList; //指定显示列表IDvoid Initial(){glClearColor(1.0f, 1.0f, 1.0f, 0.0f);glLineWidth(12.0f);glColor4f (0.0, 0.6, 1.0, 1.0);lineList = glGenLists(1);glNewList(lineList, GL_COMPILE); //定义显示列表glBegin(GL_LINE_LOOP);glVertex2f(1.0f, 1.0f);glVertex2f(4.0f, 2.0f);glVertex2f(2.0f, 5.0f);glEnd();glEndList();}void ChangeSize(GLsizei w, GLsizei h){if(h == 0) h = 1;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)gluOrtho2D(0.0, 5.0, 0.0, 6.0*(GLfloat)h/(GLfloat)w);elsegluOrtho2D(0.0, 5.0*(GLfloat)w/(GLfloat)h, 0.0, 6.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void Displayt(void){glClear(GL_COLOR_BUFFER_BIT);glCallList(lineList);glFlush();}void Displayw(void){glClear(GL_COLOR_BUFFER_BIT);glEnable(GL_LINE_SMOOTH); //使用反走样glEnable (GL_BLEND); //启用混合函数glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); //指定混合函数glCallList(lineList);glFlush();}void main(void){glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(300, 300);glutCreateWindow("原始图形");glutDisplayFunc(Displayt);glutReshapeFunc(ChangeSize);Initial();glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(300, 300);glutInitWindowSize(300, 300);glutCreateWindow("反走样图形");glutDisplayFunc(Displayw);glutReshapeFunc(ChangeSize);Initial();glutMainLoop();}六、心得体会在光栅图形显示器上绘制非水平且非垂直的直线或多边形边界时,或多或少会呈现锯齿状或台阶状外观。
//这个是一个效果图,仅仅是演示一下。
///本文档基于NeHe的教程,在此感谢他的无私奉献,让大家学会了怎样使用OpenGL。
//这段生成sin数据int main(int argc, char** argv){for (int i = -360; i <= 360; i += 10) {cout<<" { "<<i / 20<<" , "<<15 * sin(i * 3.1416 / 180)<<" , 0 }, "<<"\n";}}//生成的数据放在这里typedef struct tagVector {float X, Y, Z;} VECTOR, *PVECTOR;VECTOR vec[] = {{ -18 , -0.000220392 , 0 },{ -17 , 2.60451 , 0 },{ -17 , 5.13011 , 0 },{ -16 , 9.64166 , 0 }, { -15 , 11.4905 , 0 }, { -15 , 12.9903 , 0 }, { -14 , 14.0953 , 0 }, { -14 , 14.7721 , 0 }, { -13 , 15 , 0 },{ -13 , 14.7721 , 0 }, { -12 , 14.0954 , 0 }, { -12 , 12.9905 , 0 }, { -11 , 11.4908 , 0 }, { -11 , 9.64192 , 0 }, { -10 , 7.50011 , 0 }, { -10 , 5.13042 , 0 }, { -9 , 2.60484 , 0 }, { -9 , 0.000110196 , 0 }, { -8 , -2.60462 , 0 }, { -8 , -5.13021 , 0 }, { -7 , -7.49992 , 0 }, { -7 , -9.64175 , 0 }, { -6 , -11.4906 , 0 }, { -6 , -12.9903 , 0 }, { -5 , -14.0954 , 0 }, { -5 , -14.7721 , 0 }, { -4 , -15 , 0 },{ -4 , -14.7721 , 0 }, { -3 , -14.0954 , 0 }, { -3 , -12.9904 , 0 }, { -2 , -11.4907 , 0 }, { -2 , -9.64183 , 0 }, { -1 , -7.50002 , 0 }, { -1 , -5.13031 , 0 }, { 0 , -2.60473 , 0 }, { 0 , 0 , 0 },{ 0 , 2.60473 , 0 }, { 1 , 5.13031 , 0 }, { 1 , 7.50002 , 0 }, { 2 , 9.64183 , 0 }, { 2 , 11.4907 , 0 },{ 3 , 12.9904 , 0 }, { 3 , 14.0954 , 0 }, { 4 , 14.7721 , 0 }, { 4 , 15 , 0 },{ 5 , 14.7721 , 0 },{ 6 , 12.9903 , 0 },{ 6 , 11.4906 , 0 },{ 7 , 9.64175 , 0 },{ 7 , 7.49992 , 0 },{ 8 , 5.13021 , 0 },{ 8 , 2.60462 , 0 },{ 9 , -0.000110196 , 0 },{ 9 , -2.60484 , 0 },{ 10 , -5.13042 , 0 },{ 10 , -7.50011 , 0 },{ 11 , -9.64192 , 0 },{ 11 , -11.4908 , 0 },{ 12 , -12.9905 , 0 },{ 12 , -14.0954 , 0 },{ 13 , -14.7721 , 0 },{ 13 , -15 , 0 },{ 14 , -14.7721 , 0 },{ 14 , -14.0953 , 0 },{ 15 , -12.9903 , 0 },{ 15 , -11.4905 , 0 },{ 16 , -9.64166 , 0 },{ 16 , -7.49983 , 0 },{ 17 , -5.13011 , 0 },{ 17 , -2.60451 , 0 },{ 18 , 0.000220392 , 0 }};//在这里进行调用绘制#include <windows.h>// Header File For Windows#include <cstdio>// Header File For Standard Input/Output#include <cmath>#include <gl\gl.h>// Header File For The OpenGL32 Library#include <gl\glu.h>// Header File For The GLu32 Library#include "NeHeGL.h"// Header File For NeHeGL#include "Data.h"//让数据单独在一个文件里#pragma comment( lib, "opengl32.lib" )// Search For OpenGL32.lib While Linking #pragma comment( lib, "glu32.lib" )// Search For GLu32.lib While Linkingusing namespace std;#ifndef CDS_FULLSCREEN// CDS_FULLSCREEN Is Not Defined By Some#define CDS_FULLSCREEN 4// Compilers. By Defining It This Way,#endif// We Can Avoid ErrorsGL_Window* g_window;Keys* g_keys;float timeElapsed = 0;// Elapsed Time In TheGLuint base;// Base Display List For The Font SetGL YPHMETRICSFLOAT gmf[256];// Storage For Information About Our Outline Font CharactersGLvoid BuildFont(GL_Window* window)// Build Our Bitmap Font{HFONT font;// Windows Font IDbase = glGenLists(256);// Storage For 256 Charactersfont = CreateFont( -12,// Height Of Font0,// Width Of Font0,// Angle Of Escapement0,// Orientation AngleFW_BOLD,// Font WeightFALSE,// ItalicFALSE,// UnderlineFALSE,// StrikeoutANSI_CHARSET,// Character Set IdentifierOUT_TT_PRECIS,// Output PrecisionCLIP_DEFAULT_PRECIS,// Clipping PrecisionANTIALIASED_QUALITY,// Output QualityFF_DONTCARE|DEFAULT_PITCH,// Family And PitchNULL);// Font NameHDC hDC = window->hDC;SelectObject(hDC, font);// Selects The Font We CreatedwglUseFontOutlines( hDC,// Select The Current DC0,// Starting Character255,// Number Of Display Lists To Buildbase,// Starting Display Lists0.0f,// Deviation From The True Outlines0.0f,// Font Thickness In The Z DirectionWGL_FONT_POL YGONS,// Use Polygons, Not Linesgmf);// Address Of Buffer To Recieve Data}GLvoid KillFont(GLvoid)// Delete The Font{glDeleteLists(base, 256);// Delete All 256 Characters}GLvoid glPrint(float x, float y, float z, const char *fmt, ...) // Custom GL "Print" Routine{float length=0;// Used To Find The Length Of The Textchar text[256];// Holds Our Stringva_list ap;// Pointer To List Of Argumentsif (fmt == NULL)// If There's No Textreturn;// Do Nothingva_start(ap, fmt);// Parses The String For Variablesvsprintf(text, fmt, ap);// And Converts Symbols To Actual Numbersva_end(ap);// Results Are Stored In Textfor (unsigned int loop=0;loop<(strlen(text));loop++)// Loop To Find Text Length{length+=gmf[text[loop]].gmfCellIncX;// Increase Length By Each Characters Width }glTranslatef(x - length, y, z);// Position Text On The ScreenglPushAttrib(GL_LIST_BIT);// Pushes The Display List BitsglListBase(base);// Sets The Base Character to 0glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);// Draws The Display List TextglPopAttrib();// Pops The Display List BitsglTranslatef(-x, -y, -z);// Position Text On The Screen}BOOL Initialize (GL_Window* window, Keys* keys)// Any GL Init Code & User Initialiazation Goes Here{g_window = window;g_keys = keys;glClearColor (0.0f, 0.0f, 0.0f, 0.5f);// Black BackgroundglShadeModel (GL_SMOOTH);// Select Smooth ShadingglHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// Set PerspectiveCalculations To Most AccurateBuildFont(window);// Build The Fontreturn TRUE;// Return TRUE (Initialization Successful)}void Deinitialize (void)// Any User DeInitialization Goes Here{KillFont();}void Update (DWORD milliseconds)// Perform Motion Updates Here{if (g_keys->keyDown [VK_ESCAPE] == TRUE)// Is ESC Being Pressed?TerminateApplication (g_window);// Terminate The Programif (g_keys->keyDown [VK_F1] == TRUE)// Is F1 Being Pressed?ToggleFullscreen (g_window);// Toggle Fullscreen Mode// dt Is The Time Interval (As Seconds) From The Previous Frame To The Current Frame.// dt Will Be Used To Iterate Simulation Values Such As Velocity And Position Of Masses.float dt = milliseconds / 1000.0f;// Let's Convert Milliseconds To SecondstimeElapsed += dt;// Iterate Elapsed Timefloat maxPossible_dt = 0.1f;// Say That The Maximum Possible dt Is 0.1 Seconds// This Is Needed So We Do Not Pass Over A Non Precise dt Valueint numOfIterations = (int)(dt / maxPossible_dt) + 1;// Calculate Number Of Iterations To Be Made At This Update Depending On maxPossible_dt And dtif (numOfIterations != 0)// Avoid Division By Zerodt = dt / numOfIterations;// dt Should Be Updated According To numOfIterationsfor (int a = 0; a < numOfIterations; ++a)// We Need To Iterate Simulations "numOfIterations" Times{//Add iteration action...}void Draw (void){glMatrixMode(GL_MODELVIEW);glLoadIdentity ();// Reset The Modelview Matrix// Position Camera 40 Meters Up In Z-Direction.// Set The Up Vector In Y-Direction So That +X Directs To Right And +Y Directs To Up On The Window.gluLookAt(0, 0, 40, 0, 0, 0, 0, 1, 0);glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Clear Screen And Depth Buffer// Drawing The Coordinate Plane Starts Here.// We Will Draw Horizontal And V ertical Lines With A Space Of 1 Meter Between Them.glColor3ub(0, 255, 255);// Draw In BlueglBegin(GL_LINES);//Add lines...int i;for ( i = 0; i < sizeof(vec) / sizeof(vec[0]) - 1; i++) {glVertex3f(vec[i].X, vec[i].Y, vec[i].Z);glVertex3f(vec[i+1].X, vec[i+1].Y, vec[i+1].Z);}glVertex3f(-20, 0, 0);glVertex3f(20, 0, 0);glEnd();glColor3ub(255, 0, 0);glPointSize(4);glBegin(GL_POINTS);//Add points...for (int i = 0; i < sizeof(vec) / sizeof(vec[0]); i++) {glVertex3f(vec[i].X, vec[i].Y, vec[i].Z);}glEnd();glColor3ub(255, 255, 255);// Draw In WhiteglPrint(-5.0f, 14, 0, "Time elapsed (seconds): %.2f", timeElapsed); // Print timeElapsedglPrint(-5.0f, 13, 0, "Add What You WANT To Say HERE"); // PrintglFlush ();// Flush The GL Rendering Pipeline}//这边是框架#include <windows.h>// Header File For The Windows Library#include <gl/gl.h>// Header File For The OpenGL32 Library#include <gl/glu.h>// Header File For The GLu32 Library#include "NeHeGL.h"// Header File For The NeHeGL Basecode#define WM_TOGGLEFULLSCREEN (WM_USER+1)// Application Define Message For Togglingstatic BOOL g_isProgramLooping;// Window Creation Loop, For FullScreen/Windowed Toggle// Between Fullscreen / Windowed Modestatic BOOL g_createFullScreen;// If TRUE, Then Create Fullscreenvoid TerminateApplication (GL_Window* window)// Terminate The Application{PostMessage (window->hWnd, WM_QUIT, 0, 0);// Send A WM_QUIT Messageg_isProgramLooping = FALSE;// Stop Looping Of The Program}void ToggleFullscreen (GL_Window* window)// Toggle Fullscreen/Windowed{PostMessage (window->hWnd, WM_TOGGLEFULLSCREEN, 0, 0);// Send A WM_TOGGLEFULLSCREEN Message}void ReshapeGL (int width, int height)// Reshape The Window When It's Moved Or Resized{glViewport (0, 0, (GLsizei)(width), (GLsizei)(height));// Reset The Current ViewportglMatrixMode (GL_PROJECTION);// Select The Projection MatrixglLoadIdentity ();// Reset The Projection MatrixgluPerspective (45.0f, (GLfloat)(width)/(GLfloat)(height),// Calculate The Aspect Ratio Of The Window1.0f, 100.0f);glMatrixMode (GL_MODELVIEW);// Select The Modelview MatrixglLoadIdentity ();// Reset The Modelview Matrix}BOOL ChangeScreenResolution (int width, int height, int bitsPerPixel) // Change The Screen ResolutionDEVMODE dmScreenSettings;// Device ModeZeroMemory (&dmScreenSettings, sizeof (DEVMODE));// Make Sure Memory Is Cleared dmScreenSettings.dmSize = sizeof (DEVMODE);// Size Of The Devmode StructuredmScreenSettings.dmPelsWidth = width;// Select Screen WidthdmScreenSettings.dmPelsHeight = height;// Select Screen HeightdmScreenSettings.dmBitsPerPel = bitsPerPixel;// Select Bits Per PixeldmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;if (ChangeDisplaySettings (&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL){return FALSE;// Display Change Failed, Return False}return TRUE;// Display Change Was Successful, Return True}BOOL CreateWindowGL (GL_Window* window)// This Code Creates Our OpenGL Window {DWORD windowStyle = WS_OVERLAPPEDWINDOW;// Define Our Window StyleDWORD windowExtendedStyle = WS_EX_APPWINDOW;// Define The Window's Extended StylePIXELFORMATDESCRIPTOR pfd =// pfd Tells Windows How We Want Things To Be{sizeof (PIXELFORMATDESCRIPTOR),// Size Of This Pixel Format Descriptor1,// Version NumberPFD_DRAW_TO_WINDOW |// Format Must Support WindowPFD_SUPPORT_OPENGL |// Format Must Support OpenGLPFD_DOUBLEBUFFER,// Must Support Double BufferingPFD_TYPE_RGBA,// Request An RGBA Formatwindow->init.bitsPerPixel,// Select Our Color Depth0, 0, 0, 0, 0, 0,// Color Bits Ignored0,// No Alpha Buffer0,// Shift Bit Ignored0,// No Accumulation Buffer0, 0, 0, 0,// Accumulation Bits Ignored16,// 16Bit Z-Buffer (Depth Buffer)0,// No Stencil Buffer0,// No Auxiliary BufferPFD_MAIN_PLANE,// Main Drawing Layer0,// Reserved0, 0, 0// Layer Masks Ignored};RECT windowRect = {0, 0, window->init.width, window->init.height}; // Define Our Window CoordinatesGLuint PixelFormat;// Will Hold The Selected Pixel Formatif (window->init.isFullScreen == TRUE)// Fullscreen Requested, Try Changing Video Modes {if (ChangeScreenResolution (window->init.width, window->init.height, window->init.bitsPerPixel) == FALSE){// Fullscreen Mode Failed. Run In Windowed Mode InsteadMessageBox (HWND_DESKTOP, "Mode Switch Failed.\nRunning In Windowed Mode.", "Error", MB_OK | MB_ICONEXCLAMA TION);window->init.isFullScreen = FALSE;// Set isFullscreen To False (Windowed Mode)}else// Otherwise (If Fullscreen Mode Was Successful){ShowCursor (FALSE);// Turn Off The CursorwindowStyle = WS_POPUP;// Set The WindowStyle To WS_POPUP (Popup Window)windowExtendedStyle |= WS_EX_TOPMOST;// Set The Extended Window Style To WS_EX_TOPMOST}// (Top Window Covering Everything Else)}else// If Fullscreen Was Not Selected{// Adjust Window, Account For Window BordersAdjustWindowRectEx (&windowRect, windowStyle, 0, windowExtendedStyle);}// Create The OpenGL Windowwindow->hWnd = CreateWindowEx (windowExtendedStyle,// Extended Stylewindow->init.application->className, // Class Namewindow->init.title,// Window TitlewindowStyle,// Window Style0, 0,// Window X,Y PositionwindowRect.right - windowRect.left, // Window WidthwindowRect.bottom - windowRect.top, // Window HeightHWND_DESKTOP,// Desktop Is Window's Parent0,// No Menuwindow->init.application->hInstance, // Pass The Window Instancewindow);if (window->hWnd == 0)// Was Window Creation A Success?{return FALSE;// If Not Return False}window->hDC = GetDC (window->hWnd);// Grab A Device Context For This Windowif (window->hDC == 0)// Did We Get A Device Context?{// FailedDestroyWindow (window->hWnd);// Destroy The Windowwindow->hWnd = 0;// Zero The Window Handlereturn FALSE;// Return False}PixelFormat = ChoosePixelFormat (window->hDC, &pfd);// Find A Compatible Pixel Formatif (PixelFormat == 0)// Did We Find A Compatible Format?{// FailedReleaseDC (window->hWnd, window->hDC);// Release Our Device Contextwindow->hDC = 0;// Zero The Device ContextDestroyWindow (window->hWnd);// Destroy The Windowwindow->hWnd = 0;// Zero The Window Handlereturn FALSE;// Return False}if (SetPixelFormat (window->hDC, PixelFormat, &pfd) == FALSE)// Try To Set The Pixel Format{// FailedReleaseDC (window->hWnd, window->hDC);// Release Our Device Contextwindow->hDC = 0;// Zero The Device ContextDestroyWindow (window->hWnd);// Destroy The Windowwindow->hWnd = 0;// Zero The Window Handlereturn FALSE;// Return False}window->hRC = wglCreateContext (window->hDC);// Try To Get A Rendering Contextif (window->hRC == 0)// Did We Get A Rendering Context?{// FailedReleaseDC (window->hWnd, window->hDC);// Release Our Device Contextwindow->hDC = 0;// Zero The Device ContextDestroyWindow (window->hWnd);// Destroy The Windowwindow->hWnd = 0;// Zero The Window Handlereturn FALSE;// Return False}// Make The Rendering Context Our Current Rendering Contextif (wglMakeCurrent (window->hDC, window->hRC) == FALSE){// FailedwglDeleteContext (window->hRC);// Delete The Rendering Contextwindow->hRC = 0;// Zero The Rendering ContextReleaseDC (window->hWnd, window->hDC);// Release Our Device Contextwindow->hDC = 0;// Zero The Device ContextDestroyWindow (window->hWnd);// Destroy The Windowwindow->hWnd = 0;// Zero The Window Handlereturn FALSE;// Return False}ShowWindow (window->hWnd, SW_NORMAL);// Make The Window Visiblewindow->isVisible = TRUE;// Set isVisible To TrueReshapeGL (window->init.width, window->init.height);// Reshape Our GL WindowZeroMemory (window->keys, sizeof (Keys));// Clear All Keyswindow->lastTickCount = GetTickCount ();// Get Tick Countreturn TRUE;// Window Creating Was A Success// Initialization Will Be Done In WM_CREATE}BOOL DestroyWindowGL (GL_Window* window)// Destroy The OpenGL Window & Release Resources{if (window->hWnd != 0)// Does The Window Have A Handle?{if (window->hDC != 0)// Does The Window Have A Device Context?{wglMakeCurrent (window->hDC, 0);// Set The Current Active Rendering Context To Zeroif (window->hRC != 0)// Does The Window Have A Rendering Context?{wglDeleteContext (window->hRC);// Release The Rendering Contextwindow->hRC = 0;// Zero The Rendering Context}ReleaseDC (window->hWnd, window->hDC);// Release The Device Contextwindow->hDC = 0;// Zero The Device Context}DestroyWindow (window->hWnd);// Destroy The Windowwindow->hWnd = 0;// Zero The Window Handle}if (window->init.isFullScreen)// Is Window In Fullscreen Mode{ChangeDisplaySettings (NULL,0);// Switch Back To Desktop ResolutionShowCursor (TRUE);// Show The Cursor}return TRUE;// Return True}// Process Window Message CallbacksLRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){// Get The Window ContextGL_Window* window = (GL_Window*)(GetWindowLong (hWnd, GWL_USERDA TA));switch (uMsg)// Evaluate Window Message{case WM_SYSCOMMAND:// Intercept System Commands{switch (wParam)// Check System Calls{case SC_SCREENSA VE:// Screensaver Trying To Start?case SC_MONITORPOWER:// Monitor Trying To Enter Powersave?return 0;// Prevent From Happening}break;// Exit}return 0;// Returncase WM_CREATE:// Window Creation{CREATESTRUCT* creation = (CREATESTRUCT*)(lParam);// Store WindowStructure Pointerwindow = (GL_Window*)(creation->lpCreateParams);SetWindowLong (hWnd, GWL_USERDATA, (LONG)(window));}return 0;// Returncase WM_CLOSE:// Closing The WindowTerminateApplication(window);// Terminate The Applicationreturn 0;// Returncase WM_SIZE:// Size Action Has Taken Placeswitch (wParam)// Evaluate Size Action{case SIZE_MINIMIZED:// Was Window Minimized?window->isVisible = FALSE;// Set isVisible To Falsereturn 0;// Returncase SIZE_MAXIMIZED:// Was Window Maximized?window->isVisible = TRUE;// Set isVisible To TrueReshapeGL (LOWORD (lParam), HIWORD (lParam));// Reshape Window - LoWord=Width, HiWord=Heightreturn 0;// Returncase SIZE_RESTORED:// Was Window Restored?window->isVisible = TRUE;// Set isVisible To TrueReshapeGL (LOWORD (lParam), HIWORD (lParam));// Reshape Window - LoWord=Width, HiWord=Heightreturn 0;// Return}break;// Breakcase WM_KEYDOWN:// Update Keyboard Buffers For Keys Pressedif ((wParam >= 0) && (wParam <= 255))// Is Key (wParam) In A Valid Range?{window->keys->keyDown [wParam] = TRUE;// Set The Selected Key (wParam) To Truereturn 0;// Return}break;// Breakcase WM_KEYUP:// Update Keyboard Buffers For Keys Releasedif ((wParam >= 0) && (wParam <= 255))// Is Key (wParam) In A Valid Range?{window->keys->keyDown [wParam] = FALSE;// Set The Selected Key(wParam) To Falsereturn 0;// Return}break;// Breakcase WM_TOGGLEFULLSCREEN:// Toggle FullScreen Mode On/Offg_createFullScreen = (g_createFullScreen == TRUE) ? FALSE : TRUE;PostMessage (hWnd, WM_QUIT, 0, 0);break;// Break}return DefWindowProc (hWnd, uMsg, wParam, lParam);// Pass Unhandled Messages To DefWindowProc}BOOL RegisterWindowClass (Application* application)// Register A Window Class For This Application.{// TRUE If Successful// Register A Window ClassWNDCLASSEX windowClass;// Window ClassZeroMemory (&windowClass, sizeof (WNDCLASSEX));// Make Sure Memory Is Cleared windowClass.cbSize = sizeof (WNDCLASSEX);// Size Of The windowClass StructurewindowClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraws The Window For Any Movement / ResizingwindowClass.lpfnWndProc = (WNDPROC)(WindowProc);// WindowProc Handles MessageswindowClass.hInstance = application->hInstance;// Set The InstancewindowClass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE);// Class Background Brush ColorwindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);// Load The Arrow PointerwindowClass.lpszClassName = application->className;// Sets The Applications Classname if (RegisterClassEx (&windowClass) == 0)// Did Registering The Class Fail?{// NOTE: Failure, Should Never HappenMessageBox (HWND_DESKTOP, "RegisterClassEx Failed!", "Error", MB_OK | MB_ICONEXCLAMA TION);return FALSE;// Return False (Failure)}return TRUE;// Return True (Success)}// Program Entry (WinMain)int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){Application application;// Application StructureGL_Window window;// Window StructureKeys keys;// Key StructureBOOL isMessagePumpActive;// Message Pump Active?MSG msg;// Window Message StructureDWORD tickCount;// Used For The Tick Counter// Fill Out Application Dataapplication.className = "OpenGL";// Application Class Nameapplication.hInstance = hInstance;// Application Instance// Fill Out WindowZeroMemory (&window, sizeof (GL_Window));// Make Sure Memory Is Zeroedwindow.keys = &keys;// Window Key Structurewindow.init.application = &application;// Window Applicationwindow.init.title = "OPENGL FRAME DEMOS"; // Window Titlewindow.init.width = 640;// Window Widthwindow.init.height = 480;// Window Heightwindow.init.bitsPerPixel = 16;// Bits Per Pixelwindow.init.isFullScreen = TRUE;// Fullscreen? (Set To TRUE)ZeroMemory (&keys, sizeof (Keys));// Zero keys Structure// Ask The User If They Want To Start In FullScreen Mode?if (MessageBox (HWND_DESKTOP, "Would You Like To Run In Fullscreen Mode?", "Start FullScreen?", MB_YESNO | MB_ICONQUESTION) == IDNO){window.init.isFullScreen = FALSE;// If Not, Run In Windowed Mode }// Register A Class For Our Window To Useif (RegisterWindowClass (&application) == FALSE)// Did Registering A Class Fail?{// FailureMessageBox (HWND_DESKTOP, "Error Registering Window Class!", "Error", MB_OK | MB_ICONEXCLAMATION);return -1;// Terminate Application}g_isProgramLooping = TRUE;// Program Looping Is Set To TRUEg_createFullScreen = window.init.isFullScreen;// g_createFullScreen Is Set To User Defaultwhile (g_isProgramLooping)// Loop Until WM_QUIT Is Received{// Create A Windowwindow.init.isFullScreen = g_createFullScreen;// Set Init Param Of Window Creation To Fullscreen?if (CreateWindowGL (&window) == TRUE)// Was Window Creation Successful?{// At This Point We Should Have A Window That Is Setup To Render OpenGLif (Initialize (&window, &keys) == FALSE)// Call User Intialization{// FailureTerminateApplication (&window);// Close Window, This Will Handle The Shutdown}else// Otherwise (Start The Message Pump){ // Initialize was a successisMessagePumpActive = TRUE;// Set isMessagePumpActive To TRUEwhile (isMessagePumpActive == TRUE)// While The Message Pump Is Active{// Success Creating Window. Check For Window Messagesif (PeekMessage (&msg, window.hWnd, 0, 0, PM_REMOVE) != 0){// Check For WM_QUIT Messageif (msg.message != WM_QUIT)// Is The Message A WM_QUIT Message?{DispatchMessage (&msg);// If Not, Dispatch The Message}else// Otherwise (If Message Is WM_QUIT){isMessagePumpActive = FALSE;// Terminate The Message Pump}}else// If There Are No Messages{if (window.isVisible == FALSE)// If Window Is Not Visible{WaitMessage ();// Application Is Minimized Wait For A Message}else// If Window Is Visible{// Process Application LooptickCount = GetTickCount ();// Get The Tick CountUpdate (tickCount - stTickCount); // Update The CounterstTickCount = tickCount;// Set Last Count To Current CountDraw ();// Draw Our SceneSwapBuffers (window.hDC);// Swap Buffers (Double Buffering)}}}// Loop While isMessagePumpActive == TRUE}// If (Initialize (...// Application Is FinishedDeinitialize ();// User Defined DeInitializationDestroyWindowGL (&window);// Destroy The Active Window}else// If Window Creation Failed{// Error Creating WindowMessageBox (HWND_DESKTOP, "Error Creating OpenGL Window", "Error", MB_OK | MB_ICONEXCLAMATION);g_isProgramLooping = FALSE;// Terminate The Loop}}// While (isProgramLooping)UnregisterClass (application.className, application.hInstance);// UnRegister Window Class return 0;}// End Of WinMain()///这个是框架的头文件#ifndef GL_FRAMEWORK__INCLUDED#define GL_FRAMEWORK__INCLUDED#include <windows.h>// Header File For Windowstypedef struct {// Structure For Keyboard StuffBOOL keyDown [256];// Holds TRUE / FALSE For Each Key} Keys;// Keystypedef struct {// Contains Information Vital To ApplicationsHINSTANCE hInstance;// Application Instanceconst char* className;// Application ClassName} Application;// Applicationtypedef struct {// Window Creation InfoApplication* application;// Application Structurechar* title;// Window Titleint width;// Widthint height;// Heightint bitsPerPixel;// Bits Per PixelBOOL isFullScreen;// FullScreen?} GL_WindowInit;// GL_WindowInittypedef struct {// Contains Information Vital To A WindowKeys* keys;// Key StructureHWND hWnd;// Window HandleHDC hDC;// Device ContextHGLRC hRC;// Rendering ContextGL_WindowInit init;// Window InitBOOL isVisible;// Window Visible?DWORD lastTickCount;// Tick Counter} GL_Window;// GL_Windowvoid TerminateApplication (GL_Window* window);// Terminate The Applicationvoid ToggleFullscreen (GL_Window* window);// Toggle Fullscreen / Windowed Mode// These Are The Function You Must ProvideBOOL Initialize (GL_Window* window, Keys* keys); // Performs All Your Initialization void Deinitialize (void);// Performs All Your DeInitializationvoid Update (DWORD milliseconds);// Perform Motion Updatesvoid Draw (void);// Perform All Your Scene Drawing#endif// GL_FRAMEWORK__INCLUDED////////////////////////////////////////////////////////////////////////////////。
OpenGL绘制Bezier曲线的⽅法本⽂实例为⼤家分享了OpenGL绘制Bezier曲线的具体代码,供⼤家参考,具体内容如下项⽬要求:– 使⽤⿏标在屏幕中任意设置控制点,并⽣成曲线– 使⽤⿏标和键盘的交互操作实现对曲线的修改。
项⽬总体介绍本项⽬利⽤Bezier曲线⽣成算法⽣成可由⽤户⾃定义的曲线。
可实现核⼼功能如下:1、⽤户⽤⿏标左击屏幕任意处产⽣记录点。
2、⿏标右击屏幕任意处由先前的任意个数记录点和其先后关系⽣成Bezier曲线。
另有辅助输⼊功能:1、按键盘‘C'键可清除所有记录点。
2、按键盘‘R'键可清除上⼀个记录点。
3、按键盘‘Q'键可推出程序。
项⽬设计思路1、Bezier曲线介绍:贝塞尔曲线就是这样的⼀条曲线,它是依据四个位置任意的点坐标绘制出的⼀条光滑曲线。
在历史上,研究贝塞尔曲线的⼈最初是按照已知曲线参数⽅程来确定四个点的思路设计出这种⽮量曲线绘制法。
1962年,法国数学家Pierre Bézier第⼀个研究了这种⽮量绘制曲线的⽅法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就⽤他的姓⽒来命名是为贝塞尔曲线。
2、⽣成公式:(1)线性公式(只有两个点情况)给定点P0、P1,线性贝兹曲线只是⼀条两点之间的直线。
这条线由下式给出:且其等同于线性插值。
(2)⼆次⽅公式(三个点组成)⼆次⽅贝兹曲线的路径由给定点P0、P1、P2的函数B(t)追踪:TrueType字型就运⽤了以贝兹样条组成的⼆次贝兹曲线。
(3)三次⽅公式(四个点)P0、P1、P2、P3四个点在平⾯或在三维空间中定义了三次⽅贝兹曲线。
曲线起始于P0⾛向P1,并从P2的⽅向来到P3。
⼀般不会经过P1或P2;这两个点只是在那⾥提供⽅向资讯。
P0和P1之间的间距,决定了曲线在转⽽趋进P3之前,⾛向P2⽅向的“长度有多长”。
曲线的参数形式为:现代的成象系统,如PostScript、Asymptote和Metafont,运⽤了以贝兹样条组成的三次贝兹曲线,⽤来描绘曲线轮廓。
实验四自由曲线绘制算法1.实验目的:掌握曲线的表示形式、曲线的连续性条件、拟合和逼近的基本概念掌握Bezier曲线的性质编程实现Bezier曲线生成算法2.实验描述:绘制三次Bezier曲线,可以采用公式法或德卡斯特里奥(De Casteliau)算法绘制3.算法设计:当n=3时,Bezier曲线的控制多边形有4个控制点P0、P1、P2和P3,Bezier曲线是三次多项式。
P(t)=∑PiBi,n(t),t∈[0,1];三次Bezier曲线是自由曲线。
4.源程序://1)T estView.hclass CTestV iew : public CView{public:void DrawCharPolygon();int Factorial(int m);double Cnk(const int &n, const int &i);void DrawBezier();protected:bool Flag;//标志CPoint *pt;//顶点int CtrlPoint;//控制多边形顶点……..}2) //T estView.cpp#include "math.h"//数学头文件#define N_MAX_POINT 10//控制多边形的最大顶点数#define ROUND(a) int(a+0.5) //四舍五入。
CT estView::CT estView(){Flag=false;}void CT estView::OnMENUBezierCurve(){// TODO: Add your command handler code hereRedrawWindow();AfxGetMainWnd()->SetWindowText("三次Bezier曲线");//显示标题MessageBox("单击左键绘制控制多边形,单击右键绘制曲线","提示",MB_OK);pt=new CPoint[N_MAX_POINT];Flag=true;CtrlPoint=0;}void CT estView::DrawBezier()//绘制Bezier曲线{CClientDC dc(this);double x,y;int rate=800,n;n=CtrlPoint-1;for(double t=0;t<=1;t+=1.0/rate){x=0;y=0;for(int i=0;i<=n;i++){x+=pt[i].x*Cnk(n,i)*pow(t,i)*pow(1-t,n-i);y+=pt[i].y*Cnk(n,i)*pow(t,i)*pow(1-t,n-i);}dc.SetPixel(ROUND(x),ROUND(y),RGB(0,0,255));//曲线颜色}}double CT estView::Cnk(const int &n, const int &i)//Bernstein第一项{return double(Factorial(n)/(Factorial(i)*Factorial(n-i)));}int CT estView::Factorial(int m)//阶乘函数{int f=1;for(int i=1;i<=m;i++)f*=i;return f;}void CT estView::DrawCharPolygon()//绘制控制多边形{CClientDC dc(this);CPen MyPen,*pOldPen;MyPen.CreatePen(PS_SOLID,3,RGB(0,0,0));//控制多边形pOldPen=dc.SelectObject(&MyPen);for(int i=0;i<CtrlPoint;i++){if(i==0){dc.MoveTo(pt[i]);dc.Ellipse(pt[i].x-2,pt[i].y-2,pt[i].x+2,pt[i].y+2);}else{dc.LineTo(pt[i]);dc.Ellipse(pt[i].x-2,pt[i].y-2,pt[i].x+2,pt[i].y+2);}}dc.SelectObject(pOldPen);MyPen.DeleteObject();}void CT estView::OnLButtonDown(UINT nFlags, CPoint point)//获得屏幕控制点坐标{// TODO: Add your message handler code here and/or call defaultCView::OnLButtonDown(nFlags, point);if(Flag){pt[CtrlPoint].x=point.x;pt[CtrlPoint].y=point.y;if(CtrlPoint<N_MAX_POINT)CtrlPoint++;elseFlag=false;DrawCharPolygon();}}void CT estView::OnRButtonDown(UINT nFlags, CPoint point)//调用绘制函数{// TODO: Add your message handler code here and/or call defaultFlag=false;DrawBezier();CView::OnRButtonDown(nFlags, point);}5.运行结果:(屏幕截图)。
ppt如何绘制自由曲线怎样在ppt中绘制自由曲线呢?下面店铺就为你提供ppt如何绘制自由曲线的方法啦!ppt绘制自由曲线的方法:打开ppt,内容版式——空白,自选图形——线条——直线。
按住shift键拖动鼠标画出一条水平线,右键点击线条,编辑顶点。
2右键点击左边的端点,选择角部顶点。
3这时出现了一条蓝色线条,蓝色线条的一段连接直线左边的端点,一段是黑色边框、内部白色的正方形为端点,鼠标单击该正方形不松手,向右下方向拖动。
由于下面多次要说线条,我们这里说蓝色调节的线叫调节线,这里的线条是指原本我画的那个直线。
4同样,对线条右边的端点进行角度顶点编辑,如下图,左上方向拖动。
我们得到一条曲线。
5下图中我们对调节线拖动,在我们没有松手的时候,存在着红色直点线,还有一条红色的曲点线。
红色直点线表示这时我们松开鼠标后,调节线所要变化到的位置,也就说是所蓝色的调节线将要被我们调节到此处,红色曲点线表示线条被我们所调节后的形状,当我们看到线条的效果满意时就可以松开鼠标。
6如下图,一样是在调节线条的左边端点,蓝色调节线向左水平拉伸,左边弧度的中心向左超越了线条的左端点,红色的调节线向右水平拉伸,红色的曲线表示了原本左边的弧度。
7换个方法来做一下,画一条直线,倾斜度跨垂直三个网格,如红色箭头所示,右键单击线条,编辑顶点,在红色圆圈内(也就是线条中心)右键添加顶点。
调节好弧度,这时应该注意到线条的两端,弧度不协调。
试着调整线条的端点,使它整体协调,尽量的把调节线缩短,并向着线条拖动。
选中线条,ctrl+d进行复制,多按几次。
使用wps的朋友,ctrl+c复制,然后连续按ctrl+v。
撤销返回一步,顶端对齐的效果如图:在下图中,我们先把白色正方形拖动到一条竖立的网格线上,松开鼠标,然后继续拖动该端点,沿着该网格线向下平滑,注意保证我们既没有向左偏离也没有向右偏移,我们看到左边弧度中心向下移动了,但是中心的水平位置和原来的保持一致。
空中手绘:一种三维自由曲线绘制方法
鲁鹏;陈毅松;陈文广
【期刊名称】《计算机应用研究》
【年(卷),期】2010(027)009
【摘要】针对虚拟现实环境下,触力觉设备在进行三维自由曲线绘制时其导线物理连接影响绘制过程的问题,提出了一种基于立体视觉的三维自由曲线绘制方法.通过立体视觉技术以非接触的方式跟踪设计人员的空间绘制过程,将其转换为一系列离散的三维空间点,再通过B3样条拟合方法将离散的三维空间点拟合为三维曲线.实验结果表明,提出的方法能够直接捕捉设计人员的绘制意图,并快速将其转换为三维自由曲线.
【总页数】3页(P3558-3560)
【作者】鲁鹏;陈毅松;陈文广
【作者单位】北京大学,机器感知与智能教育部重点实验室,北京,100871;北京大学,机器感知与智能教育部重点实验室,北京,100871;北京大学,机器感知与智能教育部重点实验室,北京,100871
【正文语种】中文
【中图分类】TP391
【相关文献】
1.一种自由臂三维超声任意切面重建方法 [J], 王庆浩;孙丰荣;王丽梅;王文明;姚桂华;张运
2.一种基于手绘的自由形体建模方法研究 [J], 赵娜;郭立;袁红星
3.一种基于手绘草图的三维建模方法研究 [J], 韩红波;王静秋;牛金玲
4.基于OpenGL的三维图形应用程序中的一种空间曲线绘制方法 [J], 田鑫;张方
5.一种基于LabWindows/CVI和OpenGL的六自由度机械手三维建模的方法 [J], 伍文伟;朱志杰;伍良伟
因版权原因,仅展示原文概要,查看原文内容请购买。