python扫描线填充算法详解


Posted in Python onFebruary 19, 2020

本文实例为大家分享了python扫描线填充算法,供大家参考,具体内容如下

介绍

1.用水平扫描线从上到下扫描由点线段构成的多段构成的多边形。

2.每根扫描线与多边形各边产生一系列交点。将这些交点按照x坐标进行分类,将分类后的交点成对取出,作为两个端点,以所填的色彩画水平直线。

3.多边形被扫描完毕后,填色也就完成。

python扫描线填充算法详解

数据结构

活性边表:

python扫描线填充算法详解

新边表:

python扫描线填充算法详解

代码(使用数组)

import numpy as np
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
 
array = np.ndarray((660, 660, 3), np.uint8)
array[:, :, 0] = 255
array[:, :, 1] = 255
array[:, :, 2] = 255
 
for i in range(0,660,1):
 array[i,330]=(0,0,0)
for j in range(0,660,1):
 array[330,j]=(0,0,0)
 
 
def creat_Net(point, row, y_min,y_max ): 
 Net = [([ ] * y_max ) for i in range(y_max )] 
 point_count = point.shape[0]
 for j in range(0, point_count): 
 x = np.zeros(10) 
 first = int(min(point[(j+1)%point_count][1] , point[j][1])) 
 x[1] = 1/((point[(j+1)%point_count][1]-point[j][1])/(point[(j+1)%point_count][0]-point[j][0])) # x 的增量
 x[2] = max(point[(j+1)%point_count][1] , point[j][1]) 
 if(point[(j+1)%point_count][1] < point[j][1]):
  x[0] = point[(j+1)%point_count][0] 
 else:
  x[0] = point[j][0] 
 Net[first].append(x) 
 return Net

def draw_line(i,x ,y ):
 for j in range(int(x),int(y)+1):
 array[330-i,j+330]=(20,20,20)
 

def polygon_fill(point):
 y_min = np.min(point[:,1])
 y_max = np.max(point[:,1]) 
 Net = creat_Net(point, y_max - y_min + 1, y_min, y_max) 
 x_sort = [] * 3
 for i in range(y_min, y_max): 
 x = Net[i]
 if(len(x) != 0): 
  for k in x :
  x_sort.append(k) 
 x_image = [] * 3 
 for cell in x_sort:
  x_image.append(cell[0])
 x_image.sort()
 if(len(x_image) >= 3 and x_image[0]==x_image[1] and x_image[2]>x_image[1]):
  x_image[1] = x_image[2] 
 draw_line(i, x_image[0], x_image[1])
 
 linshi = [] * 3 
 for cell in x_sort:
  if cell[2] > i: 
  cell[0] += cell[1]
  linshi.append(cell)  
 x_sort = linshi[:] 

 x_image = [] * 3 
 for cell in x_sort:
 x_image.append(cell[0])
 x_image.sort()
 
 draw_line(i, x_image[0],x_image[1]) 

def main(): 
 point = [[55,40], [100,80], [100,160],[55,180], [10,160], [10,80]]
 point = np.array(point) 
 polygon_fill( point )
 image = Image.fromarray(array)
 image.save('saomao.jpg')
 image.show() 

if __name__ == "__main__":
 main()

实例:

python扫描线填充算法详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
编程语言Python的发展史
Sep 26 Python
操作Windows注册表的简单的Python程序制作教程
Apr 07 Python
Python编程中的文件操作攻略
Oct 16 Python
带你了解python装饰器
Jun 15 Python
Python内存管理方式和垃圾回收算法解析
Nov 11 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
python中with用法讲解
Feb 07 Python
Python函数基本使用原理详解
Mar 19 Python
python爬虫要用到的库总结
Jul 28 Python
Selenium alert 弹窗处理的示例代码
Aug 06 Python
Python爬取某平台短视频的方法
Feb 08 Python
Python关于__name__属性的含义和作用详解
Feb 19 #Python
opencv+python实现均值滤波
Feb 19 #Python
python手写均值滤波
Feb 19 #Python
pytorch实现CNN卷积神经网络
Feb 19 #Python
python+opencv3生成一个自定义纯色图教程
Feb 19 #Python
Python 实现Image和Ndarray互相转换
Feb 19 #Python
python3+opencv生成不规则黑白mask实例
Feb 19 #Python
You might like
PHP在Web开发领域的优势
2006/10/09 PHP
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
JS打印组合功能
2016/08/04 Javascript
@ResponseBody 和 @RequestBody 注解的区别
2017/03/08 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
基于vuex实现购物车功能
2021/01/10 Vue.js
理解python多线程(python多线程简明教程)
2014/06/09 Python
python中global用法实例分析
2015/04/30 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
Python中存取文件的4种不同操作
2018/07/02 Python
利用Python实现kNN算法的代码
2019/08/16 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
META-INF文件夹中的MANIFEST.MF的作用
2016/06/21 面试题
护士毕业生自荐信
2014/02/07 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
见习报告怎么写
2014/10/31 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL