以线段方式绘制曲线。例如:正弦曲线。
glBegin(GL_LINE_STRIP);
for(i=0;i<POINTNUM;i++)
{
glVertex2f(XSTART+i*XSTEP*XSCALE, YSTART+sin(i*XSTEP)*XSCALE);
}
glEnd();
说明:XSTEP是横坐标点的间隔。XSCALE是为了适应屏幕大小,将图形放大。XSTART,YSTART是将曲线起点移动到左下角。
附:源码
///////////////////////////// 主程序 ///////////////////////////
// 等价无穷小的曲线绘制
#include "stdafx.h"
#include "windows.h"
#include "gl/gl.h"
#include "gl/glu.h"
#include "gl/glaux.h"
#include "conio.h"
#include "math.h"
#include "math01.h"
#define XSTEP (3.14/40)
#define POINTNUM 30
#define XSCALE 10
#define XSTART -10
#define YSTART -10
void DrawPoint2(GLfloat x, GLfloat y);
void CALLBACK myReshape(GLsizei w,GLsizei h);
void CALLBACK display(void);
int main(int argc, char* argv[])
{
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow("simple");
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
auxReshapeFunc(myReshape);
auxMainLoop(display);
return 0;
}
void DrawPoint2(GLfloat x, GLfloat y)
{
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
void CALLBACK myReshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-15,15,-15*(GLfloat)h/(GLfloat)w,
15*(GLfloat)h/(GLfloat)w,-10.0,10.0);
else
glOrtho(-15*(GLfloat)h/(GLfloat)w,
15*(GLfloat)h/(GLfloat)w,-15,15,-10.0,10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void CALLBACK display(void)
{
int i;
glColor3f(0.0,0.1,0.0);
glRectf(-14,-14,14,14);
// 两条坐标
glColor3f(0.0,1.0,0.0);
for(i=0;i<POINTNUM;i++)
{
DrawPoint2(YSTART+i*XSTEP*XSCALE, XSTART);
}
for(i=0;i<POINTNUM;i++)
{
DrawPoint2(XSTART,YSTART+i*XSTEP*XSCALE);
}
//sin
glBegin(GL_LINE_STRIP);
glColor3f(1.0,0.0,0.0);
for(i=0;i<POINTNUM;i++)
{
glVertex2f(XSTART+i*XSTEP*XSCALE,
YSTART+sin(i*XSTEP)*XSCALE);
}
glEnd();
//y=x
glBegin(GL_LINE_STRIP);
glColor3f(1.0,1.0,0.0);
for(i=0;i<POINTNUM;i++)
{
glVertex2f(XSTART+i*XSTEP*XSCALE,
YSTART+(i*XSTEP)*XSCALE);
}
glEnd();
//y=e(x)
glBegin(GL_LINE_STRIP);
glColor3f(1.0,0.0,0.5);
for(i=0;i<POINTNUM;i++)
{
glVertex2f(XSTART+i*XSTEP*XSCALE,
YSTART+(E_Exp(i*XSTEP)-1)*XSCALE);
}
glEnd();
glFlush();
}
///////////////////////////// 头文件 /////////////////////
//math01.h
//数学计算公式
#ifndef MYMATH01_H
#define MYMATH01_H
//x的n次方
float Mul(float x,int n);
int Jie(int n);
float E_Exp(float x);
float Mul(float x,int n)
{
int i=0;
float k=1;
if(0==n)
return 1;
for(i=0;i<n;i++)
{
k*=x;
}
return k;
}
//n的阶乘
int Jie(int n)
{
int k=1;
if(0==n)
return 1;
for(;n>0;n--)
{
k*=n;
}
return k;
}
//e的x次方 麦克劳林级数,没有余项
float E_Exp(float x)
{
int i;
float sum=0;
for(i=0;i<20;i++)
{
sum+=Mul(x,i)/Jie(i);
}
return sum;
}
#endif
分享到:
相关推荐
3. **图元绘制**:OpenGL提供了基本的图元绘制函数,如`glDrawArrays`和`glDrawElements`,它们可以用来连接一系列顶点形成线段,通过合理设置顶点顺序,可以组合出复杂的曲线形状。 4. **缓冲区对象**:为了高效地...
本项目是关于在C++ MFC(Microsoft Foundation Classes)环境中利用OpenGL来绘制Bezier曲线的实现。 Bezier曲线是计算机图形学中的一个重要概念,尤其在曲线设计和动画中广泛应用。它们是由Pierre Bézier于1962年...
总结来说,OpenGL参数曲线的绘制是利用数学公式和GPU的计算能力,通过参数化方法和线段插值来创建复杂形状,如椭圆。这个资源提供了一个适合新手学习的实例,通过实际操作可以加深对OpenGL图形编程的理解。
### 基于OpenGL实现曲线_曲面的绘制 #### 1. Bezier 曲线的数学描述 在计算机图形学领域中,Bezier 曲线是一种常用的数学模型,用于描绘平滑的曲线和曲面。它能够精确地表示物体的外形,并创建其数学模型。相比于...
- 掌握如何使用OpenGL函数绘制Bezier曲线的方法。 3. **Bezier曲线的应用:** - 探索Bezier曲线在实际项目中的应用场景,如动画制作、UI设计等。 - 学习如何利用Bezier曲线进行路径规划和物体运动模拟。 #### ...
这里,`delta_t`决定了曲线细分的程度,越小则曲线绘制得越精确。 在动态绘制过程中,每次鼠标移动都会更新终点坐标,进而更新绘制的线段或曲线。同时,我们还需要确保在OpenGL上下文初始化时清除颜色缓冲区(`...
- GL_LINES:绘制线段。 - GL_POLYGON:绘制填充的简单多边形。 - GL_TRIANGLES:绘制填充的独立三角形。 - GL_QUADS:绘制填充的独立四边形。 - GL_LINE_STRIP:绘制不闭合的折线。 - GL_LINE_LOOP:绘制闭合的折线...
递归方法将四次Bezier曲线分解为两个三次Bezier曲线,然后继续分解,直到得到线段,再逐一绘制。De Casteljau算法则通过不断平分控制点来逼近曲线,同样适用于任何阶的Bezier曲线。本实验可能使用了其中的一种或两种...
以下是一个简单的Koch曲线绘制示例代码: ```cpp void KochCurve(float x1, float y1, float x2, float y2, int n) { if (n == 0) { glBegin(GL_LINES); glVertex2f(x1, y1); glVertex2f(x2, y2); glEnd(); } ...
绘制Bezier曲线通常采用De Casteljau算法,这是一种逐级分解的过程,将曲线分割成更简单的线段,直到得到足够的细分点,然后连接这些点即可画出曲线。该算法的优点是易于实现,并且避免了复杂数值计算。 接着,我们...
OpenGL中没有直接绘制Bezier和NURBS曲线和曲面的函数,但是可以通过glMap1()和glMap2()函数来定义参数映射,并使用glEvalCoord1()和glEvalCoord2()函数来评估曲线或曲面点的位置。 Bezier曲面是由多个Bezier曲线...
本教程将详细讲解如何在Visual Studio 2010环境中结合OpenGL库来绘制任意阶的Bezier曲线,并提供了一个交互式的用户界面供用户添加、移动和删除控制点。 首先,OpenGL是一个跨语言、跨平台的编程接口,用于渲染二...
"特殊曲线绘制长城贝塞尔曲线"这个主题涉及到一种利用数学算法来模拟复杂形状的技术,尤其是模仿中国古代建筑长城的蜿蜒形态。贝塞尔曲线是一种广泛应用的参数曲线,它能够以精确且灵活的方式创建平滑的曲线路径。 ...
使用opengl 绘制特殊bezier,并在曲线区域内填充纹理
4. **绘制线段**:在每次迭代后,使用`glBegin(GL_LINE_STRIP)`和`glEnd()`来定义线段,并用`glVertex2f()`或`glVertex3f()`指定线段上的顶点。颜色可以通过`glColor3f()`来设置,通常选择白色以模拟雪花。 5. **...
在IT领域,自定义曲线绘制是一项重要的技能,尤其在可视化设计和数据分析中。本文将深入探讨如何在VC++环境中进行自定义曲线绘制,并基于提供的"HistogramCtrl_demo"示例进行详细解析。 首先,"VC 曲线绘制"通常指...
更复杂的Bezier曲线是由多个线段通过逐次连接形成的,通常称为n阶Bezier曲线,其中n是控制点的数量减一。每个控制点影响曲线的形状,但曲线永远不会超出这些点构成的多边形边界。Bezier曲线的计算主要依赖于De ...
在探讨“Bezier 贝塞尔曲线 OpenGL”这一主题时,我们深入分析了如何利用OpenGL库在计算机图形学中实现贝塞尔曲线的绘制。贝塞尔曲线是一种广泛应用在矢量图形、字体设计以及三维建模中的数学曲线,其核心在于能够...
在OpenGL中绘制Koch曲线,我们需要理解基本的OpenGL绘图函数、顶点坐标系统以及分形理论。 首先,了解OpenGL的基础是至关重要的。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D和3D图形。它提供了一系列的函数...