|
@@ -22,11 +22,20 @@
|
22
|
22
|
# ----------------------------------------------------------------------------
|
23
|
23
|
|
24
|
24
|
import sys
|
|
25
|
+import math
|
25
|
26
|
import wave
|
26
|
27
|
import argparse
|
27
|
28
|
from svgpathtools import svg2paths
|
28
|
|
-
|
29
|
|
-def read_image(filename, path_steps, volume_percent):
|
|
29
|
+def rot_p(p_center, p, angle_d):
|
|
30
|
+ angle = math.radians(angle_d)
|
|
31
|
+ ox = p_center[0]
|
|
32
|
+ oy = p_center[1]
|
|
33
|
+ qx = ox + math.cos(angle) * (p[0] - ox) - math.sin(angle) * (p[1] - oy)
|
|
34
|
+ qy = oy + math.sin(angle) * (p[0] - ox) + math.cos(angle) * (p[1] - oy)
|
|
35
|
+ p = [qx, qy]
|
|
36
|
+ return p
|
|
37
|
+
|
|
38
|
+def read_image(filename, path_steps, volume_percent, angle_d):
|
30
|
39
|
paths, attributes = svg2paths(filename)
|
31
|
40
|
path = paths[0]
|
32
|
41
|
if len(paths) > 1:
|
|
@@ -37,15 +46,47 @@ def read_image(filename, path_steps, volume_percent):
|
37
|
46
|
points = [[path[0].start.real, path[0].start.imag]]
|
38
|
47
|
p_min = [points[0][0], points[0][1]]
|
39
|
48
|
p_max = [points[0][0], points[0][1]]
|
|
49
|
+
|
|
50
|
+ # find center
|
|
51
|
+ for segment in path:
|
|
52
|
+ p = [segment.end.real, segment.end.imag]
|
|
53
|
+ for i in range(0, 2):
|
|
54
|
+ if p[i] < p_min[i]:
|
|
55
|
+ p_min[i] = p[i]
|
|
56
|
+ if p[i] > p_max[i]:
|
|
57
|
+ p_max[i] = p[i]
|
|
58
|
+
|
|
59
|
+ p_center = [ p_min[0] + (p_max[0] - p_min[0] )/2 , p_min[1] + (p_max[1] - p_min[1] )/2]
|
|
60
|
+
|
|
61
|
+ # find min max for all rotatations
|
|
62
|
+ for segment in path:
|
|
63
|
+ p_org = [segment.end.real, segment.end.imag]
|
|
64
|
+ for a in range(0, 360, 5):
|
|
65
|
+ p = rot_p(p_center, p_org , a)
|
|
66
|
+ for i in range(0, 2):
|
|
67
|
+ if p[i] < p_min[i]:
|
|
68
|
+ p_min[i] = p[i]
|
|
69
|
+ if p[i] > p_max[i]:
|
|
70
|
+ p_max[i] = p[i]
|
|
71
|
+
|
|
72
|
+ p = [path[0].start.real, path[0].start.imag]
|
|
73
|
+ p = rot_p(p_center, p , angle_d)
|
|
74
|
+ points = [p]
|
|
75
|
+ # p_min = [points[0][0], points[0][1]]
|
|
76
|
+ # p_max = [points[0][0], points[0][1]]
|
40
|
77
|
for segment in path:
|
41
|
78
|
p = [segment.end.real, segment.end.imag]
|
|
79
|
+ p = rot_p(p_center, p , angle_d)
|
|
80
|
+
|
42
|
81
|
for i in range(0, 2):
|
43
|
82
|
if p[i] < p_min[i]:
|
44
|
83
|
p_min[i] = p[i]
|
45
|
84
|
if p[i] > p_max[i]:
|
46
|
85
|
p_max[i] = p[i]
|
47
|
86
|
points.append(p)
|
|
87
|
+
|
48
|
88
|
print("min={} max={}".format(p_min, p_max))
|
|
89
|
+ print("center={} ".format(p_center))
|
49
|
90
|
|
50
|
91
|
data = bytearray()
|
51
|
92
|
|
|
@@ -109,11 +150,13 @@ def main():
|
109
|
150
|
help="Volume of output file in percent. Defaults to 100%%.")
|
110
|
151
|
parser.add_argument("-i", "--interpolate", dest="interpolate", default=10, type=int,
|
111
|
152
|
help="Steps on interpolated paths. Defaults to 10.")
|
|
153
|
+ parser.add_argument("-r", "--rotate", dest="angle_d", default=10, type=int,
|
|
154
|
+ help="angle to rotate Defaults to 10.")
|
112
|
155
|
|
113
|
156
|
args = parser.parse_args()
|
114
|
157
|
print(args)
|
115
|
158
|
|
116
|
|
- wave = read_image(args.input, args.interpolate, args.volume)
|
|
159
|
+ wave = read_image(args.input, args.interpolate, args.volume, args.angle_d)
|
117
|
160
|
|
118
|
161
|
samplecount = int(len(wave) / 2 / 2) # stereo, int16
|
119
|
162
|
drawrate = args.samplerate / samplecount
|