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中xrange和range的区别
May 13 Python
python实现的jpg格式图片修复代码
Apr 21 Python
python实现求最长回文子串长度
Jan 22 Python
Python求一批字符串的最长公共前缀算法示例
Mar 02 Python
python自动化测试之如何解析excel文件
Jun 27 Python
Python Numpy 自然数填充数组的实现
Nov 28 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
简单了解django处理跨域请求最佳解决方案
Mar 25 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
Jun 02 Python
python 如何快速复制序列
Sep 07 Python
python中xlrd模块的使用详解
Feb 01 Python
python中最小二乘法详细讲解
Feb 19 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简单实现HTTP和HTTPS跨域共享session解决办法
2015/05/27 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
微信小程序http连接访问解决方案的示例
2018/11/05 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
Python实现将文本生成二维码的方法示例
2017/07/18 Python
python学习入门细节知识点
2018/03/29 Python
python创建文件备份的脚本
2018/09/11 Python
解决python 上传图片限制格式问题
2019/10/30 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
初中班主任评语
2014/04/24 职场文书
2015新年寄语大全
2014/12/08 职场文书
Python Pandas常用函数方法总结
2021/06/15 Python