扫描线填充算法,单链表实现
来源:互联网 发布:淘宝偏远地区有哪些 编辑:程序博客网 时间:2024/06/13 11:33
扫描线填充算法
typedef struct ET{ float x; float dx; float ymax; ET* next;}NET,AET;
建立NET表
//等间距且为i=1的扫描线 for (int i = 0; i < Ymax; i++) { //pNET[i] ->next = NULL; for (int j = 0; j < numofpoint; j++) { if (polypoint[j].y == i) { NET *rear = pNET[i]; //设置尾指针 if (polypoint[(j - 1 + numofpoint) % numofpoint].y>polypoint[j].y) { NET *p1 = new NET; p1->x = polypoint[j].x; // p1->dx = (polypoint[(j - 1 + numofpoint) % numofpoint].x - polypoint[j].x) / (polypoint[(j - 1 + numofpoint) % numofpoint].y - polypoint[j].y); p1->ymax = polypoint[(j - 1 + numofpoint)%numofpoint].y; //表头插入法 //p1->next = pNET[i]->next; //将将待插入的节点的后置节点指向头结点后的节点 //pNET[i]->next = p1; //将头结点的后置节点指向新节点,即新节点连到表头 //表尾插入法 rear->next = p1; //将新节点连到链尾 rear = p1; //尾指针后移 rear->next = NULL; //链表最后的尾节点的后继指针置空 } if (polypoint[(j + 1 + numofpoint) % numofpoint].y>polypoint[j].y) { NET *p2 = new NET; p2->x = polypoint[j].x; p2->dx = (polypoint[j].x - polypoint[(j + 1 + numofpoint) % numofpoint].x) / (polypoint[j].y - polypoint[(j + 1 + numofpoint) % numofpoint].y); p2->ymax = polypoint[(j + 1 + numofpoint) % numofpoint].y; //表头法 //p2->next = pNET[i]->next; //pNET[i]->next = p2; //表尾法 rear->next = p2; rear = p2; rear->next = NULL; } } } }
建立AET表
//标记NET的Ymin,并使得AET从这开始。 for (int i = 0; i <= Ymax; i++) { if (pNET[i]->next!=NULL) { Ymin = i; break; } } //NET转换为AET for (int i = Ymin; i <= Ymax; i++) { NET *np = pNET[i]->next; //AET* ap = new AET; //ap->next = NULL; //把NET表中y类结点非空的数据移入AET while (np) { AET *p = new AET; p->x = np->x; p->dx = np->dx; p->ymax = np->ymax; p->next = pAET[i]->next; pAET[i]->next= p; np = np->next; } //首先考虑是否有与多边形的新交点,通过前射线的x+dx判断。 AET *ap = pAET[i-1]->next; while (ap) { AET *p = new AET; p->x = ap->x + ap->dx; p->dx = ap->dx; p->ymax = ap->ymax; if (p->ymax == i) //当ymax == Y时,舍去这个点。因为每条边被看作下闭上开的 { delete p; } else { p->next = pAET[i]->next; pAET[i]->next = p; } ap = ap->next; }
AET表还未排序
AET* InsertSort(AET*& head){ if (head ==NULL) { return head; } AET* pmax = head; //第一次指向第二个元素 AET* work = head->next; while (work) { // 将work插入到head位置 if (work->x < head->x) { pmax->next = work->next; work->next = head; head = work; } else if (work->x == head->x) { if (work->dx < head->dx) { pmax->next = work->next; work->next = head; head = work; } } // 将数据插入到中间 else if (work->x > head->x && work->x < pmax->x) { AET* bg = head; AET* pre = NULL; while (bg && bg->x < work->x ) { pre = bg; bg = bg->next; } if (bg->x == work->x) { pre = bg; bg = bg->next; } pmax->next = work->next; work->next = bg; pre->next = work; } else pmax = work; //直接前移 work = pmax->next; } return head;}
【1】:维基百科介绍
【2】:
阅读全文
0 0
- 扫描线填充算法,单链表实现
- 扫描线填充算法
- 扫描线区域填充算法
- 扫描线填充算法类
- 扫描线种子填充算法
- 扫描线种子填充算法
- 图形学扫描线填充算法
- 二维区域扫描线填充算法的实现
- C语言实现的扫描线种子填充算法
- 扫描线多边形填充算法及其OpenGL实现
- 线性扫描+种子填充算法 实现区域填充
- 图形填充算法(扫描线种子填充算法)
- 扫描线-通用多边形填充算法
- 区域填充之扫描线算法
- 扫描线填充算法(1)
- 扫描线填充算法(2)
- 计算机图形学 - 扫描线种子填充算法
- 【寒江雪】扫描线区域填充算法
- 禁用浏览器滚动事件(不隐藏其滚动条)
- Python学习之re模块
- P1428 小鱼比可爱
- Python-list(3)
- 大概是史上最炫酷便捷的扫描仪……
- 扫描线填充算法,单链表实现
- Mac tar.gz方式安装、配置MySQL 5.7.18
- 设计模式C++实现(1)——工厂模式
- 去外包公司的伙伴们小心了!——亲身经历,数数外包公司的坑
- nginx的简单优化和反向代理
- 进程间通信----->共享内存
- 1等于0.循环9吗?
- 分享三个USB抓包软件---Bus Hound,USBlyzer 和-USBTrace
- Leetcode 303 Range Sum Query