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)构建了一套特殊的数据结构

  • 相关阅读:
    jenkins 配置杂项优化
    Ansible终极速度优化之--- Mitogen Plugin
    jenkins基于Ansible自动发布/回滚/管理
    Jenkins Pipeline 参数详解
    jenkins pipeline 复杂的发布流程
    jenkins 更新插件使用代理
    pipeline 多个参数如何传入
    k8s-jenkins x CI/CD 动态创建slave---01
    k8s集群-node节点设置不可调度或者删除node节点
    Kubelet 证书如何自动续期
  • 原文地址:https://www.cnblogs.com/cnblog-wuran/p/9704061.html
Copyright © 2011-2022 走看看