db_utilities.h revision e295e32b68cf04f0d99138bf4a6d25555f3aef99
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