OpenGL通过中点法绘制直线和圆

本文实例为大家分享了OpenGL绘制直线和圆的具体代码,供大家参考,具体内容如下

#include <gl/glut.h>
#include <math.h>

static int i=1;

void Initial(void)
{
 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);  //设置窗口背景颜色为白色
 glMatrixMode(GL_PROJECTION); //指定设置投影参数
 gluOrtho2D(-200.0,200.0,-200.0,200.0); //设置投影参数 //指的是视图范围,如果(0,200,0,200)的话就只能在第一象限显示,就1/4圆,第1,3的参数是左下角坐标,第2,4的参数是右上角坐标
}
/*void Display(void)
{
 glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口
 glColor3f(1.0f, 0.0f, 0.0f);   //设置当前的绘图颜色为红色
 glRectf(50.0f, 100.0f, 150.0f, 50.0f); //绘制一个矩形
    glFlush();       //处理所有的OpenGL程序
}
*/

void DDALine(int x0,int y0,int x1,int y1)
{
 //glVertex2f(10,10);
 int dx,dy,epsl,k;
 float x,y,xIncre,yIncre;
 dx = x1 - x0;
 dy = y1 - y0;
 x = x0;
 y = y0;

 if(abs(dx)>abs(dy))
 epsl=abs(dx);
 else
 epsl=abs(dy);

 xIncre=(float)dx/(float)epsl;
 yIncre=(float)dy/(float)epsl;
 glPointSize(2);
 glBegin(GL_POINTS);
 for(k = 0;k <= epsl; k++)
 {
 glColor3f(1.0f, 0.0f, 0.0f);
 glVertex2f(int(x+0.5),int(y+0.5));
 x += xIncre;
 y += yIncre;
 }
 glEnd();

}

void Mid_B(int x0,int y0,int x1,int y1)
{
 int dx,dy,d,UpIncre,DownIncre,x,y;
 if(x0 > x1)
 {
 x = x1;
 x1 = x0;
 x0 = x;
 y = y1;
 y1 = y0;
 y0 = y;
 }
 x = x0;
 y = y0;
 dx = x1 - x0;
 dy = y1 - y0;
 d = dx - 2*dy;
 UpIncre = 2*dx - 2*dy;
 DownIncre =- 2*dy;

 glPointSize(2);
 glBegin(GL_POINTS);
 while(x <= x1)
 {
 glColor3f(1.0f, 0.0f, 0.0f);
 glVertex2f(x,y);
 x++;
 if(d < 0)
 {
 y++;
 d += UpIncre;
 }
 else
 d += DownIncre;
 }
 glEnd();

}

void G_B(int x0,int y0,int x1,int y1)
{
 int x,y,dx,dy,e;
 dx = x1 - x0;
 dy = y1 - y0;
 e =- dx;
 x=x0;
 y=y0;

 glPointSize(2);
 glBegin(GL_POINTS);
 while(x <= x1)
 {
 glColor3f(1.0f, 0.0f, 0.0f);
 glVertex2f(x,y);
 x++;
 e = e + 2*dy;
 if(e > 0)
 {
 y++;
 e = e - 2*dx;
 }

 }
 glEnd();
}

void CirclePoint(int x, int y)
{
 glPointSize(2);
 glBegin(GL_POINTS);
 glColor3f(1.0f, 0.0f, 0.0f);
 glVertex2f(x,y);
 glVertex2f(y,x);
 glVertex2f(-y,x);
 glVertex2f(-x,y);
 glVertex2f(-x,-y);
 glVertex2f(-y,-x);
 glVertex2f(y,-x);
 glVertex2f(x,-y);
 glEnd();
}

void MidBresenhamCircle(int r)
{
 int x = 0, y = r, d = 1-r;
 //glPointSize(2);
 //glBegin(GL_POINTS);
 while(x <= y)
 {
 CirclePoint(x,y);

 if(d < 0)
  d += 2*x+3;
 else
 {
  d += 2*(x-y)+5;
  y--;
 }
 x++;
 }
 glEnd();
}

void ProcessMenu(int value)
{
 i = value;
 glutPostRedisplay();
}

void Display(void)
{
 glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口
 glViewport(0,0,400,400); //前两个参数改变原点坐标,后两个参数改变图形长宽(放大缩小)
 switch(i)
 {
 case 1:
 DDALine(2,3,55,83);
 break;
 case 2:
 Mid_B(2,3,55,83);
 break;
 case 3:
 G_B(2,3,55,83);
 break;
 case 4:
 MidBresenhamCircle(50);
 break;

 }
 glFlush();
}

int main(int argc, char* argv[])

{
 glutInit(&argc, argv);  //初始化GLUT库,处理命令行参数
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //初始化窗口的显示模式
 glutInitWindowSize(400,400);    //设置窗口的尺寸
 glutInitWindowPosition(100,100);  //设置窗口的位置
 glutCreateWindow("直线");     //创建一个名为矩形的窗口

 int MainMenu = glutCreateMenu(ProcessMenu); //创建主菜单
 glutAddMenuEntry("DDA算法",1);
 glutAddMenuEntry("中点Bresenham算法",2);
 glutAddMenuEntry("改进的Bresenham算法",3);
 glutAddMenuEntry("中点bresenham画圆",4);
 glutAttachMenu(GLUT_RIGHT_BUTTON); 

 glutDisplayFunc(Display);  //设置当前窗口的显示回调函数
 Initial();         //完成窗口初始化
 glutMainLoop();      //启动主GLUT事件处理循环
 return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • OpenGL实现中点划线法

    本文实例为大家分享了OpenGL实现中点划线法的具体代码,供大家参考,具体内容如下 #include "GL/glut.h" #include "stdio.h" #include "math.h" int xs, ys, xe, ye; void MidpointLine(int x0, int y0, int x1, int y1) { if((x0 != x1) && (y0 != y1)) { int a, b, delt

  • OpenGL通过中点法绘制直线和圆

    本文实例为大家分享了OpenGL绘制直线和圆的具体代码,供大家参考,具体内容如下 #include <gl/glut.h> #include <math.h> static int i=1; void Initial(void) { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置窗口背景颜色为白色 glMatrixMode(GL_PROJECTION); //指定设置投影参数 gluOrtho2D(-200.0,200.0,-200.0,200

  • python中Matplotlib绘制直线的实例代码

    说明 1.导入模块pyplot,并指定别名plt,以避免重复输入pyplot.模块化pyplot包含许多用于制作图表的功能. 2.将绘制的直线坐标传递给函数plot(). 3.通过函数plt.show()打开Matplotlib,显示所绘图形. 实例 import matplotlib.pyplot as plt #将(0,1)点和(2,4)连起来 plt.plot([0,2],[1,4]) plt.show() 相关实例扩展: 线型图 import matplotlib.pyplot as p

  • Python下opencv使用hough变换检测直线与圆

    在数字图像中,往往存在着一些特殊形状的几何图形,像检测马路边一条直线,检测人眼的圆形等等,有时我们需要把这些特定图形检测出来,hough变换就是这样一种检测的工具. Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等). 关于hough变换,核心以及难点就是关于就是有原始空间到参数空间的变换上.以直线检测为例,假设有一条直线L,

  • Android编程之canvas绘制各种图形(点,直线,弧,圆,椭圆,文字,矩形,多边形,曲线,圆角矩形)

    本文实例讲述了Android编程之canvas绘制各种图形的方法.分享给大家供大家参考,具体如下: 1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into

  • php使用gd2绘制基本图形示例(直线、圆、正方形)

    本文实例讲述了php使用gd2绘制基本图形.分享给大家供大家参考,具体如下: 应用GD2函数可以绘制的图形有多种,最基本的图形包括条.圆.方形等.无论开发人员绘制多么复杂的图形,都是在这些最基本的图形的基础上进行深化的,只有掌握了最基本的图形的绘制方法,才能绘制出各种具有独特风格的图形. 在GD2中可以分别应用imageline()函数.imagearc()函数和imagerectangle()函数绘制直线,圆形和方法. 下面将介绍这些函数的使用方法: bool imageline( resou

  • OpenGL中点Bresenham绘制直线算法

    本文实例为大家分享了OpenGL中点Bresenham绘制直线算法,供大家参考,具体内容如下 环境 macos xcode编译器 代码 #include <GLUT/GLUT.h> #include <iostream> #include<iostream> #include<cstdlib> #include<ctime> using namespace std; float wid = 400; //设置窗口的大小,约定窗口必须为正方形 fl

  • C++ OpenGL实现球形的绘制

    目录 1.封装Shader (1)为什么要封装Shader (2)如何使用 2.绘制球模型 (1)球面顶点遍历 (2)构造三角形图元 (3)开启线框模式 (4)开启面剔除 (5)最后 1.封装Shader (1)为什么要封装Shader 封装后,在应对存在对个着色器程序的渲染流程时,可以更方便使用不同的着色器程序,同时也可以降低代码冗余. (2)如何使用 如下,传入参数分别为顶点着色器和片元着色器的路径,在封装了Shader类之后,我们就可以通过一行代码去创建一个新的着色器对象: Shader

  • C#中GDI+绘制圆弧及圆角矩形等比缩放的绘制

    目录 理解圆弧绘制 从圆弧到绘制圆角长方体 如何实现等比缩放绘制圆角矩形 按固定比例计算缩放矩形的尝试(不推荐) 通过Inflate()方法缩放矩形 理解圆弧绘制 GDI+中对于圆弧的绘制,是以给定的长方形(System.Drawing.Rectangle 结构)为边界绘制的椭圆的一部分形成的圆弧.绘制的圆弧的中心为长方形内切椭圆的圆心(如果是正方形,则正方形的中心是内切圆的圆心) Graphics对象的DrawArc()方法用于绘制圆弧线段:GraphicsPath对象的AddArc()方法用

  • Android应用开发中View绘制的一些优化点解析

    一个通常的错误观念就是使用基本的布局结构(例如:LinearLayout.FrameLayout等)能够在大多数情况下    产生高效率 的布局. 显然,你的应用程序里添加的每一个控件和每一个布局都需要初始化.布局(layout).    绘制 (drawing).举例来说:嵌入一个LinearLayout会产生一个太深的布局层次.更严重的是,嵌入几个使    用 layout_weight属性的LinearLayout 将会导致大量的开销,因为每个子视图都需要被测量两次.这是反复解析    布

  • Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法示例

    本文实例讲述了Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法.分享给大家供大家参考,具体如下: 定义三角形 OpenGL 允许我们使用三维坐标来定义物体.在绘制三角形前,我们需要定义它各个点的坐标.我们一般使用数组来存储各个顶点的坐标. OpenGL ES 默认 [0,0,0] (X,Y,Z) 在GLSurfaceView的中心,[1,1,0]在右上角,[-1,-1,0]在左下角. 绘制三角形 在绘制三角形之前,我们必须告诉OpenGL我们正在使用

随机推荐