aboutsummaryrefslogtreecommitdiff
path: root/src/spiral.video.sql
blob: da8ce1cd650f7b8a5c2cfedbb49f63d2fdc5cd8f (plain) (blame)
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
INSERT OR REPLACE INTO videos (id, width, height, fps) VALUES ('spiral', 400, 400, 20) RETURNING id;

WITH RECURSIVE
  video AS (SELECT * FROM videos WHERE id = 'spiral'),
  frames(frame) AS
    (SELECT 1 UNION ALL
      SELECT frame + 1 FROM frames, video WHERE frame < 60)
INSERT INTO images (id, width, height, frame, video_id)
  SELECT CONCAT('spiral/', frame), width, height, frame, 'spiral'
    FROM frames, video;

WITH RECURSIVE
  video AS
    (SELECT * FROM videos WHERE id = 'spiral'),
  horizontal(x) AS
    (SELECT width FROM video UNION ALL SELECT x - 1 FROM horizontal WHERE x > 1),
  vertical(y) AS
    (SELECT height FROM video UNION ALL SELECT y - 1 FROM vertical WHERE y > 1),
  frames(id, frame) AS
    (SELECT id, frame FROM images WHERE video_id = (SELECT id FROM video)),
  theta_increments(inc) AS
    (SELECT -14 UNION ALL SELECT inc + 1 FROM theta_increments WHERE inc < 14),
  theta_increments_2(inc) AS
    (SELECT -14.5 UNION ALL SELECT * FROM theta_increments UNION ALL SELECT 14.5),
  _pixels(frame_id, x, y, r, g, b) AS
    (SELECT
      frame_id,
      x, y,
      MIN(255, ROUND(50.0 * value + 15)),
      MIN(255, ROUND(200.0 * value*value*value) + 15),
      MIN(255, ROUND(200.0 * value*value*value) + 8)
    FROM  (SELECT *,
            frames.id AS frame_id,
            (WITH
              coords AS (SELECT
                          (x - width/2.0)/100.0 AS xval,
                          (y - height/2.0)/100.0 AS yval),
              theta AS  (SELECT
                          (CASE WHEN xval = 0 THEN PI()/2 ELSE ATAN(yval/xval) END) AS theta,
                          (0.05 * frame) / (SELECT COUNT(*) FROM frames) + 0.2 AS factor,
                          1.5 AS scale,
                          0.06 AS thicc
                         FROM coords),
              deltas AS (SELECT
                           SQRT(
                             POW(scale*SIN(factor*(theta + inc*PI()))*COS((theta + inc*PI())) - xval, 2) +
                             POW(scale*SIN(factor*(theta + inc*PI()))*SIN((theta + inc*PI())) - yval, 2)
                           ) AS delta
                         FROM theta, coords, theta_increments_2 ORDER BY ABS(inc) ASC)
            VALUES  (IFNULL((SELECT
                               1.0 - (delta / thicc)
                              FROM deltas, theta
                              WHERE delta <= thicc
                              LIMIT 1), 0))) AS value
      FROM vertical, horizontal, video, frames))
INSERT INTO pixels (image_id, x, y, r, g, b) SELECT frame_id, x, y, r, g, b FROM _pixels;