37,719
社区成员
发帖
与我相关
我的任务
分享
# -*- coding: gbk -*-
import Image
import ImageDraw
from math import sin, cos, pi
class MyDraw(ImageDraw.ImageDraw):
def __init__(self, im, mode=None):
ImageDraw.ImageDraw.__init__(self, im, mode=mode)
def isotriangle(self, xy, r, a=270, b=60, outline=None, fill=None):
x, y = xy
# a: 顶点方向,默认朝上,按x轴逆时针算是270度
# b: 顶点角度,默认60度即是等边三角
a, b = a*pi/180, b*pi/180 # 角度转弧度
x1, y1 = x+cos(a)*r, y+sin(a)*r
x2, y2 = x+cos(pi+a-b)*r, y+sin(pi+a-b)*r
x3, y3 = x+cos(pi+a+b)*r, y+sin(pi+a+b)*r
self.polygon((x1, y1, x2, y2, x3, y3), outline=outline, fill=fill)
@staticmethod
def Draw(im, mode=None):
try:
return im.getdraw(mode)
except AttributeError:
return MyDraw(im, mode)
im = Image.new('RGB', (640, 480), 'white')
draw = MyDraw.Draw(im)
clrs = ['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple']
for i in range(0, 120, 10):
draw.isotriangle((160, 150), 100, i, outline=clrs[i%7])
draw.isotriangle((480, 150), 100, i, fill=clrs[i%7])
draw.ellipse((60, 50, 260, 250), outline='red')
def generator(xy, r, n):
yield xy, r/2., n
r /= 2.
n -= 1
if n:
x, y = xy
xy = (x, y-r)
for ret in generator(xy, r, n):
yield ret
xy = (x-3.**.5*r/2, y+r/2)
for ret in generator(xy, r, n):
yield ret
xy = (x+3.**.5*r/2, y+r/2)
for ret in generator(xy, r, n):
yield ret
for xy, r, n in generator((160, 400), 120, 4):
draw.isotriangle(xy, r, 90, fill=clrs[n%7])
draw.isotriangle((160, 400), 120, outline='green')
draw.isotriangle((400, 360), 30, outline='red')
draw.ellipse((370, 330, 430, 390), outline='black')
draw.isotriangle((480, 360), 30, 45, fill='green')
draw.ellipse((450, 330, 510, 390), outline='black')
draw.isotriangle((560, 360), 30, 0, outline='blue', fill='orange')
draw.ellipse((530, 330, 590, 390), outline='black')
im.show()