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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#!/usr/bin/python
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), "..", "py2geom"))
from py2geom import *
import py2geom
import numpy
import random
from py2geom_glue import *
def poly_to_sbasis(p):
sb = SBasis()
s = numpy.poly1d([-1, 1, 0])
while True:
q,r = p / s
x = Linear(r[0],r[1]+r[0])
sb.append(x)
p = q
if len(list(p)) <= 1 and p[0] == 0:
return sb
def sbasis_to_poly(sb):
p = numpy.poly1d([0])
s = numpy.poly1d([-1, 1, 0])
sp = numpy.poly1d([1])
for sbt in sb:
p += sp*(sbt[0]*(numpy.poly1d([-1,1])) + sbt[1]*(numpy.poly1d([1,0])))
sp *= s
return p
random.seed(1)
trial = numpy.poly1d([random.randrange(0,10) for x in range(6)])
sb = poly_to_sbasis(trial)
pwsb = PiecewiseSBasis()
pwsb.push_seg(sb)
pwsb.push_cut(0)
pwsb.push_cut(1)
print pwsb.size()
print "invariants:", pwsb.invariants()
print pwsb(0)
def l2s(l):
sb = py2geom.SBasis()
sb.append(l)
return sb
X = l2s(py2geom.Linear(0, 1))
OmX = l2s(py2geom.Linear(1, 0))
def bezier_to_sbasis(handles, order):
print "b2s:", handles, order
if(order == 0):
return l2s(py2geom.Linear(handles[0]))
elif(order == 1):
return l2s(py2geom.Linear(handles[0], handles[1]))
else:
return (py2geom.multiply(OmX, bezier_to_sbasis(handles[:-1], order-1)) +
py2geom.multiply(X, bezier_to_sbasis(handles[1:], order-1)))
for bz in [[0,1,0], [0,1,2,3]]:
sb = bezier_to_sbasis(bz, len(bz)-1)
print bz
print sb
print sbasis_to_bezier(sb,0)
|