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 相关文章推荐
利用QT写一个极简单的图形化Python闹钟程序
Apr 07 Python
Python变量和字符串详解
Apr 29 Python
python中abs&amp;map&amp;reduce简介
Feb 20 Python
Tensorflow卷积神经网络实例进阶
May 24 Python
完美解决在oj中Python的循环输入问题
Jun 25 Python
Python socket套接字实现C/S模式远程命令执行功能案例
Jul 06 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
Python中Numpy ndarray的使用详解
May 24 Python
jupyter notebook 中输出pyecharts图实例
Apr 23 Python
Django 自定义权限管理系统详解(通过中间件认证)
Mar 11 Python
基于Python快速处理PDF表格数据
Jun 03 Python
MATLAB 全景图切割及盒图显示的实现步骤
May 14 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制作静态网站的模板框架
2006/10/09 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
python中列表和元组的区别
2017/12/18 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
基于Python测试程序是否有错误
2020/05/16 Python
基于python检查矩阵计算结果
2020/05/21 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
阿联酋航空丹麦官方网站:Emirates DK
2019/08/25 全球购物
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
门卫岗位安全职责
2013/12/13 职场文书
采购员的工作职责
2013/12/26 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
会计出纳岗位职责
2015/03/31 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
基于Python实现西西成语接龙小助手
2022/08/05 Golang