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实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
Django发送html邮件的方法
May 26 Python
python实现彩色图转换成灰度图
Jan 15 Python
Python+OpenCV图片局部区域像素值处理改进版详解
Jan 23 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
Feb 14 Python
Python地图绘制实操详解
Mar 04 Python
20行python代码实现人脸识别
May 05 Python
scrapy-redis源码分析之发送POST请求详解
May 15 Python
python 将日期戳(五位数时间)转换为标准时间
Jul 11 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 Python
python 实用工具状态机transitions
Nov 21 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和ACCESS写聊天室(五)
2006/10/09 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
php获取URL中带#号等特殊符号参数的解决方法
2014/09/02 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
javascript延时重复执行函数 lLoopRun.js
2007/06/29 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
javascript+jQuery实现360开机时间显示效果
2017/11/03 jQuery
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
vue-star评星组件开发实例
2018/03/01 Javascript
js根据json数据中的某一个属性来给数据分组的方法
2018/10/08 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
python中迭代器(iterator)用法实例分析
2015/04/29 Python
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
Python实现解析Bit Torrent种子文件内容的方法
2017/08/29 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
python 读取文件并替换字段的实例
2018/07/12 Python
pytorch 固定部分参数训练的方法
2019/08/17 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
班级学习计划书
2014/04/27 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
校园运动会广播稿
2015/08/19 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL