`
hereson3
  • 浏览: 162920 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

OpenGL曲线绘制:线段

阅读更多

以线段方式绘制曲线。例如:正弦曲线。
 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

分享到:
评论

相关推荐

    OpenGl.rar_opengl_opengl 2d 曲线_opengl 曲线_opengl 绘制_opengl绘制曲线

    3. **图元绘制**:OpenGL提供了基本的图元绘制函数,如`glDrawArrays`和`glDrawElements`,它们可以用来连接一系列顶点形成线段,通过合理设置顶点顺序,可以组合出复杂的曲线形状。 4. **缓冲区对象**:为了高效地...

    利用opengl绘制的Bezier曲线

    本项目是关于在C++ MFC(Microsoft Foundation Classes)环境中利用OpenGL来绘制Bezier曲线的实现。 Bezier曲线是计算机图形学中的一个重要概念,尤其在曲线设计和动画中广泛应用。它们是由Pierre Bézier于1962年...

    OpenGL绘制参数曲线.rar_-baijiahao_OpenGL 曲线_Opengl 参数曲线_opengl 参数曲线的绘

    总结来说,OpenGL参数曲线的绘制是利用数学公式和GPU的计算能力,通过参数化方法和线段插值来创建复杂形状,如椭圆。这个资源提供了一个适合新手学习的实例,通过实际操作可以加深对OpenGL图形编程的理解。

    基于OpenGL实现曲线_曲面的绘制.pdf

    ### 基于OpenGL实现曲线_曲面的绘制 #### 1. Bezier 曲线的数学描述 在计算机图形学领域中,Bezier 曲线是一种常用的数学模型,用于描绘平滑的曲线和曲面。它能够精确地表示物体的外形,并创建其数学模型。相比于...

    OpenGL图形绘制.doc

    - 掌握如何使用OpenGL函数绘制Bezier曲线的方法。 3. **Bezier曲线的应用:** - 探索Bezier曲线在实际项目中的应用场景,如动画制作、UI设计等。 - 学习如何利用Bezier曲线进行路径规划和物体运动模拟。 #### ...

    opengl绘制直线和曲线

    这里,`delta_t`决定了曲线细分的程度,越小则曲线绘制得越精确。 在动态绘制过程中,每次鼠标移动都会更新终点坐标,进而更新绘制的线段或曲线。同时,我们还需要确保在OpenGL上下文初始化时清除颜色缓冲区(`...

    Opengl绘制点,线实验报告

    - GL_LINES:绘制线段。 - GL_POLYGON:绘制填充的简单多边形。 - GL_TRIANGLES:绘制填充的独立三角形。 - GL_QUADS:绘制填充的独立四边形。 - GL_LINE_STRIP:绘制不闭合的折线。 - GL_LINE_LOOP:绘制闭合的折线...

    基于OpenGL的描点绘制Bezier曲线

    递归方法将四次Bezier曲线分解为两个三次Bezier曲线,然后继续分解,直到得到线段,再逐一绘制。De Casteljau算法则通过不断平分控制点来逼近曲线,同样适用于任何阶的Bezier曲线。本实验可能使用了其中的一种或两种...

    opengl绘制实线虚线kock曲线C++利用OpenGL实现实线虚线点划线的绘制及kock曲线

    以下是一个简单的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曲线的绘制和b样条曲线的绘制

    绘制Bezier曲线通常采用De Casteljau算法,这是一种逐级分解的过程,将曲线分割成更简单的线段,直到得到足够的细分点,然后连接这些点即可画出曲线。该算法的优点是易于实现,并且避免了复杂数值计算。 接着,我们...

    在VC++中使用OpenGL绘制典型曲面

    OpenGL中没有直接绘制Bezier和NURBS曲线和曲面的函数,但是可以通过glMap1()和glMap2()函数来定义参数映射,并使用glEvalCoord1()和glEvalCoord2()函数来评估曲线或曲面点的位置。 Bezier曲面是由多个Bezier曲线...

    vs2010+openGL绘制任意阶Beizer

    本教程将详细讲解如何在Visual Studio 2010环境中结合OpenGL库来绘制任意阶的Bezier曲线,并提供了一个交互式的用户界面供用户添加、移动和删除控制点。 首先,OpenGL是一个跨语言、跨平台的编程接口,用于渲染二...

    特殊曲线绘制长城贝塞尔曲线

    "特殊曲线绘制长城贝塞尔曲线"这个主题涉及到一种利用数学算法来模拟复杂形状的技术,尤其是模仿中国古代建筑长城的蜿蜒形态。贝塞尔曲线是一种广泛应用的参数曲线,它能够以精确且灵活的方式创建平滑的曲线路径。 ...

    OpenGL 向bezier填充指定纹理

    使用opengl 绘制特殊bezier,并在曲线区域内填充纹理

    openGL 雪花曲线

    4. **绘制线段**:在每次迭代后,使用`glBegin(GL_LINE_STRIP)`和`glEnd()`来定义线段,并用`glVertex2f()`或`glVertex3f()`指定线段上的顶点。颜色可以通过`glColor3f()`来设置,通常选择白色以模拟雪花。 5. **...

    自定义曲线绘制

    在IT领域,自定义曲线绘制是一项重要的技能,尤其在可视化设计和数据分析中。本文将深入探讨如何在VC++环境中进行自定义曲线绘制,并基于提供的"HistogramCtrl_demo"示例进行详细解析。 首先,"VC 曲线绘制"通常指...

    Bezier曲线和B样条曲线绘制

    更复杂的Bezier曲线是由多个线段通过逐次连接形成的,通常称为n阶Bezier曲线,其中n是控制点的数量减一。每个控制点影响曲线的形状,但曲线永远不会超出这些点构成的多边形边界。Bezier曲线的计算主要依赖于De ...

    Bezier 贝塞尔曲线 OpenGL

    在探讨“Bezier 贝塞尔曲线 OpenGL”这一主题时,我们深入分析了如何利用OpenGL库在计算机图形学中实现贝塞尔曲线的绘制。贝塞尔曲线是一种广泛应用在矢量图形、字体设计以及三维建模中的数学曲线,其核心在于能够...

    利用OpgenGL绘制kock曲线

    在OpenGL中绘制Koch曲线,我们需要理解基本的OpenGL绘图函数、顶点坐标系统以及分形理论。 首先,了解OpenGL的基础是至关重要的。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D和3D图形。它提供了一系列的函数...

Global site tag (gtag.js) - Google Analytics