summaryrefslogtreecommitdiffstats
path: root/src/toys/py2geom_glue.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/toys/py2geom_glue.py')
-rw-r--r--src/toys/py2geom_glue.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/toys/py2geom_glue.py b/src/toys/py2geom_glue.py
new file mode 100644
index 0000000..fa2b5ae
--- /dev/null
+++ b/src/toys/py2geom_glue.py
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+
+def choose(n, k):
+ r = 1
+ for i in range(1, k+1):
+ r = (r*(n-k+i))/i
+ return r
+
+def W(n, j, k):
+ q = (n+1)/2.
+ if((n & 1) == 0 and j == q and k == q):
+ return 1
+ if(k > n-k):
+ return W(n, n-j, n-k)
+ assert((k <= q))
+ if(k >= q):
+ return 0
+ # assert(!(j >= n-k));
+ if(j >= n-k):
+ return 0
+ # assert(!(j < k));
+ if(j < k):
+ return 0
+ return float(choose(n-2*k-1, j-k)) / choose(n,j);
+
+# this produces a degree 2q bezier from a degree k sbasis
+def sbasis_to_bezier(B, q):
+ if(q == 0):
+ q = len(B)
+ n = q*2
+ result = [0.0 for i in range(n)]
+ if(q > len(B)):
+ q = len(B)
+ n -= 1
+ for k in range(q):
+ for j in range(n-k+1):
+ result[j] += (W(n, j, k)*B[k][0] +
+ W(n, n-j, k)*B[k][1])
+ return result
+
+def lerp(a, b, t):
+ return (1-t)*a + t*b