Subversion Repositories AndroidProjects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
204 chris 1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <AR/ar.h>
4
#include "paddle.h"
5
 
6
static char *get_buff( char *buf, int n, FILE *fp );
7
 
8
static int get_marker( ARMarkerInfo *markerInfo, int *markerFlag,
9
                       int marker_num, int id,
10
                       ARMarkerInfo *prevInfo, int *pcount );
11
 
12
 
13
ARPaddleInfo *paddleInit( char *name )
14
{
15
    FILE          *fp;
16
    ARPaddleInfo  *paddleInfo;
17
    char           buf[256], buf1[256];
18
 
19
    if( (fp=fopen(name, "r")) == NULL ) return(0);
20
 
21
    arMalloc( paddleInfo, ARPaddleInfo, 1 );
22
 
23
    get_buff(buf, 256, fp);
24
    if( sscanf(buf, "%s", paddleInfo->name) != 1 ) {
25
      fclose(fp); free(paddleInfo); return 0;
26
    }
27
 
28
    get_buff(buf, 256, fp);
29
    if( sscanf(buf, "%s", buf1) != 1 ) {
30
      fclose(fp); free(paddleInfo); return 0;
31
    }
32
    if( (paddleInfo->marker_id = arLoadPatt(buf1)) < 0 ) {
33
      fclose(fp); free(paddleInfo); return 0;
34
    }
35
 
36
    get_buff(buf, 256, fp);
37
    if( sscanf(buf, "%lf", &paddleInfo->width) != 1 ) {
38
      fclose(fp); free(paddleInfo); return 0;
39
    }
40
 
41
    paddleInfo->center[0] = 0.0;
42
    paddleInfo->center[1] = 0.0;
43
    paddleInfo->active    = 0;
44
    paddleInfo->pcount    = 0;
45
    paddleInfo->pcountL = 0;
46
    paddleInfo->pcountR = 0;
47
 
48
    fclose(fp);
49
 
50
    return paddleInfo;
51
}
52
 
53
static char *get_buff( char *buf, int n, FILE *fp )
54
{
55
    char *ret;
56
 
57
    for(;;) {
58
        ret = fgets( buf, n, fp );
59
        if( ret == NULL ) return(NULL);
60
        if( buf[0] != '\n' && buf[0] != '#' ) return(ret);
61
    }
62
}
63
 
64
int paddleGetTrans( ARPaddleInfo *paddleInfo, ARMarkerInfo *markerInfo, int *markerFlag, int marker_num, ARParam *cparam )
65
{
66
    int   id;
67
 
68
    id = get_marker( markerInfo, markerFlag, marker_num, paddleInfo->marker_id,
69
                      &(paddleInfo->prevInfo), &(paddleInfo->pcount) );
70
 
71
    if( id == -1 ) { paddleInfo->active = 0; return 0; }
72
 
73
    arGetTransMat(&markerInfo[id],
74
                  paddleInfo->center, paddleInfo->width, paddleInfo->trans);
75
    markerFlag[id] = 1;
76
 
77
    paddleInfo->active = 1;
78
 
79
    return 0;
80
}
81
 
82
static int get_marker( ARMarkerInfo *markerInfo, int *markerFlag, int marker_num, int id,
83
                       ARMarkerInfo *prevInfo, int *pcount )
84
{
85
    double  rlen, rlenmin, rarea, diff, diffmin;
86
    int     cid, cdir;
87
    int     i, j;
88
 
89
    cid = -1;
90
    for( i = 0; i < marker_num; i++ ) {
91
        if( markerInfo[i].id == id && markerFlag[i] == 0 ) {
92
            if( cid == -1 ) cid = i;
93
            else {
94
                if( markerInfo[cid].cf < markerInfo[i].cf ) cid = i;
95
            }
96
        }
97
    }
98
    if( cid == -1 ) {
99
        if( *pcount == 0 ) return -1;
100
 
101
        rlenmin = 10.0;
102
        for( i = 0; i < marker_num; i++ ) {
103
            if( markerFlag[i] ) continue;
104
            rarea = (double)prevInfo->area / (double)markerInfo[i].area;
105
            if( rarea < 0.7 || rarea > 1.43 ) continue;
106
            rlen = ( (markerInfo[i].pos[0] - prevInfo->pos[0])
107
                   * (markerInfo[i].pos[0] - prevInfo->pos[0])
108
                   + (markerInfo[i].pos[1] - prevInfo->pos[1])
109
                   * (markerInfo[i].pos[1] - prevInfo->pos[1]) ) / markerInfo[i].area;
110
            if( rlen < 0.5 && rlen < rlenmin ) {
111
                rlenmin = rlen;
112
                cid = i;
113
            }
114
        }
115
        if( cid >= 0 && markerInfo[cid].cf < prevInfo->cf ) {
116
            markerInfo[cid].cf = prevInfo->cf;
117
            markerInfo[cid].id = prevInfo->id;
118
            diffmin = 10000.0 * 10000.0;
119
            cdir = -1;
120
            for( i = 0; i < 4; i++ ) {
121
                diff = 0.0;
122
                for( j = 0; j < 4; j++ ) {
123
                    diff += (prevInfo->vertex[j][0] - markerInfo[cid].vertex[(i+j)%4][0])
124
                          * (prevInfo->vertex[j][0] - markerInfo[cid].vertex[(i+j)%4][0])
125
                          + (prevInfo->vertex[j][1] - markerInfo[cid].vertex[(i+j)%4][1])
126
                          * (prevInfo->vertex[j][1] - markerInfo[cid].vertex[(i+j)%4][1]);
127
                }
128
                if( diff < diffmin ) {
129
                    diffmin = diff;
130
                    cdir = (prevInfo->dir - i + 4) % 4;
131
                }
132
            }
133
            markerInfo[cid].dir = cdir;
134
 
135
            *prevInfo = markerInfo[cid];
136
            *pcount = 1;
137
        }
138
        else {
139
            *pcount = 0;
140
            return -1;
141
        }
142
    }
143
    else {
144
        *prevInfo = markerInfo[cid];
145
        *pcount = 1;
146
    }
147
 
148
    return cid;
149
}