通过 Python + Python Imaging Library (PIL) 生成简单函数图像

 

#!/usr/bin/env python
#
coding=utf-8

#-------------------------------------------------------------------------------
#
 名 称:简单函数绘制类
#
 版 本:V0.1
#
 作 者:mapig (http://mapig.cnblogs.com QQ:33221979)
#
 功 能:生成简单函数图像 
#
 创 建:2009-05-18
#
 备 注:需要 Python Imaging Library (PIL)
#
-------------------------------------------------------------------------------

import math
import Image
import ImageDraw

class DrawFun():
    
#画布像素尺寸
    width  = 512
    height 
= 512
    
#X取值范围
    min    = -10
    max    
= 10
    
#X的步长值
    step   = 1
    
#X单位值像素
    unit   = 1
    
#画板对象
    canvas = None
    
#画笔对象
    draw   = None
    
#画布中心值偏移值
    ctrx = 0
    ctry 
= 0
    
    
def __init__(self, width, height, min, max, step, unit):
        
        self.width  
= width
        self.height 
= height
        self.min    
= min
        self.max    
= max
        self.step   
= step
        self.unit   
= unit
        
#创建画板对象
        self.canvas = Image.new("RGB", [self.width, self.height],(255,255,255))
        
#创建画笔对象
        self.draw   = ImageDraw.Draw(self.canvas)
        
#获取画布中心点
        self.ctrx = math.floor(self.width/2)
        self.ctry 
= math.floor(self.height/2)
        
#绘制中心轴线
        self.draw.line([(0,self.ctry),(self.width,self.ctry)],  fill =(0,0,0))
        self.draw.line([(self.ctrx,0),(self.ctrx,self.height)], fill 
=(0,0,0))
        
#显示单元格数 左右对称计算
        viewx = int(math.floor((self.width/self.unit  + 1)/2))
        viewy 
= int(math.floor((self.height/self.unit + 1)/2))
        
#绘制单元格
        for x in range(1,viewx+1):
            offsetx 
= x * self.unit
            self.draw.line([(self.ctrx 
+ offsetx,0),(self.ctrx + offsetx,self.height)], fill =(200,200,200))
            self.draw.line([(self.ctrx 
- offsetx,0),(self.ctrx - offsetx,self.height)], fill =(200,200,200))
        
for y in range(1,viewy+1):
            offsety 
= y * self.unit
            self.draw.line([(0,self.ctry 
+ offsety),(self.width,self.ctry + offsety)],  fill =(200,200,200))
            self.draw.line([(0,self.ctry 
- offsety),(self.width,self.ctry - offsety)],  fill =(200,200,200))
        
    
def paint(self, fun, color):
        
        
#结果点集
        aryPoint = []
        
#转换为1为步长
        min = int(math.floor(self.min/self.step))
        max 
= int(math.floor(self.max/self.step))
        
for i in range(min, max):
            
#实际函数值
            x = i * self.step
            y 
= fun(x)
            
#笛卡尔坐标系到屏幕坐标系
            #比例变换
            x = x * self.unit
            y 
= y * self.unit
            
#坐标变换
            curX = self.ctrx + x
            curY 
= self.ctry - y
            
#保存坐标到数组
            aryPoint.append((curX,curY))   
        
#绘制函数         
        self.draw.point(aryPoint,fill = color)   
    
    
#显示图片    
    def show(self):
        
#显示图片
        self.canvas.show()
    
#保存到JPG
    def saveToJPG(self, path):
        self.canvas.save(path,
"JPEG")
    
#保存到PNG
    def saveToPNG(self, path):
        self.canvas.save(path,
"PNG")


def sin(x):
    
return math.sin(x)
def cos(x):
    
return math.cos(x)
def tan(x):
    
return math.tan(x)

  
if __name__ == "__main__":
    
    
#DrawFun("画布宽度","画布高度","x最小值","x最大值","x步长值","x单位值像素大小")
    drawfun = DrawFun(512512-10100.00150)

    
#DrawFun.paint(f(x)函数,RGB颜色)
    drawfun.paint(sin,(255,0,0))
    drawfun.paint(cos,(0,
255,0))
    drawfun.paint(tan,(0,0,
255))
    
    
#显示函数图像
    drawfun.show()
    
    
#保存到图片
    drawfun.saveToJPG("demo.jpg")
    drawfun.saveToPNG(
"demo.png")

 

生成效果

 

posted @ 2009-05-18 17:46  mapig  阅读(1413)  评论(0编辑  收藏  举报