Преглед изворни кода

add option to rotate svg and animate the rotation in steps

phschoen пре 3 месеци
родитељ
комит
7d11169866
2 измењених фајлова са 59 додато и 7 уклоњено
  1. 13
    4
      Makefile
  2. 46
    3
      render.py

+ 13
- 4
Makefile Прегледај датотеку

@@ -1,9 +1,9 @@
1 1
 inputs = $(wildcard *.svg)
2 2
 
3
-outputs = $(inputs:%.svg=output/%_44100.wav)
4
-outputs += $(inputs:%.svg=output/%_48000.wav)
5
-outputs += $(inputs:%.svg=output/%_96000.wav)
6
-outputs += $(inputs:%.svg=output/%_192000.wav)
3
+# outputs = $(inputs:%.svg=output/%_44100.wav)
4
+# outputs += $(inputs:%.svg=output/%_48000.wav)
5
+# outputs += $(inputs:%.svg=output/%_96000.wav)
6
+outputs += $(inputs:%.svg=output/%all.wav)
7 7
 
8 8
 .PHONY: all
9 9
 all: output ${outputs}
@@ -23,6 +23,15 @@ output/%_96000.wav: %.svg
23 23
 output/%_192000.wav: %.svg
24 24
 	./render.py -s 192000 -o $(@:%.svg=%_192000.wav) $<
25 25
 
26
+output/%all.wav: %.svg
27
+	for number in {000..360..5} ; do \
28
+	   ./render.py -s 192000 -t 0.1 -o output/$(@F)_$$number.wav -r $$number $< ; \
29
+	done
30
+	sox  output/$(@F)_*.wav $@
31
+	ffmpeg -f concat -safe 0 -i <( for f in output/$(@F)_*.wav; do echo "file '$$(pwd)/$$f'"; done ) output.wav
32
+	rm output/$(@F)_*.wav
33
+
34
+
26 35
 .PHONY: clean
27 36
 clean:
28 37
 	rm -rf output

+ 46
- 3
render.py Прегледај датотеку

@@ -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

Loading…
Откажи
Сачувај