vc c语言扫描线填充算法,CC++实现图形学扫描线填充算法.pdf

C/C++实实现现图图形形学学扫扫描描线线填填充充算算法法

在上图形学课的时候,学习了扫描线填充算法。不过在完成实验的时候在真正理解了 算法,在此记录一下,如果有表达上的错

误,欢迎指正!

扫描线填充算法通过在与图形相交的第 (1,2 )、 (3,4 )... 边之间划线不断不断填充图形。因此,在扫描时就需要确定什么

时候与图形的某条边相交、划线的时候x 的范围是多少以及划线时是从哪个交点画至另一个交点。

结构体如下所示:

为了节省存储的空间,边表项也使用链表结构,将图形中ymin值相同的边链接在同一个边表项后,这样在扫描的时候方便添加

具体的流程如下:

一一、、初初始始化化活活动动边边表表

1. 统计并初始化表项

2. 将每条边分别链接在表项后

二二、、 绘绘制制与与填填充充

1. 取出当前与扫描线相交的边

① 取出ymin 大于当前扫描线的y值的边

② 删除ymax 小于等于当前扫描线的边 (①②过程可以排除掉与扫描线平行的边)

2. 将取出的边按照左右顺序排序 (根据边的最低点的坐标与直线的斜率判断)

3. 划线并直接在原结构上修改边的x值 (因为是在一个函数内,修改保存的值仅限于函数内,并不影响main函数中的值)

具体的代码如下所示,使用的库是EasyX (可以在http://www .easyx .cn/下载):

#include "graphics.h"

#include "stdio.h"

#include "conio.h"

#include

#include

#include

#include

using namespace std;

#define MAX_VO 20

//多边形的边的数据结构

typedef struct Edge

{

int y_max, y_min; // 有向边的y坐标的最大值与最小值

double x, deltax; // 有向边的x的最小值以及x的变化的量 (1/斜率)

struct Edge* next; //指向下一条边的指针

}Edge;

//活动边表表项

typedef struct TableItem

{

int curr_y; // 表项的y坐标值 ymin

Edge *firstNode; // 表项的首个节点,如果没有,NU

struct TableItem *next; //指向下一个活动边表表项的指针

}TableItem;

//活动边表结构体

typedef struct Table

{

TableItem *itemHeader; //活动边表的表项header

int item_count; //活动边表表项的个数

}ET;

class Point

{

private:

int x1, x2, y1, y2;

public:

Point(int x1, int y1, int x2, int y2)

{

this->x1 = x1;

this->x2 = x2;

this->y1 = y1;

this->y2 = y2;

}

//返回两个点之中的ymax

int YMax()

{

return (y1 > y2 ? y1 : y2);

}

//返回ymin

int YMin()

{

return (y1 < y2 ? y1 : y2);

}

//返回ymin 端点的x 值

int x()

{

return (y1 < y2 ? x1 : x2);

}

//返回直线的斜率,按照传入的参数的顺序

double KOf ine()

{

return ((y2 - y1)*1.0 / (x2 - x1));

}

};

class Solution

{

public:

//根据多边形初始化活动表

//参数 T 活动边表

//参数edges 用于初始化的边数组

//参数 edge_num 用于初始化的边的个数

void Init(ET &T, Edge *edges, int edge_num)

{

//初始化活动边表结构体

T.item_count = 0;

T.itemHeader = NU ;

int ymin

多边形的扫描线种子填充算法是一种常用的计算机图形学算法,它通过扫描线的方式,对多边形内部进行颜色填充。其基本流程如下: 1. 首先,对多边形的顶点按照纵坐标从小到大排序,得到若干个扫描线。 2. 遍历每条扫描线,找出扫描线与多边形交点的横坐标值,将这些交点按照横坐标从小到大排序。 3. 对于每一对相邻的交点,将它们之间的像素点进行颜色填充。 4. 如果多边形内部有洞,则需要先对外层多边形进行填充,再对内层多边形进行填充,以此类推。 在实现多边形的扫描线种子填充算法时,可以采用以下步骤: 1. 定义一个表示像素点颜色的数据结构。 2. 定义一个表示扫描线的数据结构,其中包括扫描线的纵坐标和与多边形的交点。 3. 对多边形的顶点按照纵坐标从小到大排序,并将排序后的顶点存储在一个数组中。 4. 遍历数组中相邻的顶点,计算出它们之间的扫描线,并将扫描线存储在一个链表中。 5. 对于每条扫描线,找出它与多边形的交点,并将交点按照横坐标从小到大排序。 6. 对于相邻的交点,计算它们之间的像素点,并将像素点的颜色设置为填充颜色。 7. 如果多边形内部有洞,则需要先对外层多边形进行填充,再对内层多边形进行填充,以此类推。 需要注意的是,在实现过程中,需要考虑到各种异常情况,如多边形边界上的像素点、多边形内部的孤立点等,以保证算法的正确性和鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值