Subversion Repositories AndroidProjects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
204 chris 1
/*******************************************************
2
 *
3
 * Author: Hirokazu Kato
4
 *
5
 *         kato@sys.im.hiroshima-cu.ac.jp
6
 *
7
 * Revision: 3.1
8
 * Date: 01/12/07
9
 *
10
*******************************************************/
11
#include <stdlib.h>
12
#include <math.h>
13
#include <AR/ar.h>
14
#include <AR/matrix.h>
15
 
16
#define MD_PI         3.14159265358979323846
17
 
18
double arModifyMatrix( double rot[3][3], double trans[3], double cpara[3][4],
19
                             double vertex[][3], double pos2d[][2], int num )
20
{
21
    double    factor;
22
    double    a, b, c;
23
    double    a1, b1, c1;
24
    double    a2, b2, c2;
25
    double    ma = 0.0, mb = 0.0, mc = 0.0;
26
    double    combo[3][4];
27
    double    hx, hy, h, x, y;
28
    double    err, minerr;
29
    int       t1, t2, t3;
30
    int       s1 = 0, s2 = 0, s3 = 0;
31
    int       i, j;
32
 
33
    arGetAngle( rot, &a, &b, &c );
34
 
35
    a2 = a;
36
    b2 = b;
37
    c2 = c;
38
    factor = 10.0*MD_PI/180.0;
39
    for( j = 0; j < 10; j++ ) {
40
        minerr = 1000000000.0;
41
        for(t1=-1;t1<=1;t1++) {
42
        for(t2=-1;t2<=1;t2++) {
43
        for(t3=-1;t3<=1;t3++) {
44
            a1 = a2 + factor*t1;
45
            b1 = b2 + factor*t2;
46
            c1 = c2 + factor*t3;
47
            arGetNewMatrix( a1, b1, c1, trans, NULL, cpara, combo );
48
 
49
            err = 0.0;
50
            for( i = 0; i < num; i++ ) {
51
                hx = combo[0][0] * vertex[i][0]
52
                   + combo[0][1] * vertex[i][1]
53
                   + combo[0][2] * vertex[i][2]
54
                   + combo[0][3];
55
                hy = combo[1][0] * vertex[i][0]
56
                   + combo[1][1] * vertex[i][1]
57
                   + combo[1][2] * vertex[i][2]
58
                   + combo[1][3];
59
                h  = combo[2][0] * vertex[i][0]
60
                   + combo[2][1] * vertex[i][1]
61
                   + combo[2][2] * vertex[i][2]
62
                   + combo[2][3];
63
                x = hx / h;
64
                y = hy / h;
65
 
66
                err += (pos2d[i][0] - x) * (pos2d[i][0] - x)
67
                     + (pos2d[i][1] - y) * (pos2d[i][1] - y);
68
            }
69
 
70
            if( err < minerr ) {
71
                minerr = err;
72
                ma = a1;
73
                mb = b1;
74
                mc = c1;
75
                s1 = t1; s2 = t2; s3 = t3;
76
            }
77
        }
78
        }
79
        }
80
 
81
        if( s1 == 0 && s2 == 0 && s3 == 0 ) factor *= 0.5;
82
        a2 = ma;
83
        b2 = mb;
84
        c2 = mc;
85
    }
86
 
87
    arGetRot( ma, mb, mc, rot );
88
 
89
/*  printf("factor = %10.5f\n", factor*180.0/MD_PI); */
90
 
91
    return minerr/num;
92
}
93
 
94
double arsModifyMatrix( double rot[3][3], double trans[3], ARSParam *arsParam,
95
                        double pos3dL[][3], double pos2dL[][2], int numL,
96
                        double pos3dR[][3], double pos2dR[][2], int numR )
97
{
98
    double    factor;
99
    double    a, b, c;
100
    double    a1, b1, c1;
101
    double    a2, b2, c2;
102
    double    ma = 0.0, mb = 0.0, mc = 0.0;
103
    double    combo[3][4];
104
    double    hx, hy, h, x, y;
105
    double    err, minerr;
106
    int       t1, t2, t3;
107
    int       s1 = 0, s2 = 0, s3 = 0;
108
    int       i, j;
109
 
110
    arGetAngle( rot, &a, &b, &c );
111
 
112
    a2 = a;
113
    b2 = b;
114
    c2 = c;
115
    factor = 10.0*MD_PI/180.0;
116
    for( j = 0; j < 10; j++ ) {
117
        minerr = 1000000000.0;
118
        for(t1=-1;t1<=1;t1++) {
119
        for(t2=-1;t2<=1;t2++) {
120
        for(t3=-1;t3<=1;t3++) {
121
            a1 = a2 + factor*t1;
122
            b1 = b2 + factor*t2;
123
            c1 = c2 + factor*t3;
124
            err = 0.0;
125
 
126
            arGetNewMatrix( a1, b1, c1, trans, NULL, arsParam->matL, combo );
127
            for( i = 0; i < numL; i++ ) {
128
                hx = combo[0][0] * pos3dL[i][0]
129
                   + combo[0][1] * pos3dL[i][1]
130
                   + combo[0][2] * pos3dL[i][2]
131
                   + combo[0][3];
132
                hy = combo[1][0] * pos3dL[i][0]
133
                   + combo[1][1] * pos3dL[i][1]
134
                   + combo[1][2] * pos3dL[i][2]
135
                   + combo[1][3];
136
                h  = combo[2][0] * pos3dL[i][0]
137
                   + combo[2][1] * pos3dL[i][1]
138
                   + combo[2][2] * pos3dL[i][2]
139
                   + combo[2][3];
140
                x = hx / h;
141
                y = hy / h;
142
                err += (pos2dL[i][0] - x) * (pos2dL[i][0] - x)
143
                     + (pos2dL[i][1] - y) * (pos2dL[i][1] - y);
144
            }
145
 
146
            arGetNewMatrix( a1, b1, c1, trans, arsParam->matL2R, arsParam->matR, combo );
147
            for( i = 0; i < numR; i++ ) {
148
                hx = combo[0][0] * pos3dR[i][0]
149
                   + combo[0][1] * pos3dR[i][1]
150
                   + combo[0][2] * pos3dR[i][2]
151
                   + combo[0][3];
152
                hy = combo[1][0] * pos3dR[i][0]
153
                   + combo[1][1] * pos3dR[i][1]
154
                   + combo[1][2] * pos3dR[i][2]
155
                   + combo[1][3];
156
                h  = combo[2][0] * pos3dR[i][0]
157
                   + combo[2][1] * pos3dR[i][1]
158
                   + combo[2][2] * pos3dR[i][2]
159
                   + combo[2][3];
160
                x = hx / h;
161
                y = hy / h;
162
 
163
                err += (pos2dR[i][0] - x) * (pos2dR[i][0] - x)
164
                     + (pos2dR[i][1] - y) * (pos2dR[i][1] - y);
165
            }
166
 
167
            if( err < minerr ) {
168
                minerr = err;
169
                ma = a1;
170
                mb = b1;
171
                mc = c1;
172
                s1 = t1; s2 = t2; s3 = t3;
173
            }
174
        }
175
        }
176
        }
177
 
178
        if( s1 == 0 && s2 == 0 && s3 == 0 ) factor *= 0.5;
179
        a2 = ma;
180
        b2 = mb;
181
        c2 = mc;
182
    }
183
 
184
    arGetRot( ma, mb, mc, rot );
185
 
186
    return minerr / (numL+numR);
187
}