zoukankan      html  css  js  c++  java
  • CG-光栅图形学多边形扫描转换算法-学习笔记

    一、多边形扫描转换算法——X扫描线算法

    1. 背景

    1°  多边形的两种重要表示方法:顶点示和点阵表示;

    2° 光栅图形的一个基本问题就是把多边形的顶点表示转换成点阵表示。称为多边形的扫描转换

    2. 原理

    X-扫描线算法填充多边形的基本思想是按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的像素,即完成填充工作;区间的端点可以通过计算扫描线与多边形边界线的交点获得。 

      

     如扫描线y=3与多边形的便捷相交于4点:(2,3)、(4,3)、(7,3)、(9,3);

    这四点定义了扫描线上的区间(2,4)、(7,9),区间内像素应取填充色;

     算法核心:按X递增顺序排列交点的X坐标序列。

    3. 算法步骤

    1° 确定多边形所占有的最大扫描线书,得到多边形顶点的最小和最大Y值(ymin、ymax);

    2° 从y = ymin到y = ymax,每次用一条扫描线进行填充;

    3° 对一条扫描线填充的过程可分为四个步骤:

            a. 求交:计算扫描线与多边形各边的交点;

            b. 排序:把所有交点按递增顺序进行排序;

            c. 交点配对:第一个与第二个,第三个与第四个;

            d. 区间填色:把这些相交区间的像素置成不同于背景色的填充色;

    4. 交点取舍问题  ---->  交点的个数应保证为偶数个

    a. 若共享顶点的两条边分别落在扫描线的两边,交点只算一个;

    b. 若共享顶点的两条边在扫描线的同一边,这时交点作为零个两个

    【注意】检查共享顶点的两条边的另外两个两个端点的y值,按这个y值中大于交点y值的个数来决定交点数;(大于-->2、小于--->0)

    5. 求交

    为了计算每条扫描线与多边形的交点,最简单的方法是把多边形的所有边放在一个表中。在处理每条扫描线是,按顺序从表中取出所有的边,分别与扫描线求交;计算量非常大!!!

    二、多边形扫描转换算法——改进的X扫描线算法

     1. 引入特殊的数据结构

    1)活性边表(AET):把当前扫描线相交的边成为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中;

    2)结点内容(一个结点在数据结构里可用结构来表示)

                x:当前扫描线与边的交点坐标

                ∆x:从当前扫描线到下一条扫描线间x的增量        

                ymax:该边所交的最高扫描线的坐标值ymax

    3)新边表(NET):为了方便活性边表的建立与更新,用来存放多边形的边的信息

         a)首先构造一个纵向链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点,成为一个吊桶,对应多边形覆盖的每一条扫描线;

                                    ====》

        b)NET挂在与该边低端y值相同的线桶中。也就是说,存放在该扫描线第一次出现的边;

    数据结构内容:该边的ymax、该边较低点的x坐标值xmin,该边的斜率1/k、指向下一条具有相同较低端y坐标的边的指针;

    示例:

    2. 算法原理

    1° 随着扫描线的移动,扫描线与多边形的交点和上一次交点相关:

    设边的直线斜率为k:

    推导得:,即∆x = 1 / k;

    2° 需要知道一条边何时不再与下一条扫描线相交,以便及时把它从有效边表中删除出去,避免下一步进行无谓的计算;ymax是边所在的最大扫描线值,通过它可以知道何时才能“抛弃”该边。

    从上边这个NET表里就知道多边形是从哪里开始的:在这个表里只有1、3、5、7处有边,从y=1开始做,而在1这条线上有两条边进来了,然后就把这两条边放进活性边表来处理。

    3° 每一次更新,需要对已有的边进行三个处理:

         1)是否被去除掉;

         2)如果不被去除,第二就要对它的数据进行更新。所谓更新数据就是要更新它的x值,即x+1/k;

         3)看有没有新的边进来,新的边在NET里,可以插入排序插进来;

  • 相关阅读:
    struts2解决动态多文件上传的问题(上传文件与数据库字段一一对应)(转)
    Android应用如何开机自启动、自启动失败原因
    android操作ini工具类
    C++#define的用法(含特殊)
    c指针
    WP7备注(34)(UpdateSourceTrigger|ValidatesOnExceptions|NotifyOnValidationError)
    WP7备注(30)(数据绑定基本)
    WP7备注(38)(VisualStateManager)
    WP7备注(39)(ResourceDictionary)
    WP7备注(35)(Vector Graphics|Raster Graphics)
  • 原文地址:https://www.cnblogs.com/mzyan/p/9704008.html
Copyright © 2011-2022 走看看