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中的jquery PyQuery库使用小结
May 13 Python
Python中处理字符串之isalpha()方法的使用
May 18 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
Jun 13 Python
python常用库之NumPy和sklearn入门
Jul 11 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 Python
python 已知三条边求三角形的角度案例
Apr 12 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
Jul 07 Python
python实现发送带附件的邮件代码分享
Sep 22 Python
scrapy-splash简单使用详解
Feb 21 Python
深入理解Pytorch微调torchvision模型
Nov 11 Python
Python语言中的数据类型-序列
Feb 24 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
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
JavaScrip单线程引擎工作原理分析
2010/09/04 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
2010/12/28 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
Python的迭代器和生成器使用实例
2015/01/14 Python
python模块之StringIO使用示例
2015/04/08 Python
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
Python中scatter函数参数及用法详解
2017/11/08 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
flask框架中勾子函数的使用详解
2018/08/01 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
PyQt5 对图片进行缩放的实例
2019/06/18 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
django中间键重定向实例方法
2019/11/10 Python
python中复数的共轭复数知识点总结
2020/12/06 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
python基于openpyxl生成excel文件
2020/12/23 Python
优秀员工自荐书
2013/12/19 职场文书
小学教师节活动方案
2014/01/31 职场文书
《夕阳真美》教学反思
2014/04/27 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
民主评议党员总结
2014/10/20 职场文书
校本课程教学计划
2015/01/19 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
Golang 入门 之url 包
2022/05/04 Golang