ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2.4 图形思维的起点——朴素的软光栅(1)

2021-12-27 17:35:31  阅读:193  来源: 互联网

标签:直线 float Bresenham 算法 dy DDA 光栅 朴素 2.4


提纲

  DDA算法

  中点的Bresenham算法

  改进的Bresenham算法

扫描转换的概念

 

 

 

 

 

 

光栅化指的就是输入图形的定义(比如三角形的定义,三个几何坐标以及属性信息:颜色光照纹理等),通过找到最佳逼近的像素点并且给像素指定合适的颜色值的过程。

GPU中有一个专门的光栅化阶段,通过硬件完成此过程。也可以在GPU着色之前,通过软件进行该过程,称为软光栅。

 

 

 

 

最基本的图形扫面转换方法

约定(为像素点建立坐标系)

输入点的坐标,输出点的像素位置

直线

高质量直线的要求(要直,端点要准确,即无定向性和断裂情况,亮度色泽均匀,画线的速度快,还能处理不同的线宽、颜色、线型)

直线扫描转换算法(逐点比较法、正负法、数值微分算法、Bresenham算法)

点和直线

DDA算法(数值微分法Digital Differential Analyzer)

一种直接从直线的微分方程生成直线的方法。

 

 

 

 

 最大位移方向

 斜率小于1或者斜率大于1

 

 

 

 最大位移方向的重要性:如果不分辨最大位移方向,始终在x方向递增1单位的步长,那么当斜率大于1时,会把直线画成离散的点。

 

 

 改进

计算像素点位置的最后一步本来四进行四舍五入,如果在原本坐标值上加上统一的0.5,再取整,可以简化计算。

 DDA直线生成算法(C语言)

void DDAline(int x0,int y0,int x1,int y1)
{
int dx,dy,eps1,k;
float x,y,xIncre,yIncre;
dx=x1-x0; dy=y1-y0;
x=x0; y=y0;
If (abs(dx)>abs(dy)) eps1=abs(dx);//最大位移方 向的判断
else eps1=abs(dy);
xIncre=(float)dx/(float)eps1;//x、y方向上 增量的计算
yIncre=(float)dy/(float)eps1;
for (k=0;k<=eps1;k++)
{
putpixel((int)(x+0.5),(int)(y+0.5));//在对应坐标处输出像素点
x+=xIncre;
y+=yIncre;
}
}

 

DDA直线算法特点

优点:DDA算法直观、易实现

缺点:有浮点数和浮点运算,效率不高

增量算法(效率不够高)

 

中点的Bresenham算法

 

基本原理

 

 

 

 

 

 

 

 

举例:

 用我自己的语言概括:斜率逐次累加,直到累加和大于阈值(初始是1/2),这时把累加和减1。

改进的Bresenham算法

 

 

标签:直线,float,Bresenham,算法,dy,DDA,光栅,朴素,2.4
来源: https://www.cnblogs.com/BoysCryToo/p/15737099.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有