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 修改文件指定行的方法
May 15 Python
python监控网卡流量并使用graphite绘图的示例
Apr 27 Python
Python用list或dict字段模式读取文件的方法
Jan 10 Python
老生常谈python的私有公有属性(必看篇)
Jun 09 Python
Python中判断输入是否为数字的实现代码
May 26 Python
Python subprocess模块常见用法分析
Jun 12 Python
Python hashlib模块用法实例分析
Jun 12 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
给 TensorFlow 变量进行赋值的方式
Feb 10 Python
Python pandas 列转行操作详解(类似hive中explode方法)
May 18 Python
python接口自动化之ConfigParser配置文件的使用详解
Aug 03 Python
分位数回归模型quantile regeression应用详解及示例教程
Nov 02 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数组函数序列之in_array() - 查找数组中是否存在指定值
2011/11/07 PHP
PHP过滤★等特殊符号的正则
2014/01/27 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
2014/12/24 PHP
全面解析PHP面向对象的三大特征
2017/06/10 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
ionic 自定义弹框效果
2017/06/27 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
详解React 在服务端渲染的实现
2017/11/16 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
微信小程序如何实现在线客服功能
2019/10/16 Javascript
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
Python实现队列的方法
2015/05/26 Python
Python删除windows垃圾文件的方法
2015/07/14 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
2019/04/16 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
优秀技术工人先进材料
2014/02/17 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
防卫过当辩护词
2015/05/21 职场文书
2015年档案室工作总结
2015/05/23 职场文书
2016公司新年问候语
2015/11/11 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
MySQL视图概念以及相关应用
2022/04/19 MySQL