【OpenGL】画线算法
文章目录
- DDA数值微分线段算法
- 中点画线法(简)
- Bresenham画线算法
DDA数值微分线段算法
数值微分法即DDA法(Digital Differential Analyzer),是一种基于微分方程来生成直线的方法。在计算机图形学中,并没有线段的概念,而是一个个像素点组成了线段。
DDA法生成线段的步骤一般如下:
- 有了起始点(x1,y1)和终点(xn,yn);
- ▲x=|xn-x1|,▲y=|yn-y1|;
- 比较▲x和▲y的大小;
- steps=▲x和▲y中较大者;
- stepx=▲x/steps,stepy=▲y/steps。
DDA算法实现如下:
#include <GL/glut.h>
#include <math.h>void myDDA(GLfloat x1, GLfloat y1, GLfloat xn, GLfloat yn)
{float dx = fabs(xn - x1);float dy = fabs(yn - y1);float steps;if (dx > dy)steps = dx;elsesteps = dy;float stepX = dx / steps;float stepY = dy / steps;glBegin(GL_POINTS);for (int i = 0; i < (int)steps; i++){glVertex2f(x1, y1);x1 += stepX;y1 += stepY;}glEnd();
}void myDisplay()
{glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.87, 0.56, 0.4);glPointSize(3);myDDA(1.5, 3.8, 189.8, 267.5); //调用DDA,定义起点和终点glFlush();
}void init()
{glClearColor(1.0, 1.0, 1.0, 0.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0, 600, 0, 500); //可视的范围,类似鼠标滚轮的远近
}int main(int argc, char* argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(300, 100);glutInitWindowSize(600,500);glutCreateWindow("Test DDA");init();glutDisplayFunc(myDisplay); //传递需要勾画的函数glutMainLoop();return 0;
}
DDA画线算法的效果如下:
中点画线法(简)
看它位于中点的上边还是下边。
Bresenham画线算法
这种画线算法的思想和中点画线的一致,只是在判断取哪个点时,不是看它位于中点的上边还是下边,而是将这两个点与直线上对应点的距离进行比较,如果du>dl
,取下面的点,反之则取上面的点:
最后推出以下公式:
Bresenham算法步骤如下:
- 输入(x1,y1),(xn,yn)
- dx=xn-x1,dy=yn-y1
- 2dx,2dy
- p0=2dy-dx
- 循环,如果pk>0,选上面点;如果pk<0,选下面点
以上。
【OpenGL】画线算法相关推荐
- openGL实现中点画线算法、DDA画线算法,Bresenham画线算法,并进行鼠标键盘的交互
首先设置变量用于进行鼠标交互和键盘交互: int m = 0; GLdouble m1 =0, m2 = 0; 1.实验入口主函数: //主函数 int main(int argc, char** a ...
- DDA画线算法+代码详解-直线扫描算法之一
#DDA画线算法+代码详解-直线扫描算法之一 本文目录结构如下 1.直线扫描算法简介 2.DDA直线扫描算法 2.1 公式推理 1.求斜率K: 2.当|K| <= 1 时 3.当|K| > ...
- 计算机图形学学习笔记(4.1)画线算法
前言 现在的显示器都是像素点阵.但是图形在计算机中都用连续的线段或多边形等存储.因此在显示出来之前,要进行光栅化处理. 图形的光栅化(图形的扫描转换)分成两步: 1)根据图形的定义 在点阵单元上确定最 ...
- 图形学--(中点画线法+Bresenham画线算法)
编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color) 用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我 ...
- Bresenham画线算法笔记
目录 一.DDA算法和中点画线算法的回顾 二.Bresenham画线算法 一.DDA算法和中点画线算法的回顾 1.DDA算法(Digtal Differential Analyzer) 假设两个端点坐 ...
- Bresenham画线算法的推导
转自:https://www.cnblogs.com/soroman/archive/2006/07/27/509602.html 以前看到Bresenham画线算法,直接拿来用,没有去推导它,近日, ...
- 图形学画直线c语言,002计算机图形学之直线画线算法
002计算机图形学之直线画线算法 我们知道直线方程的斜截式是如下的样子: y = kx +b 在显示器上显示直线的话,如果使用如上的方程,每描一个点 需要进行一次浮点乘法,一次浮点加法,和取整操作. ...
- 计算机图形学--方法篇(DDA画线算法)
计算机图形学中所有的绘制算法都是用离散的点尽可能的去逼近理想的图形,本篇为大家介绍常见的几种画线算法. 首先啰嗦一下大家都懂得直线方程,假设有直线: x的增量,y的增量有这样的关系: 或 ...
- 【计算机图形学】扫面转换算法(DDA算法 中点画线算法 Bresenham画线算法)
模块1 扫描转换算法 一 实验目的 编写直线.弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨 用DDA算法.中点画线算法.Bresenham画线算法绘制直线(如果键盘输入数据,给出数据值:如果绘 ...
最新文章
- debian10 chrony简单配置
- mybaits trim用法
- 2021辽宁高考艺考成绩查询系统入口,2019年辽宁省艺考统考成绩查询官方入口
- RTOS原理与实现13(完):内核裁剪与移植
- 把握今生 不要期待来世
- 安装慢_python安装第三方库太慢,很容易失败报错?教你如何提速
- Tomcat实现Web Socket
- C++ 对Ctrl+Z的解释
- [.net 面向对象编程基础] (6) 基础中的基础——运算符和表达式
- 一树桃红,在生命的枝头葱茏
- 小米笔记本电脑的SN码如何查找?
- shell中的括号(小括号,大括号/花括号)的使用方法
- 历届试题 矩阵翻硬币 蓝桥杯 大数开方 大数相乘
- 震动效果调研 - iOS
- Kafka生产者优化方案
- 自动驾驶汽车中的激光雷达和摄像头传感器融合
- 软件测试面试:拿到一个版本(产品),如何开展测试?
- app前端图形验证码(全部代码)
- 机票分享第六篇 机票搜索系统演进的经验
- 全网最全!!满足你搜索文献的需求(附网站链接)