OpenGL中点Bresenham绘制直线算法

本文实例为大家分享了OpenGL中点Bresenham绘制直线算法,供大家参考,具体内容如下

环境

macos xcode编译器

代码

#include <GLUT/GLUT.h>
#include <iostream>
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
float wid = 400;  //设置窗口的大小,约定窗口必须为正方形
float height = wid; //设置窗口的大小
int numbers = 20; //设置划分的网格的个数
float t = wid/numbers; //模拟像素下的单位1
/*
 参数设置说明:
 输入直线的两点A(x1,y1);B(x2,y2)
 您应当确保参数范围在-400~400.且为整数。
 *支持不同斜率
 *支持两点位置颠倒
 */
int x1 = -300,y1=-400,x2 =400,y2 = 100;
void draw_point(float x, float y,int k_kind,int d_kind);
float translater(int x);
void swap(int &a, int &b)
{ int tmp = 0;
 tmp = b;
 b = a;
 a = tmp; }
void bresenham(int x1, int y1,int x2, int y2){
 /*
 函数说明:bresenham算法部分
 参数说明:与openGL已有的划线函数一样,要求用户提供的是点的起点(x1,y1)和终点(x2,y2)
 为了便于观察,我们会绘制原像素下的直线。
 这里的坐标要求是-1 ~ 1
 */
 int k_kind = 0; //k_kind用来表示斜率的类型。0是0~1;1是1~无穷;2是0~-1;3是负无穷~-1
 int d_kind =0; //d_kind用来表示dy正负的类型。
 if (x1 > x2) {
 swap(x1,x2);
 swap(y1,y2);
 }
 int dx = abs(x2-x1), dy = abs(y2-y1);
 if (y1 > y2) {//如果是向下的
 y1 = -y1;
 y2 = -y2;
 d_kind = 1;
 }
 if (dy > dx) { //斜率介于1~无穷的,将看作坐标系变换(这里将坐标变换)。
 swap(x1, y1);
 swap(x2,y2);
 swap(dx,dy);
 k_kind = 1;
 }
 float d = (dy +dy -dx)*t; //令d为决策量(这里利用d = dx*w*2避免浮点运算)
 float x = x1+0.0,y = y1+0.0;
 draw_point(translater(x),translater(y),k_kind,d_kind); //绘制下一个点
 while( x < x2){  //以x为步长
 if (d < 0){
  d += 2*dy*t;
 }
 else{
  d += 2*(dy-dx)*t;
  y += t; //说明应该画在上面那个位置
 }
 x= x + t;
 draw_point(translater(x),translater(y),k_kind,d_kind); //绘制下一个点
 }
}
float translater(int x){
 /*
 函数说明:将像素坐标下的坐标转化为openGL坐标
 参数说明:传入点像素坐标-wid-wid,返回-1~1坐标
 */
 return x/wid;
}
void draw_point(float x , float y, int k_kind,int d_kind){
 /*
 函数说明:绘制像素的点,这里将点的大小设置为7。
 颜色采用蓝色。
 参数说明:浮点数x,y是openGl坐标系。kind是指明斜率的类型
 */
 glPointSize(7);
 glColor3f(0.0,0.0,1.0);
 glBegin(GL_POINTS);
 cout <<"k:"<<k_kind<<"d:" << d_kind << endl;
 if(k_kind==0&&d_kind==1){
 y = -y;
 }else if (k_kind ==1 &&d_kind==1){
 x= -x;
 swap(x,y);
 }else if (k_kind==1&&d_kind ==0){
 swap(x,y);
 }
 glVertex3f(x,y,0.0);
 glEnd();
 glFlush();
}
void grid(){
 /*
 函数说明:绘制网格为了便于将真实的像素pixel转化为我们模拟的像素
 */
 glClearColor(0, 0, 0, 0);//这是设置背景色,必须要在glclear之前调用
 glClear(GL_COLOR_BUFFER_BIT);
 //画直线
 int wid_number = numbers;
 int hei_number = numbers;
 float delta_wid = wid / wid_number;
 float delta_hei = height / hei_number;
 glColor3f(1.0,1.0,0);
 for (int i = 1; i < 40 ; i ++ ) {
 glBegin(GL_LINES);
 glVertex2f(-1+i*delta_hei/height, -1);
 glVertex2f(-1+i*delta_hei/height, 1);
 glVertex2f(-1,-1+i*delta_hei/height);
 glVertex2f(1,-1+i*delta_hei/height);
 glEnd();
 glFlush();
 }
 glColor3f(1.0,0,0);
 glBegin(GL_LINES); //绘制坐标系,便于观察
 glVertex2f(-1,0);
 glVertex2f(1,0);
 glVertex2f(0,-1);
 glVertex2f(0,1);
 glEnd();
 glFlush();
 glBegin(GL_LINES);
 glColor3f(1.0,0.0,0.0);
 glVertex2f(translater(x1),translater(y1)); //定点坐标范围
 glVertex2f(translater(x2),translater(y2));
 glEnd();
 glFlush();
 //刷新缓冲,保证绘图命令能被执行
 bresenham(x1, y1,x2,y2);
}
int main(int argc, char *argv[]) {
 //初始化GLUT library
 glutInit(&argc, argv);
 //对窗口的大小进行初始化
 glutInitWindowSize(700,700);
 glutInitWindowPosition(300,200);
 // 设置窗口出现的位置
 //glutInitWindowPosition(int x, int y);
 glutInitDisplayMode(GLUT_RGBA);
 glutCreateWindow("class16_hw1");
 glutDisplayFunc(&grid);
 glutMainLoop();
 return 0;

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

(0)

相关推荐

  • Opencv Hough算法实现图片中直线检测

    本文实例为大家分享了Opencv Hough算法实现直线检测的具体代码,供大家参考,具体内容如下 (1)载入需检测的图及显示原图 Mat g_srcImage = imread("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\Q.jpg"); //图片所放路径 imshow("[原始图]", g_srcImage); (2)为显示不同的效果图而设置滑动条 namedWindow("[效果图]", 1);

  • 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

  • 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

  • C#使用GDI绘制直线的方法

    本文实例讲述了C#使用GDI绘制直线的方法.分享给大家供大家参考.具体实现方法如下: Point p1=new Point(200,200); Point p2=new Point(300,100); Pen p=new Pen(Color.Black); Graphics g = CreateGraphics(); g.DrawLine(p,p1,p2); 希望本文所述对大家的C#程序设计有所帮助.

  • VC++实现的OpenGL线性渐变色绘制操作示例

    本文实例讲述了VC++实现的OpenGL线性渐变色绘制操作.分享给大家供大家参考,具体如下: 用到的思路就是在应力的最大值和最小值之间划分区间,每个区间的标识点对应不同的颜色值. 然后在区间内的应力值对应的颜色就进行插值来计算. 代码如下: #include <GL/glut.h> #include <iostream> #include <cmath> using namespace std; const GLsizei width=640; const GLsize

  • python绘制直线的方法

    本文实例为大家分享了python绘制直线的具体代码,供大家参考,具体内容如下 #!/usr/bin/env python import vtk # 绘制通用方法 def myshow(linepolydata): # Now we'll look at it. lineMapper = vtk.vtkPolyDataMapper() if vtk.VTK_MAJOR_VERSION <= 5: lineMapper.SetInput(linepolydata) else: lineMapper.

  • 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

  • C语言使用Bresenham算法生成直线(easyx图形库)

    Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换方法. 其原理是:过各行.各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近的像素. Bresenham算法也是一种计算机图形学中常见的绘制直线的算法,其本质思想也是步进的思想,但由于避免了浮点运算,相当于DDA算法的一种改进算法. 源代码展示: #include<stdio.h> #include<graphics.h> #include<math

  • OpenGL绘制贝塞尔曲线

    本文实例为大家分享了OpenGL绘制贝塞尔曲线的具体代码,供大家参考,具体内容如下 最终效果图: 通过3个点形成一条贝塞尔曲线 1. 鼠标问题 在使用鼠标获取坐标的时候,要知道鼠标获取的坐标和屏幕坐标是不同的; openGL使用右手坐标 从左到右,x递增 从下到上,y递增 从远到近,z递增 而鼠标是从左到右增x,同时从上到下也是增y 所以在求 y 的时候,用(屏幕大小-y)来获取 2. 绘制 setpoint 用来绘制点 setline 用来绘制线 setBezier 用来绘制贝塞尔曲线 其中公

  • Python OpenCV Hough直线检测算法的原理实现

    目录 直线检测原理 OpenCV实现 直线检测原理 核心要点:图像坐标空间.参数空间.极坐标参数空间 -> (极坐标)参数空间表决 给定一个点,我们一般会写成y=ax+b的形式,这是坐标空间的写法:我们也可以写成b=-xa+y的形式,这是参数空间的写法.也就是说,给定一个点,那么经过该点的直线的参数必然满足b=-xa+y这一条件,也就是必然在参数空间中b=-xa+y这条直线上.如果给定两个点,那么这两点确定的唯一的直线的参数,就是参数空间中两条参数直线的交点. 由于上述写法不适合处理水平或垂直的

  • 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

随机推荐