多边形扫描算法

一、多边形的扫描转换

一、

1、定义:把多边形的顶点表示转化为点阵表示(就是已知多边形的边界,如何找到多边形内部的点,即把多边形内部填上颜色)

2、表示方法:顶点表示和点阵表示

3.顶点表示:是用多边形的顶点序列来表示多边形。

优点:这种表示直观、几何意义强。占内存少,易于进行几何变换。

缺点:没有明确指出哪些像素在多边形内,故不能直接用于面着色。

4、点阵表示:用位于多边形内的像素集合来刻画多边形

优点:是光栅显示系统显示时所需的表现形式

缺点:丢失了许多几何信息(如边界,顶点等)

5.多边形分类:

1>凸多边形:任意两点的连线均在多边形内

2>凹多边形:两顶点的连线有可能不在多边形内

3>含内环的多边形:多边形内包含多边形

多边形扫描算法对这三种多变形均应满足。

二、X-扫描线算法

1、基本思想:按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的像素,即完成填充工作。

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

3、算法步骤:

1>确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大的y值

2>从Ymin到Ymax,每次用一条扫描线进行填充

3>对一条扫描线进行填充可分为4个步骤:

A、求交:计算扫描线与多边形各边的交点

B、排序:把所有交点按递增顺序进行排序

C、交点配对:交点的个数应保证为偶数个

D、区间填色:把相交区间内的像素置成填充色

4、当扫描线与多边形顶点相交时,交点的取舍问题:

1>若共享顶点的两条边分别落在扫描线的两边,交点算一个

2>若共享顶点的两条边在扫描线的同一边,交点算零个或两个(检查若共享顶点的两条边的另外两个端点的y值,若在共享顶点的下方,则算0,在上方,则算2)

举例计算交点个数:

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

但是效率极低(求交计算量大,比如说有100个多边形,每个多边形有5条边,就要算100*5*768次求交运算)

所以尽量不求交!

三、改进的X-扫描线算法

1、从三方面考虑改进:

1>在处理扫描线时,仅对与它相交的多边形边(有效边)进行求交运算

2>考虑扫描线的连贯性:即当前扫描线与各边的交点顺序与下一条扫描线与各边的交点顺序相同或相似

3>考虑多边形的连贯性:即当某条边与当前扫描线相交时,它很可能也与下一条扫描线相交

为避免求交运算,引入一种数据结构:

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

(2)结点内容:

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

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

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

2、增量的值

△x=1/k(即从当前扫描线到下一条扫描线间x的增量为当前直线的斜率的倒数)

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

例如:

3.新边表

四、多边形扫描转换算法小结

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

为了提高算法效率:

1>增量的思想

2>连贯性思想

3>构建了一套特殊的数据结构

缺点:无法实现对未知边界的区间填充

原文地址:https://www.cnblogs.com/keguniang/p/9672098.html

时间: 2024-10-05 06:52:31

多边形扫描算法的相关文章

