1e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*
2e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Copyright (C) 2011 The Android Open Source Project
3e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen *
4e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Licensed under the Apache License, Version 2.0 (the "License");
5e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * you may not use this file except in compliance with the License.
6e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * You may obtain a copy of the License at
7e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen *
8e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen *      http://www.apache.org/licenses/LICENSE-2.0
9e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen *
10e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Unless required by applicable law or agreed to in writing, software
11e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * distributed under the License is distributed on an "AS IS" BASIS,
12e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * See the License for the specific language governing permissions and
14e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * limitations under the License.
15e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
16e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
17e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/* $Id: db_utilities.h,v 1.3 2011/06/17 14:03:31 mbansal Exp $ */
18e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
19e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#ifndef DB_UTILITIES_H
20e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#define DB_UTILITIES_H
21e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
22e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
23e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#ifdef _WIN32
24e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#pragma warning(disable: 4275)
25e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#pragma warning(disable: 4251)
26e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#pragma warning(disable: 4786)
27e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#pragma warning(disable: 4800)
28e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#pragma warning(disable: 4018) /* signed-unsigned mismatch */
29e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif /* _WIN32 */
30e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
31e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#ifdef _WIN32
32e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    #ifdef DBDYNAMIC_EXPORTS
33e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        #define DB_API __declspec(dllexport)
34e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    #else
35e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        #ifdef DBDYNAMIC_IMPORTS
36e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen            #define DB_API __declspec(dllimport)
37e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        #else
38e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen            #define DB_API
39e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        #endif
40e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    #endif
41e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#else
42e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    #define DB_API
43e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif /* _WIN32 */
44e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
45e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#ifdef _VERBOSE_
46e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include <iostream>
47e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif
48e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
49e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include <math.h>
50e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
51e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include <assert.h>
52e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities_constants.h"
53e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
54e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \defgroup LMBasicUtilities (LM) Utility Functions (basic math, linear algebra and array manipulations)
55e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
56e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*\{*/
57e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
58e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
59e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Round double into int using fld and fistp instructions.
60e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
61e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_roundi (double x) {
62e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#ifdef WIN32_ASM
63e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    int n;
64e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    __asm
65e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    {
66e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        fld x;
67e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        fistp n;
68e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    }
69e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return n;
70e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#else
71e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return static_cast<int>(floor(x+0.5));
72e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif
73e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
74e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
75e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
76e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Square a double.
77e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
78e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_sqr(double a)
79e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
80e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(a*a);
81e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
82e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
83e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
84e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Square a long.
85e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
86e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline long db_sqr(long a)
87e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
88e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(a*a);
89e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
90e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
91e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
92e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Square an int.
93e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
94e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline long db_sqr(int a)
95e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
96e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(a*a);
97e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
98e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
99e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
100e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Maximum of two doubles.
101e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
102e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_maxd(double a,double b)
103e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
104e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    if(b>a) return(b);
105e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    else return(a);
106e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
107e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
108e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Minumum of two doubles.
109e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
110e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_mind(double a,double b)
111e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
112e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    if(b<a) return(b);
113e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    else return(a);
114e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
115e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
116e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
117e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
118e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Maximum of two ints.
119e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
120e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_maxi(int a,int b)
121e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
122e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    if(b>a) return(b);
123e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    else return(a);
124e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
125e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
126e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
127e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Minimum of two numbers.
128e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
129e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_mini(int a,int b)
130e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
131e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    if(b<a) return(b);
132e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    else return(a);
133e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
134e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
135e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Maximum of two numbers.
136e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
137e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline long db_maxl(long a,long b)
138e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
139e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    if(b>a) return(b);
140e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    else return(a);
141e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
142e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
143e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
144e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Minimum of two numbers.
145e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
146e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline long db_minl(long a,long b)
147e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
148e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    if(b<a) return(b);
149e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    else return(a);
150e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
151e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
152e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
153e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Sign of a number.
154e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \return -1.0 if negative, 1.0 if positive.
155e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
156e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_sign(double x)
157e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
158e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    if(x>=0.0) return(1.0);
159e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    else return(-1.0);
160e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
161e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
162e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Absolute value.
163e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
164e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_absi(int a)
165e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
166e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    if(a<0) return(-a);
167e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    else return(a);
168e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
169e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
170e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Absolute value.
171e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
172e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline float db_absf(float a)
173e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
174e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    if(a<0) return(-a);
175e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    else return(a);
176e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
177e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
178e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
179e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Absolute value.
180e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
181e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_absd(double a)
182e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
183e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    if(a<0) return(-a);
184e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    else return(a);
185e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
186e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
187e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
188e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Reciprocal (1/a). Prevents divide by 0.
189e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \return 1/a if a != 0. 1.0 otherwise.
190e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
191e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_SafeReciprocal(double a)
192e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
193e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return((a!=0.0)?(1.0/a):1.0);
194e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
195e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
196e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
197e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Division. Prevents divide by 0.
198e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \return a/b if b!=0. a otherwise.
199e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
200e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_SafeDivision(double a,double b)
201e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
202e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return((b!=0.0)?(a/b):a);
203e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
204e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
205e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
206e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Square root. Prevents imaginary output.
207e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \return sqrt(a) if a > 0.0. 0.0 otherewise.
208e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
209e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_SafeSqrt(double a)
210e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
211e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return((a>=0.0)?(sqrt(a)):0.0);
212e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
213e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
214e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
215e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Square root of a reciprocal. Prevents divide by 0 and imaginary output.
216e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \return sqrt(1/a) if a > 0.0. 1.0 otherewise.
217e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
218e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_SafeSqrtReciprocal(double a)
219e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
220e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return((a>0.0)?(sqrt(1.0/a)):1.0);
221e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
222e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
223e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Cube root.
224e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
225e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_CubRoot(double x)
226e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
227e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    if(x>=0.0) return(pow(x,1.0/3.0));
228e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    else return(-pow(-x,1.0/3.0));
229e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
230e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
231e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Sum of squares of elements of x.
232e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
233e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_SquareSum3(const double x[3])
234e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
235e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(db_sqr(x[0])+db_sqr(x[1])+db_sqr(x[2]));
236e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
237e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
238e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Sum of squares of elements of x.
239e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
240e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_SquareSum7(double x[7])
241e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
242e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(db_sqr(x[0])+db_sqr(x[1])+db_sqr(x[2])+
243e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        db_sqr(x[3])+db_sqr(x[4])+db_sqr(x[5])+
244e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        db_sqr(x[6]));
245e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
246e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
247e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Sum of squares of elements of x.
248e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
249e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_SquareSum9(double x[9])
250e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
251e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(db_sqr(x[0])+db_sqr(x[1])+db_sqr(x[2])+
252e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        db_sqr(x[3])+db_sqr(x[4])+db_sqr(x[5])+
253e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        db_sqr(x[6])+db_sqr(x[7])+db_sqr(x[8]));
254e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
255e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
256e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Copy a vector.
257e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param xd destination
258e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param xs source
259e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
260e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid inline db_Copy3(double xd[3],const double xs[3])
261e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
262e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    xd[0]=xs[0];xd[1]=xs[1];xd[2]=xs[2];
263e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
264e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
265e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Copy a vector.
266e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param xd destination
267e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param xs source
268e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
269e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid inline db_Copy6(double xd[6],const double xs[6])
270e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
271e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    xd[0]=xs[0];xd[1]=xs[1];xd[2]=xs[2];
272e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    xd[3]=xs[3];xd[4]=xs[4];xd[5]=xs[5];
273e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
274e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
275e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Copy a vector.
276e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param xd destination
277e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param xs source
278e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
279e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid inline db_Copy9(double xd[9],const double xs[9])
280e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
281e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    xd[0]=xs[0];xd[1]=xs[1];xd[2]=xs[2];
282e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    xd[3]=xs[3];xd[4]=xs[4];xd[5]=xs[5];
283e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    xd[6]=xs[6];xd[7]=xs[7];xd[8]=xs[8];
284e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
285e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
286e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
287e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Scalar product: Transpose(A)*B.
288e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
289e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_ScalarProduct4(const double A[4],const double B[4])
290e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
291e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(A[0]*B[0]+A[1]*B[1]+A[2]*B[2]+A[3]*B[3]);
292e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
293e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
294e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Scalar product: Transpose(A)*B.
295e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
296e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_ScalarProduct7(const double A[7],const double B[7])
297e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
298e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(A[0]*B[0]+A[1]*B[1]+A[2]*B[2]+
299e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        A[3]*B[3]+A[4]*B[4]+A[5]*B[5]+
300e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        A[6]*B[6]);
301e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
302e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
303e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Scalar product: Transpose(A)*B.
304e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
305e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_ScalarProduct9(const double A[9],const double B[9])
306e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
307e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return(A[0]*B[0]+A[1]*B[1]+A[2]*B[2]+
308e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        A[3]*B[3]+A[4]*B[4]+A[5]*B[5]+
309e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen        A[6]*B[6]+A[7]*B[7]+A[8]*B[8]);
310e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
311e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
312e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Vector addition: S=A+B.
313e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
314e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_AddVectors6(double S[6],const double A[6],const double B[6])
315e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
316e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    S[0]=A[0]+B[0]; S[1]=A[1]+B[1]; S[2]=A[2]+B[2]; S[3]=A[3]+B[3]; S[4]=A[4]+B[4];
317e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    S[5]=A[5]+B[5];
318e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
319e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
320e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Multiplication: C(3x1)=A(3x3)*B(3x1).
321e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
322e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_Multiply3x3_3x1(double y[3],const double A[9],const double x[3])
323e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
324e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    y[0]=A[0]*x[0]+A[1]*x[1]+A[2]*x[2];
325e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    y[1]=A[3]*x[0]+A[4]*x[1]+A[5]*x[2];
326e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    y[2]=A[6]*x[0]+A[7]*x[1]+A[8]*x[2];
327e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
328e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_Multiply3x3_3x3(double C[9], const double A[9],const double B[9])
329e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
330e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    C[0]=A[0]*B[0]+A[1]*B[3]+A[2]*B[6];
331e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    C[1]=A[0]*B[1]+A[1]*B[4]+A[2]*B[7];
332e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    C[2]=A[0]*B[2]+A[1]*B[5]+A[2]*B[8];
333e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
334e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    C[3]=A[3]*B[0]+A[4]*B[3]+A[5]*B[6];
335e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    C[4]=A[3]*B[1]+A[4]*B[4]+A[5]*B[7];
336e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    C[5]=A[3]*B[2]+A[4]*B[5]+A[5]*B[8];
337e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
338e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    C[6]=A[6]*B[0]+A[7]*B[3]+A[8]*B[6];
339e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    C[7]=A[6]*B[1]+A[7]*B[4]+A[8]*B[7];
340e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    C[8]=A[6]*B[2]+A[7]*B[5]+A[8]*B[8];
341e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
342e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
343e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Multiplication: C(4x1)=A(4x4)*B(4x1).
344e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
345e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_Multiply4x4_4x1(double y[4],const double A[16],const double x[4])
346e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
347e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    y[0]=A[0]*x[0]+A[1]*x[1]+A[2]*x[2]+A[3]*x[3];
348e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    y[1]=A[4]*x[0]+A[5]*x[1]+A[6]*x[2]+A[7]*x[3];
349e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    y[2]=A[8]*x[0]+A[9]*x[1]+A[10]*x[2]+A[11]*x[3];
350e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    y[3]=A[12]*x[0]+A[13]*x[1]+A[14]*x[2]+A[15]*x[3];
351e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
352e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
353e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Scalar multiplication in place: A(3)=mult*A(3).
354e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
355e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_MultiplyScalar3(double *A,double mult)
356e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
357e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    (*A++) *= mult; (*A++) *= mult; (*A++) *= mult;
358e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
359e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
360e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
361e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Scalar multiplication: A(3)=mult*B(3).
362e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
363e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_MultiplyScalarCopy3(double *A,const double *B,double mult)
364e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
365e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult;
366e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
367e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
368e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
369e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Scalar multiplication: A(4)=mult*B(4).
370e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
371e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_MultiplyScalarCopy4(double *A,const double *B,double mult)
372e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
373e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult;
374e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
375e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
376e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Scalar multiplication: A(7)=mult*B(7).
377e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
378e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_MultiplyScalarCopy7(double *A,const double *B,double mult)
379e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
380e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult;
381e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    (*A++)=(*B++)*mult; (*A++)=(*B++)*mult;
382e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
383e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
384e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Scalar multiplication: A(9)=mult*B(9).
385e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
386e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_MultiplyScalarCopy9(double *A,const double *B,double mult)
387e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
388e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult;
389e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult;
390e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
391e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
392e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
393e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \defgroup LMImageBasicUtilities (LM) Basic Image Utility Functions
394e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
395e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen Images in db are simply 2D arrays of unsigned char or float types.
396e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen Only the very basic operations are supported: allocation/deallocation,
397e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chencopying, simple pyramid construction and LUT warping. These images are used
398e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenby db_CornerDetector_u and db_Matcher_u. The db_Image class is an attempt
399e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chento wrap these images. It has not been tested well.
400e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
401e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
402e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*\{*/
403e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
404e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Given a float image array, allocates and returns the set of row poiners.
405e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param im    image pointer
406e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param w     image width
407e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param h     image height
408e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
409e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API float** db_SetupImageReferences_f(float *im,int w,int h);
410e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
411e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Allocate a float image.
412e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Note: for feature detection images must be overallocated by 256 bytes.
413e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param w                 width
414e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param h                 height
415e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param over_allocation   allocate this many extra bytes at the end
416e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \return row array pointer
417e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
418e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API float** db_AllocImage_f(int w,int h,int over_allocation=256);
419e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
420e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Free a float image
421e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param img   row array pointer
422e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param h     image height (number of rows)
423e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
424e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API void db_FreeImage_f(float **img,int h);
425e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
426e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Given an unsigned char image array, allocates and returns the set of row poiners.
427e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param im    image pointer
428e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param w     image width
429e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param h     image height
430e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
431e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API unsigned char** db_SetupImageReferences_u(unsigned char *im,int w,int h);
432e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
433e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Allocate an unsigned char image.
434e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Note: for feature detection images must be overallocated by 256 bytes.
435e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param w                 width
436e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param h                 height
437e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param over_allocation   allocate this many extra bytes at the end
438e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \return row array pointer
439e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
440e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API unsigned char** db_AllocImage_u(int w,int h,int over_allocation=256);
441e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
442e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Free an unsigned char image
443e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param img   row array pointer
444e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param h     image height (number of rows)
445e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
446e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API void db_FreeImage_u(unsigned char **img,int h);
447e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
448e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
449e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen Copy an image from s to d. Both s and d must be pre-allocated at of the same size.
450e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen Copy is done row by row.
451e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen \param s   source
452e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen \param d   destination
453e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen \param w   width
454e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen \param h   height
455e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen \param over_allocation copy this many bytes after the end of the last line
456e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
457e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API void db_CopyImage_u(unsigned char **d,const unsigned char * const *s,int w,int h,int over_allocation=0);
458e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
459e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API inline unsigned char db_BilinearInterpolation(double y, double x, const unsigned char * const * v)
460e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
461e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    int floor_x=(int) x;
462e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    int floor_y=(int) y;
463e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
464e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    int ceil_x=floor_x+1;
465e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    int ceil_y=floor_y+1;
466e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
467e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    unsigned char f00 = v[floor_y][floor_x];
468e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    unsigned char f01 = v[floor_y][ceil_x];
469e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    unsigned char f10 = v[ceil_y][floor_x];
470e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    unsigned char f11 = v[ceil_y][ceil_x];
471e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
472e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    double xl = x-floor_x;
473e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    double yl = y-floor_y;
474e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
475e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    return (unsigned char)(f00*(1-yl)*(1-xl) + f10*yl*(1-xl) + f01*(1-yl)*xl + f11*yl*xl);
476e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
477e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*\}*/
478e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
479e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \ingroup LMRotation
480e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Compute an incremental rotation matrix using the update dx=[sin(phi) sin(ohm) sin(kap)]
481e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
482e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_IncrementalRotationMatrix(double R[9],const double dx[3])
483e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
484e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    double sp,so,sk,om_sp2,om_so2,om_sk2,cp,co,ck,sp_so,cp_so;
485e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
486e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    /*Store sines*/
487e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    sp=dx[0]; so=dx[1]; sk=dx[2];
488e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    om_sp2=1.0-sp*sp;
489e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    om_so2=1.0-so*so;
490e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    om_sk2=1.0-sk*sk;
491e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    /*Compute cosines*/
492e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    cp=(om_sp2>=0.0)?sqrt(om_sp2):1.0;
493e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    co=(om_so2>=0.0)?sqrt(om_so2):1.0;
494e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    ck=(om_sk2>=0.0)?sqrt(om_sk2):1.0;
495e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    /*Compute matrix*/
496e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    sp_so=sp*so;
497e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    cp_so=cp*so;
498e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    R[0]=sp_so*sk+cp*ck; R[1]=co*sk; R[2]=cp_so*sk-sp*ck;
499e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    R[3]=sp_so*ck-cp*sk; R[4]=co*ck; R[5]=cp_so*ck+sp*sk;
500e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    R[6]=sp*co;          R[7]= -so;  R[8]=cp*co;
501e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
502e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
503e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Zero out 2 vector in place.
504e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
505e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid inline db_Zero2(double x[2])
506e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
507e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    x[0]=x[1]=0;
508e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
509e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
510e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Zero out 3 vector in place.
511e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
512e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid inline db_Zero3(double x[3])
513e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
514e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    x[0]=x[1]=x[2]=0;
515e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
516e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
517e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Zero out 4 vector in place.
518e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
519e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid inline db_Zero4(double x[4])
520e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
521e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    x[0]=x[1]=x[2]=x[3]=0;
522e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
523e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
524e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Zero out 9 vector in place.
525e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
526e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid inline db_Zero9(double x[9])
527e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{
528e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen    x[0]=x[1]=x[2]=x[3]=x[4]=x[5]=x[6]=x[7]=x[8]=0;
529e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}
530e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
531e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#define DB_WARP_FAST        0
532e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#define DB_WARP_BILINEAR    1
533e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
534e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*!
535e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Perform a look-up table warp.
536e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * The LUTs must be float images of the same size as source image.
537e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * The source value x_s is determined from destination (x_d,y_d) through lut_x
538e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * and y_s is determined from lut_y:
539e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen   \code
540e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen   x_s = lut_x[y_d][x_d];
541e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen   y_s = lut_y[y_d][x_d];
542e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen   \endcode
543e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
544e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param src   source image
545e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param dst   destination image
546e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param w     width
547e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param h     height
548e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param lut_x LUT for x
549e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param lut_y LUT for y
550e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param type  warp type (DB_WARP_FAST or DB_WARP_BILINEAR)
551e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */
552e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API void db_WarpImageLut_u(const unsigned char * const * src,unsigned char ** dst, int w, int h,
553e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen                               const float * const * lut_x, const float * const * lut_y, int type=DB_WARP_BILINEAR);
554e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
555e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API void db_PrintDoubleVector(double *a,long size);
556e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API void db_PrintDoubleMatrix(double *a,long rows,long cols);
557e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
558e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities_constants.h"
559e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities_algebra.h"
560e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities_indexing.h"
561e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities_linalg.h"
562e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities_poly.h"
563e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities_geometry.h"
564e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities_random.h"
565e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities_rotation.h"
566e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities_camera.h"
567e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
568e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#define DB_INVALID (-1)
569e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
570e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen
571e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif /* DB_UTILITIES_H */
572