Draw the letters A and B of English alphabet using multiple Bezier curves.
Solution:
Note: I am writing the code in python. Please make sure about proper indentation.
def make_bezier(xys):
# xys should be a sequence of 2-tuples (Bezier control points)
n=len(xys)
combinations=pascal_row(n-1)
def bezier(ts):
# This uses basic general formula for bezier curves
# http://en.wikipedia.org/wiki/B%C3%A9zier_curve#Generalization
result=[]
for t in ts:
tpowers=(t**i for i in range(n))
upowers=reversed([(1-t)**i for i in range(n)])
coefs=[c*a*b for c,a,b in zip(combinations,tpowers,upowers)]
result.append(
tuple(sum([coef*p for coef,p in zip(coefs,ps)]) for ps in zip(*xys)))
return result
return bezier
def pascal_row(n):
# This returns the nth row of Pascal's Triangle
result=[1]
x,numerator=1,n
for denominator in range(1,n//2+1):
# print(numerator,denominator,x)
x*=numerator
x/=denominator
result.append(x)
numerator-=1
if n&1==0:
# n is even
result.extend(reversed(result[:-1]))
else:
result.extend(reversed(result))
return result
import Image
import ImageDraw
if __name__=='__main__':
im = Image.new('RGBA', (100, 100), (0, 0, 0, 0))
draw = ImageDraw.Draw(im)
ts=[t/100.0 for t in range(101)]
xys=[(0,100),(25,50),(50,0)]
bezier=make_bezier(xys)
points=bezier(ts)
xys=[(50,0),(75,50),(100,100)]
bezier=make_bezier(xys)
points.extend(bezier(ts))
xys=[(100,100),(85,75),(75,50)]
bezier=make_bezier(xys)
points.extend(bezier(ts))
xys=[(75,50),(50,50),(25,50)]
bezier=make_bezier(xys)
points.extend(bezier(ts))
draw.polygon(points,fill=None,outline='red')
im.save('LetterA.png')
#letter B
im = Image.new('RGBA', (100, 100), (0, 0, 0, 0))
draw = ImageDraw.Draw(im)
ts=[t/100.0 for t in range(101)]
xys=[(0,0),(0,50),(0,100)]
bezier=make_bezier(xys)
points=bezier(ts)
xys=[(0,100),(100,100),(0,50)]
bezier=make_bezier(xys)
points.extend(bezier(ts))
draw.polygon(points,fill=None,outline='red')
im.save('LetterB.png')
Draw the letters A and B of English alphabet using multiple Bezier curves.