OSDN Git Service

modified: src/padarea.c
[kp123/kp123.git] / src / recognize_stroke.c
index 4ed930f..3c1b7fd 100644 (file)
@@ -95,35 +95,43 @@ static GList* filter_equal_points(GList *s)
  * then remove B */
 static GList* filter_points_by_angle(GList *s)
 {
-    const float MIN_MAX_ANGLE = 170*M_PI/180;
-    while(1)
-    {
-       if(g_list_length(s) < 3)
-           return g_list_first(s);
-       GList *pt = 0;
-       if(find_largest_angle(s, &pt) > MIN_MAX_ANGLE)
-           s = g_list_delete_link(s, pt);
-       else
-           break;
-    }
     if(g_list_length(s) < 3)
-       return g_list_first(s);
+       return s;
+    gchar ch0, ch1;
     GdkPoint *p0, *p, *p2;
     for(s = g_list_next(s); s != g_list_last(s); s = g_list_next(s))
     {
        if(g_list_length(s) < 3)
-           return g_list_first(s);
+           break;
        p0 = (GdkPoint*)g_list_previous(s)->data;
        p = (GdkPoint*)s->data;
        p2 = (GdkPoint*)g_list_next(s)->data;
-       gchar ch0 = get_stroke_char(p0, p);
-       gchar ch1 = get_stroke_char(p, p2);
+       ch0 = get_stroke_char(p0, p);
+       ch1 = get_stroke_char(p, p2);
        if(ch0 == ch1)
            s = g_list_delete_link(s, s);
     }
     return g_list_first(s);
 }
 
+static GList* filter_points_by_angle2(GList *s)
+{
+    if(g_list_length(s) < 3)
+       return s;
+    const float MIN_MAX_ANGLE = 170*M_PI/180;
+    while(1)
+    {
+       if(g_list_length(s) < 3)
+           break;
+       GList *pt = 0;
+       if(find_largest_angle(s, &pt) > MIN_MAX_ANGLE)
+           s = g_list_delete_link(s, pt);
+       else
+           break;
+    }
+    return g_list_first(s);
+}
+
 static float find_average_and_smallest_dist(GList *s, GList **pt0, GList **pt1, float *pdmin)
 {
     float d = 0, dt, dmin = -1;
@@ -150,13 +158,15 @@ static float find_average_and_smallest_dist(GList *s, GList **pt0, GList **pt1,
  * then remove B */
 static GList* filter_points_by_dist(GList *s)
 {
-    const float MAX_MIN_DIST = 0.3;
+    if(g_list_length(s) < 3)
+       return s;
+    const float MAX_MIN_DIST = 0.2;
     float d0, dmin;
     GList *pt0 = 0, *pt1 = 0;
     while(1)
     {
        if(g_list_length(s) < 3)
-           return g_list_first(s);
+           break;
        d0 = MAX_MIN_DIST*find_average_and_smallest_dist(s, &pt0, &pt1, &dmin);
        if(dmin < d0)
        {
@@ -183,7 +193,7 @@ static GList* filter_points_by_dist(GList *s)
        else
            break;
     }
-    return s;
+    return g_list_first(s);
 }
 
 gchar *get_stroke_str(GList *s)
@@ -198,7 +208,7 @@ gchar *get_stroke_str(GList *s)
        gchar ch = get_stroke_char(p0, p1);
        if(!ch)
            continue;
-       if(ch != prev)
+       if(g_ascii_tolower(ch) != g_ascii_tolower(prev))
        {
            if(len)
                ch = g_ascii_tolower(ch);
@@ -212,9 +222,24 @@ gchar *get_stroke_str(GList *s)
 gchar* recognize_stroke(GList *stroke, GList **out)
 {
     *out = g_list_copy(stroke);
-    *out = filter_equal_points(*out);
-    *out = filter_points_by_angle(*out);
-    *out = filter_points_by_dist(*out);
+    int len1, len2;
+    for(;;)
+    {
+       len1 = g_list_length(*out);
+       //g_printf("len_orig: %d\n", g_list_length(*out));
+       *out = filter_points_by_angle(*out);
+       //g_printf("len_angle_filtered: %d\n", g_list_length(*out));
+       *out = filter_points_by_dist(*out);
+       //g_printf("len_dist_filtered: %d\n", g_list_length(*out));
+       len2 = g_list_length(*out);
+       if(len1 != len2)
+           continue;
+       *out = filter_points_by_angle2(*out);
+       //g_printf("len_angle2_filtered: %d\n", g_list_length(*out));
+       len2 = g_list_length(*out);
+       if(len1 == len2)
+           break;
+    }
     return get_stroke_str(*out);
 }