以线段方式绘制曲线。例如:正弦曲线。
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
分享到:
相关推荐
用线段和小多边形近似绘制曲线和曲面要精确的 多,并且可以节省大量的存储空间和计算时间。 1 Bezier 曲线的数学描述 在空间给定n + 1 个点P0 , P1 , P2 ,. . . , Pn ,下 列参数曲线为n 次Bezier 曲线: P( u) = 6 n i...
使用opengl 绘制特殊bezier,并在曲线区域内填充纹理
贝塞尔曲线和曲面:OpenGL只能直接绘制基本图元,对于曲线和曲面我们一般采用一系列线段或多边形来模拟的,这样当线段或多边形增多时必定很耗性能。其实对于这种曲线和曲面,我们可以使用一些控制点,通过求值器程序...
在QT 框架下, 描画线段。 工作原理: 根据两点扩展成面,进行描画。
2.1.3 线段的绘制 2.1.4 多边形的绘制 2.1.5 规则三维物体绘制函数 2.1.6 实例介绍 2.2 曲线与曲面绘制 2.2.1 曲线的基本理论 2.2.2 样条曲线的绘制 2.2.3 样条曲面的绘制 2.2.4 NURBS曲线和曲面...
《交互式计算机图形学:基于OpenGL的自顶向下方法(第5版)(英文版)》覆盖了计算机图形学基础课程中的所有主题,包括光与材质的相互作用、明暗绘制、建模、曲线和曲面、反走样、光栅化、纹理映射和图像合成等内容。...
1.1实现绘制Bresenham直线 运用Bresenham算法,通过点绘制实现直线。...通过Bezier算法和三次B样条算法实现绘制曲线。 1.6画图 实现画直线,闭合多边形,填充多边形。 1.7清屏 清除控制台和颜色缓冲。
任何无规则的曲线实际上都是由若干条线段组成,而线段的定义为两点之间最短的一条线。path类就 可以记录这两点之间的轨迹,那么若干个Path 就是我们须要绘制的无规则曲线。 下面介绍一下API 中path类设置轨迹路径...
5.4.2 点与线段绘制方式 157 5.4.3 三角形条带与扇面绘制方式 159 5.4.4 顶点法与索引法 165 5.5 设置合理的视角 167 5.6 卷绕和背面剪裁 173 5.6.1 基本知识 173 5.6.2 一个简单的案例 174 ...
主要内容和课时分配 一图形系统综述2 课时 主要介绍视频显示设备 二基本图元的显示 1 画线算法2 课时 DDA 算法Bresenham 算法中点算法* ...2 2 圆生成算法1 课时 DDA 算法* 正负法* Bresenham 算法* ...十二OpenGL 与VRML*
北交《计算机图形学》在线作业(1)-参考资料全文共10页,当前为第1页。北交《计算机图形学》在线作业(1)-参考资料全文共10页,当前为第1页。... D 使用Freehand工具绘制的线段 12 下列关于Bezier曲线的性质,哪个是