X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=movie.c;h=ec850ad59ae2b8357b96a691634c3b266ad40e8a;hb=refs%2Fheads%2Fmaster;hp=4ff67dbea27ce6b665e8ab68066236d16e320da8;hpb=9946d0d51bfa0fb3a00aaf4cea0bc9845d7e12f1;p=cascardo%2Fmovie.git diff --git a/movie.c b/movie.c index 4ff67db..ec850ad 100644 --- a/movie.c +++ b/movie.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "point.h" @@ -78,6 +79,11 @@ ReadPoints (char *filename) Point last; Point rect; file = fopen (filename, "r"); + if (file == NULL) + { + fprintf (stderr, "Could not open file %s\n", filename); + exit (1); + } points = g_array_new (FALSE, TRUE, sizeof (Point)); buffer = NULL; len = 0; @@ -103,16 +109,73 @@ ReadPoints (char *filename) return points; } +GArray * +drop_dup_frames (GArray *points, int n) +{ + GArray *frames; + Point *point; + Point *next; + int i; + int j; + int inc; + int thre; + int err; + inc = n; + frames = g_array_new (FALSE, TRUE, sizeof (Point)); + for (i = 0; i < points->len;) + { + j = i + 1; + point = next = &(g_array_index (points, Point, j)); + while (next->name == NULL && j < points->len) + { + j++; + next = &(g_array_index (points, Point, j)); + } + thre = j - i; + err = 0; + g_array_append_val (frames, g_array_index (points, Point, i)); + for (; i < j; i++) + { + err += inc; + while (err > thre) + { + err -= thre; + g_array_append_val (frames, g_array_index (points, Point, i)); + } + } + } + return frames; +} + +GArray * +get_scales (int n) +{ + GArray *scales; + double scale; + double factor; + scales = g_array_new (FALSE, TRUE, sizeof (double)); + factor = pow (4.0, 1.0/((double) n/2)); + factor = 1.0/factor; + for (scale = 4.00; scale > 1.0 && scales->len < n/2; scale *= factor) + scales = g_array_append_val (scales, scale); + factor = 1.0/factor; + for (scale = 1.0; scale < 4.0 && scales->len < n; scale *= factor) + scales = g_array_append_val (scales, scale); + return scales; +} + void -rescale_points (GArray *points) +rescale_points (GArray *points, GArray *scales) { Point *point; + double scale; int i; for (i = 0; i < points->len; i++) { point = &(g_array_index (points, Point, i)); - point->rx = 4.0; - point->ry = 4.0; + scale = g_array_index (scales, double, (i % scales->len)); + point->rx = scale; + point->ry = scale; point->x *= point->rx; point->y *= point->ry; }