Use Bresenham to draw the line between faces
[cascardo/movie.git] / movie.c
diff --git a/movie.c b/movie.c
index f6a20b9..4184b82 100644 (file)
--- a/movie.c
+++ b/movie.c
 #include <SDL.h>
 #include <SDL_image.h>
 
+#define SWAP(x, y) do { \
+       x ^= y; y ^= x; x ^= y; \
+       } while (0)
+
+#define ABS(x) ((x) < 0 ? -(x) : (x))
+
+#define IS_CENTER(cx, cy, x, y) \
+       ((x + WIDTH/2 == cx) && (y + HEIGHT/2 == cy))
+
+SDL_Rect points[] = {
+  {400, 300, 800, 600},
+  {450, 350, 800, 600}
+};
+
 SDL_Rect *
 GetNextPoint (void)
 {
   static SDL_Rect rect = {0, 0, WIDTH, HEIGHT};
-  rect.x = (rect.x++) % WIDTH;
-  rect.y = (rect.y++) % HEIGHT;
+  static int cur = -1;
+  static int inc, err, thre, swap;
+  static int x1, y1, x2, y2;
+  static int x, y;
+  int next;
+  next = (cur + 1) % (sizeof (points) / sizeof (SDL_Rect));
+  if (IS_CENTER (points[next].x, points[next].y, rect.x, rect.y) || cur == -1)
+  {
+    cur = next;
+    next = (cur + 1) % (sizeof (points) / sizeof (SDL_Rect));
+    err = 0;
+    swap = 0;
+    x1 = points[cur].x;
+    y1 = points[cur].y;
+    x2 = points[next].x;
+    y2 = points[next].y;
+    inc = y2 - y1;
+    thre = x2 - x1;
+    if (ABS (inc) > ABS (thre))
+    {
+      SWAP (inc, thre);
+      SWAP (x1, y1);
+      SWAP (x2, y2);
+      swap = 1;
+    }
+    x = x1;
+    y = y1;
+  }
+  rect.x = (swap ? y : x) - WIDTH/2;
+  rect.y = (swap ? x : y) - HEIGHT/2;
+  (x2 < x1) ? x-- : x++;
+  err += ABS (inc);
+  if (err >= ABS (thre))
+  {
+    err -= ABS (thre);
+    y += (inc < 0) ? -1 : 1;
+  }
   return &rect;
 }