125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*
225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Copyright (C) 2011 The Android Open Source Project
325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb *
425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * you may not use this file except in compliance with the License.
625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * You may obtain a copy of the License at
725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb *
825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb *
1025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Unless required by applicable law or agreed to in writing, software
1125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
1225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * See the License for the specific language governing permissions and
1425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * limitations under the License.
1525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
1625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
1725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/* $Id: db_utilities.h,v 1.3 2011/06/17 14:03:31 mbansal Exp $ */
1825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
1925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#ifndef DB_UTILITIES_H
2025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#define DB_UTILITIES_H
2125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
2225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
2325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#ifdef _WIN32
2425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#pragma warning(disable: 4275)
2525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#pragma warning(disable: 4251)
2625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#pragma warning(disable: 4786)
2725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#pragma warning(disable: 4800)
2825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#pragma warning(disable: 4018) /* signed-unsigned mismatch */
2925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#endif /* _WIN32 */
3025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
3125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#ifdef _WIN32
3225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    #ifdef DBDYNAMIC_EXPORTS
3325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        #define DB_API __declspec(dllexport)
3425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    #else
3525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        #ifdef DBDYNAMIC_IMPORTS
3625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb            #define DB_API __declspec(dllimport)
3725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        #else
3825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb            #define DB_API
3925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        #endif
4025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    #endif
4125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#else
4225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    #define DB_API
4325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#endif /* _WIN32 */
4425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
4525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#ifdef _VERBOSE_
4625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include <iostream>
4725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#endif
4825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
4925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include <math.h>
5025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
5125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include <assert.h>
5225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include "db_utilities_constants.h"
5325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
5425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \defgroup LMBasicUtilities (LM) Utility Functions (basic math, linear algebra and array manipulations)
5525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
5625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*\{*/
5725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
5825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
5925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Round double into int using fld and fistp instructions.
6025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
6125668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline int db_roundi (double x) {
6225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#ifdef WIN32_ASM
6325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    int n;
6425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    __asm
6525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    {
6625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        fld x;
6725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        fistp n;
6825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    }
6925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return n;
7025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#else
7125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return static_cast<int>(floor(x+0.5));
7225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#endif
7325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
7425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
7525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
7625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Square a double.
7725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
7825668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_sqr(double a)
7925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
8025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return(a*a);
8125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
8225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
8325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
8425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Square a long.
8525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
8625668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline long db_sqr(long a)
8725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
8825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return(a*a);
8925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
9025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
9125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
9225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Square an int.
9325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
9425668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline long db_sqr(int a)
9525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
9625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return(a*a);
9725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
9825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
9925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
10025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Maximum of two doubles.
10125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
10225668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_maxd(double a,double b)
10325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
10425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    if(b>a) return(b);
10525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    else return(a);
10625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
10725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
10825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Minumum of two doubles.
10925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
11025668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_mind(double a,double b)
11125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
11225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    if(b<a) return(b);
11325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    else return(a);
11425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
11525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
11625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
11725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
11825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Maximum of two ints.
11925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
12025668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline int db_maxi(int a,int b)
12125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
12225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    if(b>a) return(b);
12325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    else return(a);
12425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
12525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
12625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
12725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Minimum of two numbers.
12825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
12925668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline int db_mini(int a,int b)
13025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
13125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    if(b<a) return(b);
13225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    else return(a);
13325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
13425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
13525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Maximum of two numbers.
13625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
13725668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline long db_maxl(long a,long b)
13825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
13925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    if(b>a) return(b);
14025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    else return(a);
14125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
14225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
14325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
14425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Minimum of two numbers.
14525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
14625668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline long db_minl(long a,long b)
14725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
14825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    if(b<a) return(b);
14925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    else return(a);
15025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
15125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
15225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
15325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Sign of a number.
15425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \return -1.0 if negative, 1.0 if positive.
15525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
15625668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_sign(double x)
15725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
15825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    if(x>=0.0) return(1.0);
15925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    else return(-1.0);
16025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
16125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
16225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Absolute value.
16325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
16425668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline int db_absi(int a)
16525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
16625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    if(a<0) return(-a);
16725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    else return(a);
16825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
16925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
17025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Absolute value.
17125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
17225668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline float db_absf(float a)
17325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
17425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    if(a<0) return(-a);
17525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    else return(a);
17625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
17725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
17825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
17925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Absolute value.
18025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
18125668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_absd(double a)
18225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
18325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    if(a<0) return(-a);
18425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    else return(a);
18525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
18625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
18725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
18825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Reciprocal (1/a). Prevents divide by 0.
18925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \return 1/a if a != 0. 1.0 otherwise.
19025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
19125668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_SafeReciprocal(double a)
19225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
19325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return((a!=0.0)?(1.0/a):1.0);
19425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
19525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
19625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
19725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Division. Prevents divide by 0.
19825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \return a/b if b!=0. a otherwise.
19925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
20025668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_SafeDivision(double a,double b)
20125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
20225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return((b!=0.0)?(a/b):a);
20325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
20425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
20525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
20625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Square root. Prevents imaginary output.
20725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \return sqrt(a) if a > 0.0. 0.0 otherewise.
20825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
20925668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_SafeSqrt(double a)
21025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
21125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return((a>=0.0)?(sqrt(a)):0.0);
21225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
21325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
21425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
21525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Square root of a reciprocal. Prevents divide by 0 and imaginary output.
21625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \return sqrt(1/a) if a > 0.0. 1.0 otherewise.
21725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
21825668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_SafeSqrtReciprocal(double a)
21925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
22025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return((a>0.0)?(sqrt(1.0/a)):1.0);
22125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
22225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
22325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Cube root.
22425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
22525668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_CubRoot(double x)
22625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
22725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    if(x>=0.0) return(pow(x,1.0/3.0));
22825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    else return(-pow(-x,1.0/3.0));
22925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
23025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
23125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Sum of squares of elements of x.
23225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
23325668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_SquareSum3(const double x[3])
23425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
23525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return(db_sqr(x[0])+db_sqr(x[1])+db_sqr(x[2]));
23625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
23725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
23825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Sum of squares of elements of x.
23925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
24025668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_SquareSum7(double x[7])
24125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
24225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return(db_sqr(x[0])+db_sqr(x[1])+db_sqr(x[2])+
24325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        db_sqr(x[3])+db_sqr(x[4])+db_sqr(x[5])+
24425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        db_sqr(x[6]));
24525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
24625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
24725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Sum of squares of elements of x.
24825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
24925668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_SquareSum9(double x[9])
25025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
25125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return(db_sqr(x[0])+db_sqr(x[1])+db_sqr(x[2])+
25225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        db_sqr(x[3])+db_sqr(x[4])+db_sqr(x[5])+
25325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        db_sqr(x[6])+db_sqr(x[7])+db_sqr(x[8]));
25425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
25525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
25625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Copy a vector.
25725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param xd destination
25825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param xs source
25925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
26025668cd6ed661c59295cb65348a126fb245757d4Michael Kolbvoid inline db_Copy3(double xd[3],const double xs[3])
26125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
26225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    xd[0]=xs[0];xd[1]=xs[1];xd[2]=xs[2];
26325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
26425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
26525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Copy a vector.
26625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param xd destination
26725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param xs source
26825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
26925668cd6ed661c59295cb65348a126fb245757d4Michael Kolbvoid inline db_Copy6(double xd[6],const double xs[6])
27025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
27125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    xd[0]=xs[0];xd[1]=xs[1];xd[2]=xs[2];
27225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    xd[3]=xs[3];xd[4]=xs[4];xd[5]=xs[5];
27325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
27425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
27525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Copy a vector.
27625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param xd destination
27725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param xs source
27825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
27925668cd6ed661c59295cb65348a126fb245757d4Michael Kolbvoid inline db_Copy9(double xd[9],const double xs[9])
28025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
28125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    xd[0]=xs[0];xd[1]=xs[1];xd[2]=xs[2];
28225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    xd[3]=xs[3];xd[4]=xs[4];xd[5]=xs[5];
28325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    xd[6]=xs[6];xd[7]=xs[7];xd[8]=xs[8];
28425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
28525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
28625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
28725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Scalar product: Transpose(A)*B.
28825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
28925668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_ScalarProduct4(const double A[4],const double B[4])
29025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
29125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return(A[0]*B[0]+A[1]*B[1]+A[2]*B[2]+A[3]*B[3]);
29225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
29325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
29425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Scalar product: Transpose(A)*B.
29525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
29625668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_ScalarProduct7(const double A[7],const double B[7])
29725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
29825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return(A[0]*B[0]+A[1]*B[1]+A[2]*B[2]+
29925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        A[3]*B[3]+A[4]*B[4]+A[5]*B[5]+
30025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        A[6]*B[6]);
30125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
30225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
30325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Scalar product: Transpose(A)*B.
30425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
30525668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline double db_ScalarProduct9(const double A[9],const double B[9])
30625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
30725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return(A[0]*B[0]+A[1]*B[1]+A[2]*B[2]+
30825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        A[3]*B[3]+A[4]*B[4]+A[5]*B[5]+
30925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb        A[6]*B[6]+A[7]*B[7]+A[8]*B[8]);
31025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
31125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
31225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Vector addition: S=A+B.
31325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
31425668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline void db_AddVectors6(double S[6],const double A[6],const double B[6])
31525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
31625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    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];
31725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    S[5]=A[5]+B[5];
31825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
31925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
32025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Multiplication: C(3x1)=A(3x3)*B(3x1).
32125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
32225668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline void db_Multiply3x3_3x1(double y[3],const double A[9],const double x[3])
32325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
32425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    y[0]=A[0]*x[0]+A[1]*x[1]+A[2]*x[2];
32525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    y[1]=A[3]*x[0]+A[4]*x[1]+A[5]*x[2];
32625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    y[2]=A[6]*x[0]+A[7]*x[1]+A[8]*x[2];
32725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
32825668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline void db_Multiply3x3_3x3(double C[9], const double A[9],const double B[9])
32925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
33025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    C[0]=A[0]*B[0]+A[1]*B[3]+A[2]*B[6];
33125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    C[1]=A[0]*B[1]+A[1]*B[4]+A[2]*B[7];
33225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    C[2]=A[0]*B[2]+A[1]*B[5]+A[2]*B[8];
33325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
33425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    C[3]=A[3]*B[0]+A[4]*B[3]+A[5]*B[6];
33525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    C[4]=A[3]*B[1]+A[4]*B[4]+A[5]*B[7];
33625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    C[5]=A[3]*B[2]+A[4]*B[5]+A[5]*B[8];
33725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
33825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    C[6]=A[6]*B[0]+A[7]*B[3]+A[8]*B[6];
33925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    C[7]=A[6]*B[1]+A[7]*B[4]+A[8]*B[7];
34025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    C[8]=A[6]*B[2]+A[7]*B[5]+A[8]*B[8];
34125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
34225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
34325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Multiplication: C(4x1)=A(4x4)*B(4x1).
34425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
34525668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline void db_Multiply4x4_4x1(double y[4],const double A[16],const double x[4])
34625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
34725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    y[0]=A[0]*x[0]+A[1]*x[1]+A[2]*x[2]+A[3]*x[3];
34825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    y[1]=A[4]*x[0]+A[5]*x[1]+A[6]*x[2]+A[7]*x[3];
34925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    y[2]=A[8]*x[0]+A[9]*x[1]+A[10]*x[2]+A[11]*x[3];
35025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    y[3]=A[12]*x[0]+A[13]*x[1]+A[14]*x[2]+A[15]*x[3];
35125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
35225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
35325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Scalar multiplication in place: A(3)=mult*A(3).
35425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
35525668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline void db_MultiplyScalar3(double *A,double mult)
35625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
35725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    (*A++) *= mult; (*A++) *= mult; (*A++) *= mult;
35825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
35925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
36025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
36125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Scalar multiplication: A(3)=mult*B(3).
36225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
36325668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline void db_MultiplyScalarCopy3(double *A,const double *B,double mult)
36425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
36525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult;
36625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
36725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
36825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
36925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Scalar multiplication: A(4)=mult*B(4).
37025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
37125668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline void db_MultiplyScalarCopy4(double *A,const double *B,double mult)
37225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
37325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult;
37425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
37525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
37625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Scalar multiplication: A(7)=mult*B(7).
37725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
37825668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline void db_MultiplyScalarCopy7(double *A,const double *B,double mult)
37925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
38025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult;
38125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    (*A++)=(*B++)*mult; (*A++)=(*B++)*mult;
38225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
38325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
38425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Scalar multiplication: A(9)=mult*B(9).
38525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
38625668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline void db_MultiplyScalarCopy9(double *A,const double *B,double mult)
38725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
38825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult;
38925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult; (*A++)=(*B++)*mult;
39025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
39125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
39225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
39325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \defgroup LMImageBasicUtilities (LM) Basic Image Utility Functions
39425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
39525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb Images in db are simply 2D arrays of unsigned char or float types.
39625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb Only the very basic operations are supported: allocation/deallocation,
39725668cd6ed661c59295cb65348a126fb245757d4Michael Kolbcopying, simple pyramid construction and LUT warping. These images are used
39825668cd6ed661c59295cb65348a126fb245757d4Michael Kolbby db_CornerDetector_u and db_Matcher_u. The db_Image class is an attempt
39925668cd6ed661c59295cb65348a126fb245757d4Michael Kolbto wrap these images. It has not been tested well.
40025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
40125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
40225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*\{*/
40325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
40425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Given a float image array, allocates and returns the set of row poiners.
40525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param im    image pointer
40625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param w     image width
40725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param h     image height
40825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
40925668cd6ed661c59295cb65348a126fb245757d4Michael KolbDB_API float** db_SetupImageReferences_f(float *im,int w,int h);
41025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
41125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Allocate a float image.
41225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Note: for feature detection images must be overallocated by 256 bytes.
41325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param w                 width
41425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param h                 height
41525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param over_allocation   allocate this many extra bytes at the end
41625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \return row array pointer
41725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
41825668cd6ed661c59295cb65348a126fb245757d4Michael KolbDB_API float** db_AllocImage_f(int w,int h,int over_allocation=256);
41925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
42025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Free a float image
42125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param img   row array pointer
42225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param h     image height (number of rows)
42325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
42425668cd6ed661c59295cb65348a126fb245757d4Michael KolbDB_API void db_FreeImage_f(float **img,int h);
42525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
42625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Given an unsigned char image array, allocates and returns the set of row poiners.
42725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param im    image pointer
42825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param w     image width
42925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param h     image height
43025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
43125668cd6ed661c59295cb65348a126fb245757d4Michael KolbDB_API unsigned char** db_SetupImageReferences_u(unsigned char *im,int w,int h);
43225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
43325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Allocate an unsigned char image.
43425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Note: for feature detection images must be overallocated by 256 bytes.
43525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param w                 width
43625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param h                 height
43725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param over_allocation   allocate this many extra bytes at the end
43825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \return row array pointer
43925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
44025668cd6ed661c59295cb65348a126fb245757d4Michael KolbDB_API unsigned char** db_AllocImage_u(int w,int h,int over_allocation=256);
44125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
44225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Free an unsigned char image
44325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param img   row array pointer
44425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param h     image height (number of rows)
44525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
44625668cd6ed661c59295cb65348a126fb245757d4Michael KolbDB_API void db_FreeImage_u(unsigned char **img,int h);
44725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
44825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
44925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb Copy an image from s to d. Both s and d must be pre-allocated at of the same size.
45025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb Copy is done row by row.
45125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb \param s   source
45225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb \param d   destination
45325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb \param w   width
45425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb \param h   height
45525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb \param over_allocation copy this many bytes after the end of the last line
45625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
45725668cd6ed661c59295cb65348a126fb245757d4Michael KolbDB_API void db_CopyImage_u(unsigned char **d,const unsigned char * const *s,int w,int h,int over_allocation=0);
45825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
45925668cd6ed661c59295cb65348a126fb245757d4Michael KolbDB_API inline unsigned char db_BilinearInterpolation(double y, double x, const unsigned char * const * v)
46025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
46125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    int floor_x=(int) x;
46225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    int floor_y=(int) y;
46325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
46425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    int ceil_x=floor_x+1;
46525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    int ceil_y=floor_y+1;
46625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
46725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    unsigned char f00 = v[floor_y][floor_x];
46825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    unsigned char f01 = v[floor_y][ceil_x];
46925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    unsigned char f10 = v[ceil_y][floor_x];
47025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    unsigned char f11 = v[ceil_y][ceil_x];
47125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
47225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    double xl = x-floor_x;
47325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    double yl = y-floor_y;
47425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
47525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    return (unsigned char)(f00*(1-yl)*(1-xl) + f10*yl*(1-xl) + f01*(1-yl)*xl + f11*yl*xl);
47625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
47725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*\}*/
47825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
47925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \ingroup LMRotation
48025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Compute an incremental rotation matrix using the update dx=[sin(phi) sin(ohm) sin(kap)]
48125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
48225668cd6ed661c59295cb65348a126fb245757d4Michael Kolbinline void db_IncrementalRotationMatrix(double R[9],const double dx[3])
48325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
48425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    double sp,so,sk,om_sp2,om_so2,om_sk2,cp,co,ck,sp_so,cp_so;
48525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
48625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    /*Store sines*/
48725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    sp=dx[0]; so=dx[1]; sk=dx[2];
48825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    om_sp2=1.0-sp*sp;
48925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    om_so2=1.0-so*so;
49025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    om_sk2=1.0-sk*sk;
49125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    /*Compute cosines*/
49225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    cp=(om_sp2>=0.0)?sqrt(om_sp2):1.0;
49325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    co=(om_so2>=0.0)?sqrt(om_so2):1.0;
49425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    ck=(om_sk2>=0.0)?sqrt(om_sk2):1.0;
49525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    /*Compute matrix*/
49625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    sp_so=sp*so;
49725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    cp_so=cp*so;
49825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    R[0]=sp_so*sk+cp*ck; R[1]=co*sk; R[2]=cp_so*sk-sp*ck;
49925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    R[3]=sp_so*ck-cp*sk; R[4]=co*ck; R[5]=cp_so*ck+sp*sk;
50025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    R[6]=sp*co;          R[7]= -so;  R[8]=cp*co;
50125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
50225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
50325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Zero out 2 vector in place.
50425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
50525668cd6ed661c59295cb65348a126fb245757d4Michael Kolbvoid inline db_Zero2(double x[2])
50625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
50725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    x[0]=x[1]=0;
50825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
50925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
51025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Zero out 3 vector in place.
51125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
51225668cd6ed661c59295cb65348a126fb245757d4Michael Kolbvoid inline db_Zero3(double x[3])
51325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
51425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    x[0]=x[1]=x[2]=0;
51525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
51625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
51725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Zero out 4 vector in place.
51825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
51925668cd6ed661c59295cb65348a126fb245757d4Michael Kolbvoid inline db_Zero4(double x[4])
52025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
52125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    x[0]=x[1]=x[2]=x[3]=0;
52225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
52325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
52425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Zero out 9 vector in place.
52525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
52625668cd6ed661c59295cb65348a126fb245757d4Michael Kolbvoid inline db_Zero9(double x[9])
52725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb{
52825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb    x[0]=x[1]=x[2]=x[3]=x[4]=x[5]=x[6]=x[7]=x[8]=0;
52925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb}
53025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
53125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#define DB_WARP_FAST        0
53225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#define DB_WARP_BILINEAR    1
53325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
53425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/*!
53525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Perform a look-up table warp.
53625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * The LUTs must be float images of the same size as source image.
53725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * The source value x_s is determined from destination (x_d,y_d) through lut_x
53825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * and y_s is determined from lut_y:
53925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb   \code
54025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb   x_s = lut_x[y_d][x_d];
54125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb   y_s = lut_y[y_d][x_d];
54225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb   \endcode
54325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
54425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param src   source image
54525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param dst   destination image
54625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param w     width
54725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param h     height
54825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param lut_x LUT for x
54925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param lut_y LUT for y
55025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * \param type  warp type (DB_WARP_FAST or DB_WARP_BILINEAR)
55125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */
55225668cd6ed661c59295cb65348a126fb245757d4Michael KolbDB_API void db_WarpImageLut_u(const unsigned char * const * src,unsigned char ** dst, int w, int h,
55325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb                               const float * const * lut_x, const float * const * lut_y, int type=DB_WARP_BILINEAR);
55425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
55525668cd6ed661c59295cb65348a126fb245757d4Michael KolbDB_API void db_PrintDoubleVector(double *a,long size);
55625668cd6ed661c59295cb65348a126fb245757d4Michael KolbDB_API void db_PrintDoubleMatrix(double *a,long rows,long cols);
55725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
55825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include "db_utilities_constants.h"
55925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include "db_utilities_algebra.h"
56025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include "db_utilities_indexing.h"
56125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include "db_utilities_linalg.h"
56225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include "db_utilities_poly.h"
56325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include "db_utilities_geometry.h"
56425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include "db_utilities_random.h"
56525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include "db_utilities_rotation.h"
56625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#include "db_utilities_camera.h"
56725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
56825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#define DB_INVALID (-1)
56925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
57025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb
57125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb#endif /* DB_UTILITIES_H */
572