zoukankan      html  css  js  c++  java
  • 多边形的扫描转换算法的改进

    多边形的扫描转换算法的改进

    为了避免求交运算,需要引进一套 特殊的数据结构

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

    (2)结点内容(一个结点在数据结构里可用结构来表示)
    x: 当前扫描线与边的交点坐标
    △x: 从当前扫描线到下一条扫描线间x的增量
    ymax: 该边所交的最高扫描线的坐标值ymax

    随着扫描线的移动,扫描线与多边形的交点和上一次交点相关:
    △x=1/k

    另外,需要知道一条边何时不再与下一条扫描线相交,以便及时把它从有效边表中删除出去,避免下一步进行无谓的计算

    其中x为当前扫描线与边的交点,ymax是边所在的最大扫描线值,通过它可以知道何时才能“抛弃”该边,△x表示从当前扫描线到下一条扫描线之间的x增量即斜率的倒数。next为指向下一条边的指针

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

    1.首先构造一个纵向链表,链表的长度为多边形所占有的最大扫描线数

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

    -该边的ymax
    - 该边较低点的x坐标值xmin
    - 该边的斜率1/k
    - 指向下一条具有相同较低端y坐标的边的指针

    在这个表里只有1、3、5、7处有边,从y=1开始做,而在1这条线上有两条边进来了,然后就把这两条边放进活性边表来处理

    每做一次新的扫描线时,要对已有的边进行三个处理:

    1、是否被去除掉;
    2、如果不被去除,第二就要对它的数据进行更新。所谓更新数据就是要更新它的x值,即:x+1/k
    3、看有没有新的边进来,新的边在NET里,可以插入排序插进来。

    这个算法过程从来没有求交,这套数据结构使得你不用求交点!避免了求交运算。

    小结

    扫描线法可以实现已知任意多边形域边界的填充。该填 充算法是按扫描线的顺序,计算扫描线与待填充区域的 相交区间,再用要求的颜色显示这些区间的像素,即完 成填充工作

    为了提高算法效率:
    (1)增量的思想
    (2)连贯性思想
    (3)构建了一套特殊的数据结构

  • 相关阅读:
    mysql逻辑备份
    Configuring ProxySQL
    CSS伸缩布局
    溢出文字隐藏三种方式
    CSS过渡效果transition和动画
    伪元素before和after本质
    css滑动门技术
    字体图标iconfont
    CSS精灵技术(sprite)
    行内块和文字垂直对齐vertical-agign
  • 原文地址:https://www.cnblogs.com/cnblog-wuran/p/9704061.html
Copyright © 2011-2022 走看看