zoukankan      html  css  js  c++  java
  • 2.4 图形思维的起点——朴素的软光栅(1)

    提纲

      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算法

  • 相关阅读:
    Java线程
    腾讯2012.9.23校园招聘笔试题
    腾讯2011.10.15校园招聘笔试题
    腾讯2013年实习生笔试题目
    腾讯2012.4.25实习生招聘笔试题(2)
    腾讯2012.4.25实习生招聘笔试题
    优酷土豆2012.9.12校园招聘笔试题
    谷歌面试题:在半径为1的圆中随机选取一点
    Reservoir Sampling
    微软面试15道
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/15737099.html
Copyright © 2011-2022 走看看