[计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(一)

一.首先说明: 这是啥? —— 这是利用C#FORM写的一个用来演示计算机图形学中 ①Bresenham直线扫描算法(即:连点成线):②种子填充法(即:填充多边形):③扫描线填充法 有啥用? ——  无论是连点成线还是区域填充在高级编程中基本上都提供很高效的库函数来调用.这里拿出这些算法一方面有利于大家理解那些封装的函数底层是实现:另一方面是方便嵌入式TFT屏幕底层驱动开发时借鉴的. 是啥样? ——  如下面的操作,不言而喻. 二.进入正题: 2-1.直线的扫描转换 图形的扫描转换实质就是在光栅

opengl实现直线扫描算法和区域填充算法

总体介绍 1.   使用线性扫描算法画一条线,线性离散点 2.   利用区域填充算法画多边形区域,区域离散的点 开发环境VS2012+OpenGL 开发平台 Intel core i5,Intel HD Graphics Family 设计思路 一.直线扫描算法 1.数值微分法(DDA) 已知过端点P0 (x0, y0), P1(x1, y1)的直线段L:y = kx + b,easy得知直线斜率为:k = (y1-y0)/(x1-x0).(如果x1≠x0). 我们如果|k|≤1,这样x每添加1

图像滤镜---图像扫描算法

常用的扫描算法有很多,这里根据ps的步骤给出一种自动实现方式: 1. 求灰度图像 2. 对灰度图进行反相 3.对反相后的灰度图进行高斯模糊 4.将步骤1和步骤4的结果进行混合,混合方式采用色彩减淡的方式,稍微说说,所谓的色彩减淡,是ps里面常见的图层混合方式,  用数学公式表示:Mix = min(A + (A X B)/(255 - B), 255),其中A是前景层,B是背景层,mix表示混合结果 此方法的缺点是,容易丢失细节信息. clear clc close all I=imread('

连通区域标记-行程扫描算法

1.连通域 对于一幅图像来说,它的基本组成单元是像素,每一个像素又对应一个灰度值. 联通区域标记针对的是二值图像,二值图像顾名思义就是它的灰度值只存在两种值---0或255的图像,一个连通区域指的是图像中那些位置相邻,灰度值相同的像素集合所组成的区域. 像素和像素之间的邻域关系有4邻域和8邻域,4邻域指的是当前像素的上下左右位置处的像素,8邻域是指上下左右和对角线位置处的像素. 如右图所示,分别对应的是像素的4邻域和8邻域位置关系   (x,y-1)   (x-1,y) (x,y) (x+1,y

POJ 2187 旋转卡壳 + 水平序 Graham 扫描算法

水平序 Graham 扫描算法: 计算二维凸包的时候可以用到,Graham 扫描算法有水平序和极角序两种. 极角序算法能一次确定整个凸包, 但是计算极角需要用到三角函数,速度较慢,精度较差,特殊情况较多. 水平序算法需要扫描两次,但排序简单,讨论简单,不易出错. [算法流程] 1.对顶点按x为第一关键字,y为第二关键字进行排序. 2.准备一个空栈,并将前两个点压入栈. 3.对于每一个顶点A,只要栈顶中还至少两个顶点,记栈顶为T,栈中第二个为U. 若UT(向量) * TA(向量) <= 0, 则将

多边形区域填充算法--递归种子填充算法

http://blog.csdn.net/orbit/article/details/7323090 平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界(也可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜色(也可能是图案填充).区域填充中最常用的是多边形填色,本文中我们就讨论几种多边形区域填充算法. 一.种子填充算法(Seed Filling) 如果要填充的区域是以图像元数据方式给出的,通常使用种子填充算法(Seed Fillin

【POJ 2187】 Beauty Contest (凸包-Graham扫描算法)

[POJ 2187] Beauty Contest (凸包-Graham扫描算法) 找平面最远点对 数据很大 用暴力会T..我感觉-- 扫描出个凸包 然后枚举凸包上的点即可 没坑 int也可过 注意重边跟共线就行 代码下附赠几组数据 代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include

hdu1115(多边形重心算法)

题目意思: 给出一个n边形的n个顶点,求出这个n边形的重心坐标. http://acm.hdu.edu.cn/showproblem.php?pid=1115 题目分析: /** *出处:http://blog.csdn.net/ysc504/article/details/8812339 *①质量集中在顶点上 *  n个顶点坐标为(xi,yi),质量为mi,则重心 * X = ∑( xi×mi ) / ∑mi * Y = ∑( yi×mi ) / ∑mi * 特殊地,若每个点的质量相同,则 *

点在多边形内算法,C#判断一个点是否在一个复杂多边形的内部

判断一点是否在不规则图像的内部算法,如下图是由一个个点组成的不规则图像,判断某一点是否在不规则矩形内部,先上效果图 算法实现如下,算法简单,亲试有效 public class PositionAlgorithmHelper { /// <summary> /// 判断当前位置是否在不规则形状里面 /// </summary> /// <param name="nvert">不规则形状的定点数</param> /// <param n