-
Notifications
You must be signed in to change notification settings - Fork 1
/
bezier.py
33 lines (32 loc) · 1.06 KB
/
bezier.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def make_bezier(xys):
n=len(xys)
combinations=pascal_row(n-1)
def bezier(precision):
# This uses the generalized formula for bezier curves
# http://en.wikipedia.org/wiki/B%C3%A9zier_curve#Generalization
result=[]
for j in range(precision):
t = float(j) / (precision-1)
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