changeset 4653:744b75ad18b8

Started adding vectorization of touch data.
author Jim Grandpre <jim.tla@gmail.com>
date Tue, 15 Jun 2010 02:12:16 -0400
parents 78f6e0b80d1e
children 7dbcd71216df
files touchTest/gestureTest.c
diffstat 1 files changed, 54 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/touchTest/gestureTest.c	Mon Jun 14 01:46:08 2010 -0400
+++ b/touchTest/gestureTest.c	Tue Jun 15 02:12:16 2010 -0400
@@ -39,10 +39,16 @@
   int id;
 } Finger;
 
+typedef struct { //dt + s
+  Point d,s; //direction, start
+  int points;
+} Line;
+
 
 Finger finger[MAXFINGERS];
 
 Finger gestureLast[MAXFINGERS];
+Line gestureLine[MAXFINGERS];
 
 void handler (int sig)
 {
@@ -86,6 +92,11 @@
   *pixmem32 = colour;
 }
 
+void drawLine(SDL_Surface *screen,int x0,int y0,int x1,int y1,unsigned int col) {
+  float t;
+  for(t=0;t<1;t+=1.f/SDL_max(abs(x0-x1),abs(y0-y1)))
+    setpix(screen,x1+t*(x0-x1),y1+t*(y0-y1),col);
+}
 void drawCircle(SDL_Surface* screen,int x,int y,int r,unsigned int c)
 {
 
@@ -145,10 +156,13 @@
         }
     }
   drawCircle(screen,mousx,mousy,-30,0xFFFFFF);
-  
+  drawLine(screen,0,0,screen->w,screen->h,0xFFFFFF);
   int i;
 //draw Touch History
-  for(i = 0;i < MAXFINGERS;i++) gestureLast[i].id = -1;
+  for(i = 0;i < MAXFINGERS;i++) {
+    gestureLast[i].id = -1;
+    gestureLine[i].points = 0;
+  }
   for(i = SDL_max(0,eventWrite - EVENT_BUF_SIZE);i != eventWrite;i++) {
     SDL_Event event = events[i&(EVENT_BUF_SIZE-1)];
     int age = eventWrite - i - 1;
@@ -164,10 +178,44 @@
       for(j = 0;j<MAXFINGERS;j++) {
 	if(gestureLast[j].id == event.tfinger.fingerId) {
 	  if(event.type == SDL_FINGERUP) {
+	    if(gestureLine[j].points > 0)
+	    drawLine(screen,
+		     gestureLine[j].s.x*screen->w,
+		     gestureLine[j].s.y*screen->h,
+		     (gestureLine[j].s.x +50*gestureLine[j].d.x)*screen->w,
+		     (gestureLine[j].s.y +50*gestureLine[j].d.y)*screen->h,
+		     0xFF00);
+
+	    gestureLine[j].points = 0;
 	    gestureLast[j].id = -1;
 	    break;
 	  }
 	  else {
+	    if(gestureLine[j].points == 1) {
+	      gestureLine[j].d.x = x - gestureLine[j].s.x;
+	      gestureLine[j].d.y = y - gestureLine[j].s.y;
+	    }
+
+	    gestureLine[j].s.x = gestureLine[j].s.x*gestureLine[j].points+x;
+	    gestureLine[j].s.y = gestureLine[j].s.y*gestureLine[j].points+y;
+
+	    gestureLine[j].d.x = gestureLine[j].d.x*gestureLine[j].points+
+	      x - gestureLast[j].p.x;
+	    gestureLine[j].d.y = gestureLine[j].d.y*gestureLine[j].points+
+	      y - gestureLast[j].p.y;;
+
+
+	    gestureLine[j].points++;
+	    
+	    gestureLine[j].s.x /= gestureLine[j].points;
+	    gestureLine[j].s.y /= gestureLine[j].points;
+
+	    gestureLine[j].d.x /= gestureLine[j].points;
+	    gestureLine[j].d.y /= gestureLine[j].points;
+
+	    
+	    
+
 	    gestureLast[j].p.x = x;
 	    gestureLast[j].p.y = y;
 	    break;
@@ -185,6 +233,10 @@
 	gestureLast[j].id = event.tfinger.fingerId;
 	gestureLast[j].p.x  = x;
 	gestureLast[j].p.y  = y;
+
+	gestureLine[j].s.x = x;
+	gestureLine[j].s.y = y;
+	gestureLine[j].points = 1;
       }
 
       //draw the touch && each centroid: