diff --git a/Lib/cu2qu/__init__.py b/Lib/cu2qu/__init__.py index 8c72b79a3..25d4596a5 100644 --- a/Lib/cu2qu/__init__.py +++ b/Lib/cu2qu/__init__.py @@ -28,7 +28,7 @@ def calcCubicPoints(a, b, c, d): return _1, _2, _3, _4 def calcCubicParameters(pt1, pt2, pt3, pt4): - c = (pt2 -pt1) * 3.0 + c = (pt2 - pt1) * 3.0 b = (pt3 - pt2) * 3.0 - c d = pt1 a = pt4 - d - c - b @@ -37,13 +37,13 @@ def calcCubicParameters(pt1, pt2, pt3, pt4): def splitCubicIntoN(pt1, pt2, pt3, pt4, n): a, b, c, d = calcCubicParameters(pt1, pt2, pt3, pt4) segments = [] - dt = 1/n - delta_2 = dt*dt + dt = 1 / n + delta_2 = dt * dt delta_3 = dt * delta_2 for i in range(n): t1 = i * dt - t1_2 = t1*t1 - t1_3 = t1*t1_2 + t1_2 = t1 * t1 + t1_3 = t1 * t1_2 # calc new a, b, c and d a1 = a * delta_3 b1 = (3*a*t1 + b) * delta_2 @@ -53,19 +53,19 @@ def splitCubicIntoN(pt1, pt2, pt3, pt4, n): return segments def splitCubicIntoTwo(pt1, pt2, pt3, pt4): - mid = (pt1+3*(pt2+pt3)+pt4)*.125 - deriv3 = (pt4+pt3-pt2-pt1)*.125 - return ((pt1, (pt1+pt2)*.5, mid-deriv3, mid), - (mid, mid+deriv3, (pt3+pt4)*.5, pt4)) + mid = (pt1 + 3 * (pt2 + pt3) + pt4) * .125 + deriv3 = (pt4 + pt3 - pt2 - pt1) * .125 + return ((pt1, (pt1 + pt2) * .5, mid - deriv3, mid), + (mid, mid + deriv3, (pt3 + pt4) * .5, pt4)) def splitCubicIntoThree(pt1, pt2, pt3, pt4, _27=1/27): - mid1 = (pt1*8+pt2*12+pt3*6+pt4)*_27 - deriv1 = (pt4+pt3*3-pt1*4)*_27 - mid2 = (pt1+pt2*6+pt3*12+pt4*8)*_27 - deriv2 = (pt4*4-pt2*3-pt1)*_27 - return ((pt1, (pt1*2+pt2)/3, mid1-deriv1, mid1), - (mid1, mid1+deriv1, mid2-deriv2, mid2), - (mid2, mid2+deriv2, (pt3+pt4*2)/3, pt4)) + mid1 = (pt1*8 + pt2*12 + pt3*6 + pt4) * _27 + deriv1 = (pt4 + pt3*3 - pt1*4) * _27 + mid2 = (pt1 + pt2*6 + pt3*12 + pt4*8) * _27 + deriv2 = (pt4*4 - pt2*3 - pt1) * _27 + return ((pt1, (pt1*2 + pt2) / 3, mid1 - deriv1, mid1), + (mid1, mid1 + deriv1, mid2 - deriv2, mid2), + (mid2, mid2 + deriv2, (pt3 + pt4*2) / 3, pt4)) class Cu2QuError(Exception): @@ -81,16 +81,16 @@ class ApproxNotFoundError(Cu2QuError): def dot(v1, v2): """Return the dot product of two vectors.""" - return (v1*v2.conjugate()).real + return (v1 * v2.conjugate()).real def cubic_approx_control(p, t): """Approximate a cubic bezier curve with a quadratic one. Returns the candidate control point.""" - p1 = p[0]+(p[1]-p[0])*1.5 - p2 = p[3]+(p[2]-p[3])*1.5 - return p1+(p2-p1)*t + p1 = p[0] + (p[1] - p[0]) * 1.5 + p2 = p[3] + (p[2] - p[3]) * 1.5 + return p1 + (p2 - p1) * t def calc_intersect(a, b, c, d): @@ -106,7 +106,7 @@ def calc_intersect(a, b, c, d): return c + cd * h -def _cubic_farthest_fit(pt1,pt2,pt3,pt4,tolerance): +def _cubic_farthest_fit(pt1, pt2, pt3, pt4, tolerance): """Returns True if the cubic Bezier p entirely lies within a distance tolerance of origin, False otherwise.""" @@ -114,14 +114,14 @@ def _cubic_farthest_fit(pt1,pt2,pt3,pt4,tolerance): return True # Split. - mid = (pt1+3*(pt2+pt3)+pt4)*.125 + mid = (pt1 + 3 * (pt2 + pt3) + pt4) * .125 if abs(mid) > tolerance: return False - deriv3 = (pt4+pt3-pt2-pt1)*.125 - return (_cubic_farthest_fit(pt1, (pt1+pt2)*.5, mid-deriv3, mid,tolerance) and - _cubic_farthest_fit(mid, mid+deriv3, (pt3+pt4)*.5, pt4,tolerance)) + deriv3 = (pt4 + pt3 - pt2 - pt1) * .125 + return (_cubic_farthest_fit(pt1, (pt1 + pt2) * .5, mid - deriv3, mid, tolerance) and + _cubic_farthest_fit(mid, mid + deriv3, (pt3 + pt4) * .5, pt4, tolerance)) -def cubic_farthest_fit(pt1,pt2,pt3,pt4,tolerance): +def cubic_farthest_fit(pt1, pt2, pt3, pt4, tolerance): """Returns True if the cubic Bezier p entirely lies within a distance tolerance of origin, False otherwise.""" @@ -132,12 +132,12 @@ def cubic_farthest_fit(pt1,pt2,pt3,pt4,tolerance): return True # Split. - mid = (pt1+3*(pt2+pt3)+pt4)*.125 + mid = (pt1 + 3 * (pt2 + pt3) + pt4) * .125 if abs(mid) > tolerance: return False - deriv3 = (pt4+pt3-pt2-pt1)*.125 - return (_cubic_farthest_fit(pt1, (pt1+pt2)*.5, mid-deriv3, mid,tolerance) and - _cubic_farthest_fit(mid, mid+deriv3, (pt3+pt4)*.5, pt4,tolerance)) + deriv3 = (pt4 + pt3 - pt2 - pt1) * .125 + return (_cubic_farthest_fit(pt1, (pt1 + pt2) * .5, mid - deriv3, mid, tolerance) and + _cubic_farthest_fit(mid, mid + deriv3, (pt3 + pt4) * .5, pt4, tolerance)) def cubic_approx_spline(p, n, tolerance): @@ -153,11 +153,11 @@ def cubic_approx_spline(p, n, tolerance): return None p0 = p[0] p3 = p[3] - p1 = p0+(qp1-p0)*(2/3) - p2 = p3+(qp1-p3)*(2/3) + p1 = p0 + (qp1 - p0) * (2/3) + p2 = p3 + (qp1 - p3) * (2/3) if not cubic_farthest_fit(0, - p1-p[1], - p2-p[2], + p1 - p[1], + p2 - p[2], 0, tolerance): return None return p0, qp1, p3 @@ -173,18 +173,18 @@ def cubic_approx_spline(p, n, tolerance): spline.append(cubic_approx_control(segments[i], i / (n - 1))) spline.append(p[3]) - for i in range(1,n+1): + for i in range(1, n + 1): if i == 1: - p0,p1,p2 = (spline[0],spline[1],(spline[1]+spline[2])*.5) + p0, p1, p2 = (spline[0], spline[1], (spline[1] + spline[2]) * .5) elif i == n: - p0,p1,p2 = (spline[-3]+spline[-2])*.5,spline[-2],spline[-1] + p0, p1, p2 = (spline[-3] + spline[-2]) * .5, spline[-2], spline[-1] else: - p0,p1,p2 = (spline[i-1]+spline[i])*.5, spline[i], (spline[i]+spline[i+1])*.5 + p0, p1, p2 = (spline[i - 1] + spline[i]) * .5, spline[i], (spline[i] + spline[i + 1]) * .5 - pt1, pt2, pt3, pt4 = segments[i-1] + pt1, pt2, pt3, pt4 = segments[i - 1] if not cubic_farthest_fit(p0 - pt1, - p0+(p1-p0)*(2/3) - pt2, - p2+(p1-p2)*(2/3) - pt3, + p0 + (p1 - p0) * (2/3) - pt2, + p2 + (p1 - p2) * (2/3) - pt3, p2 - pt4, tolerance): return None @@ -208,7 +208,7 @@ def curve_to_quadratic(p, max_err): else: # no break: approximation not found raise ApproxNotFoundError(p) - return [(s.real,s.imag) for s in spline] + return [(s.real, s.imag) for s in spline] def curves_to_quadratic(curves, max_errors): @@ -224,7 +224,7 @@ def curves_to_quadratic(curves, max_errors): splines = [None] * num_curves for n in range(1, MAX_N + 1): - splines = [cubic_approx_spline(c, n, e) for c,e in zip(curves,max_errors)] + splines = [cubic_approx_spline(c, n, e) for c, e in zip(curves, max_errors)] if all(splines): break else: @@ -232,4 +232,4 @@ def curves_to_quadratic(curves, max_errors): for c, s in zip(curves, splines): if s is None: raise ApproxNotFoundError(c) - return [[(s.real,s.imag) for s in spline] for spline in splines] + return [[(s.real, s.imag) for s in spline] for spline in splines]