16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cv.h"
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CV_ACOS_TABLE_SIZE  513
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const float icv_acos_table[_CV_ACOS_TABLE_SIZE] = {
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    3.14159265f, 3.05317551f, 3.01651113f, 2.98834964f, 2.96458497f, 2.94362719f,
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.92466119f, 2.90720289f, 2.89093699f, 2.87564455f, 2.86116621f, 2.84738169f,
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.83419760f, 2.82153967f, 2.80934770f, 2.79757211f, 2.78617145f, 2.77511069f,
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.76435988f, 2.75389319f, 2.74368816f, 2.73372510f, 2.72398665f, 2.71445741f,
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.70512362f, 2.69597298f, 2.68699438f, 2.67817778f, 2.66951407f, 2.66099493f,
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.65261279f, 2.64436066f, 2.63623214f, 2.62822133f, 2.62032277f, 2.61253138f,
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.60484248f, 2.59725167f, 2.58975488f, 2.58234828f, 2.57502832f, 2.56779164f,
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.56063509f, 2.55355572f, 2.54655073f, 2.53961750f, 2.53275354f, 2.52595650f,
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.51922417f, 2.51255441f, 2.50594525f, 2.49939476f, 2.49290115f, 2.48646269f,
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.48007773f, 2.47374472f, 2.46746215f, 2.46122860f, 2.45504269f, 2.44890314f,
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.44280867f, 2.43675809f, 2.43075025f, 2.42478404f, 2.41885841f, 2.41297232f,
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.40712480f, 2.40131491f, 2.39554173f, 2.38980439f, 2.38410204f, 2.37843388f,
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.37279910f, 2.36719697f, 2.36162673f, 2.35608768f, 2.35057914f, 2.34510044f,
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.33965094f, 2.33423003f, 2.32883709f, 2.32347155f, 2.31813284f, 2.31282041f,
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.30753373f, 2.30227228f, 2.29703556f, 2.29182309f, 2.28663439f, 2.28146900f,
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.27632647f, 2.27120637f, 2.26610827f, 2.26103177f, 2.25597646f, 2.25094195f,
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.24592786f, 2.24093382f, 2.23595946f, 2.23100444f, 2.22606842f, 2.22115104f,
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.21625199f, 2.21137096f, 2.20650761f, 2.20166166f, 2.19683280f, 2.19202074f,
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.18722520f, 2.18244590f, 2.17768257f, 2.17293493f, 2.16820274f, 2.16348574f,
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.15878367f, 2.15409630f, 2.14942338f, 2.14476468f, 2.14011997f, 2.13548903f,
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.13087163f, 2.12626757f, 2.12167662f, 2.11709859f, 2.11253326f, 2.10798044f,
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.10343994f, 2.09891156f, 2.09439510f, 2.08989040f, 2.08539725f, 2.08091550f,
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.07644495f, 2.07198545f, 2.06753681f, 2.06309887f, 2.05867147f, 2.05425445f,
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.04984765f, 2.04545092f, 2.04106409f, 2.03668703f, 2.03231957f, 2.02796159f,
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    2.02361292f, 2.01927344f, 2.01494300f, 2.01062146f, 2.00630870f, 2.00200457f,
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.99770895f, 1.99342171f, 1.98914271f, 1.98487185f, 1.98060898f, 1.97635399f,
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.97210676f, 1.96786718f, 1.96363511f, 1.95941046f, 1.95519310f, 1.95098292f,
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.94677982f, 1.94258368f, 1.93839439f, 1.93421185f, 1.93003595f, 1.92586659f,
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.92170367f, 1.91754708f, 1.91339673f, 1.90925250f, 1.90511432f, 1.90098208f,
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.89685568f, 1.89273503f, 1.88862003f, 1.88451060f, 1.88040664f, 1.87630806f,
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.87221477f, 1.86812668f, 1.86404371f, 1.85996577f, 1.85589277f, 1.85182462f,
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.84776125f, 1.84370256f, 1.83964848f, 1.83559892f, 1.83155381f, 1.82751305f,
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.82347658f, 1.81944431f, 1.81541617f, 1.81139207f, 1.80737194f, 1.80335570f,
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.79934328f, 1.79533460f, 1.79132959f, 1.78732817f, 1.78333027f, 1.77933581f,
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.77534473f, 1.77135695f, 1.76737240f, 1.76339101f, 1.75941271f, 1.75543743f,
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.75146510f, 1.74749565f, 1.74352900f, 1.73956511f, 1.73560389f, 1.73164527f,
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.72768920f, 1.72373560f, 1.71978441f, 1.71583556f, 1.71188899f, 1.70794462f,
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.70400241f, 1.70006228f, 1.69612416f, 1.69218799f, 1.68825372f, 1.68432127f,
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.68039058f, 1.67646160f, 1.67253424f, 1.66860847f, 1.66468420f, 1.66076139f,
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.65683996f, 1.65291986f, 1.64900102f, 1.64508338f, 1.64116689f, 1.63725148f,
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.63333709f, 1.62942366f, 1.62551112f, 1.62159943f, 1.61768851f, 1.61377831f,
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.60986877f, 1.60595982f, 1.60205142f, 1.59814349f, 1.59423597f, 1.59032882f,
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.58642196f, 1.58251535f, 1.57860891f, 1.57470259f, 1.57079633f, 1.56689007f,
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.56298375f, 1.55907731f, 1.55517069f, 1.55126383f, 1.54735668f, 1.54344917f,
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.53954124f, 1.53563283f, 1.53172389f, 1.52781434f, 1.52390414f, 1.51999323f,
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.51608153f, 1.51216900f, 1.50825556f, 1.50434117f, 1.50042576f, 1.49650927f,
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.49259163f, 1.48867280f, 1.48475270f, 1.48083127f, 1.47690845f, 1.47298419f,
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.46905841f, 1.46513106f, 1.46120207f, 1.45727138f, 1.45333893f, 1.44940466f,
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.44546850f, 1.44153038f, 1.43759024f, 1.43364803f, 1.42970367f, 1.42575709f,
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.42180825f, 1.41785705f, 1.41390346f, 1.40994738f, 1.40598877f, 1.40202755f,
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.39806365f, 1.39409701f, 1.39012756f, 1.38615522f, 1.38217994f, 1.37820164f,
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.37422025f, 1.37023570f, 1.36624792f, 1.36225684f, 1.35826239f, 1.35426449f,
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.35026307f, 1.34625805f, 1.34224937f, 1.33823695f, 1.33422072f, 1.33020059f,
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.32617649f, 1.32214834f, 1.31811607f, 1.31407960f, 1.31003885f, 1.30599373f,
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.30194417f, 1.29789009f, 1.29383141f, 1.28976803f, 1.28569989f, 1.28162688f,
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.27754894f, 1.27346597f, 1.26937788f, 1.26528459f, 1.26118602f, 1.25708205f,
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.25297262f, 1.24885763f, 1.24473698f, 1.24061058f, 1.23647833f, 1.23234015f,
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.22819593f, 1.22404557f, 1.21988898f, 1.21572606f, 1.21155670f, 1.20738080f,
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.20319826f, 1.19900898f, 1.19481283f, 1.19060973f, 1.18639955f, 1.18218219f,
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.17795754f, 1.17372548f, 1.16948589f, 1.16523866f, 1.16098368f, 1.15672081f,
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.15244994f, 1.14817095f, 1.14388370f, 1.13958808f, 1.13528396f, 1.13097119f,
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.12664966f, 1.12231921f, 1.11797973f, 1.11363107f, 1.10927308f, 1.10490563f,
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.10052856f, 1.09614174f, 1.09174500f, 1.08733820f, 1.08292118f, 1.07849378f,
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.07405585f, 1.06960721f, 1.06514770f, 1.06067715f, 1.05619540f, 1.05170226f,
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.04719755f, 1.04268110f, 1.03815271f, 1.03361221f, 1.02905939f, 1.02449407f,
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1.01991603f, 1.01532509f, 1.01072102f, 1.00610363f, 1.00147268f, 0.99682798f,
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.99216928f, 0.98749636f, 0.98280898f, 0.97810691f, 0.97338991f, 0.96865772f,
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.96391009f, 0.95914675f, 0.95436745f, 0.94957191f, 0.94475985f, 0.93993099f,
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.93508504f, 0.93022170f, 0.92534066f, 0.92044161f, 0.91552424f, 0.91058821f,
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.90563319f, 0.90065884f, 0.89566479f, 0.89065070f, 0.88561619f, 0.88056088f,
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.87548438f, 0.87038629f, 0.86526619f, 0.86012366f, 0.85495827f, 0.84976956f,
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.84455709f, 0.83932037f, 0.83405893f, 0.82877225f, 0.82345981f, 0.81812110f,
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.81275556f, 0.80736262f, 0.80194171f, 0.79649221f, 0.79101352f, 0.78550497f,
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.77996593f, 0.77439569f, 0.76879355f, 0.76315878f, 0.75749061f, 0.75178826f,
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.74605092f, 0.74027775f, 0.73446785f, 0.72862033f, 0.72273425f, 0.71680861f,
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.71084240f, 0.70483456f, 0.69878398f, 0.69268952f, 0.68654996f, 0.68036406f,
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.67413051f, 0.66784794f, 0.66151492f, 0.65512997f, 0.64869151f, 0.64219789f,
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.63564741f, 0.62903824f, 0.62236849f, 0.61563615f, 0.60883911f, 0.60197515f,
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.59504192f, 0.58803694f, 0.58095756f, 0.57380101f, 0.56656433f, 0.55924437f,
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.55183778f, 0.54434099f, 0.53675018f, 0.52906127f, 0.52126988f, 0.51337132f,
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.50536051f, 0.49723200f, 0.48897987f, 0.48059772f, 0.47207859f, 0.46341487f,
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.45459827f, 0.44561967f, 0.43646903f, 0.42713525f, 0.41760600f, 0.40786755f,
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.39790449f, 0.38769946f, 0.37723277f, 0.36648196f, 0.35542120f, 0.34402054f,
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.33224495f, 0.32005298f, 0.30739505f, 0.29421096f, 0.28042645f, 0.26594810f,
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.25065566f, 0.23438976f, 0.21693146f, 0.19796546f, 0.17700769f, 0.15324301f,
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    0.12508152f, 0.08841715f, 0.00000000f
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*F///////////////////////////////////////////////////////////////////////////////////////
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Name: icvCalcPGH
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Purpose:
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//      Calculates PGH(pairwise geometric histogram) for contour given.
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Context:
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Parameters:
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//      contour  - pointer to input contour object.
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//      pgh      - output histogram
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//      ang_dim  - number of angle bins (vertical size of histogram)
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//      dist_dim - number of distance bins (horizontal size of histogram)
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Returns:
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//      CV_OK or error code
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Notes:
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//F*/
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCalcPGH( const CvSeq * contour, float *pgh, int angle_dim, int dist_dim )
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char local_buffer[(1 << 14) + 32];
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float *local_buffer_ptr = (float *)cvAlignPtr(local_buffer,32);
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float *buffer = local_buffer_ptr;
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double angle_scale = (angle_dim - 0.51) / icv_acos_table[0];
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double dist_scale = DBL_EPSILON;
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int buffer_size;
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, count, pass;
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int *pghi = (int *) pgh;
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int hist_size = angle_dim * dist_dim;
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeqReader reader1, reader2;       /* external and internal readers */
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !contour || !pgh )
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( angle_dim <= 0 || angle_dim > 180 || dist_dim <= 0 )
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADRANGE_ERR;
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SEQ_POLYGON( contour ))
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADFLAG_ERR;
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memset( pgh, 0, hist_size * sizeof( pgh[0] ));
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    count = contour->total;
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* allocate buffer for distances */
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    buffer_size = count * sizeof( float );
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( buffer_size > (int)sizeof(local_buffer) - 32 )
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buffer = (float *) cvAlloc( buffer_size );
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !buffer )
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_OUTOFMEM_ERR;
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvStartReadSeq( contour, &reader1, 0 );
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvStartReadSeq( contour, &reader2, 0 );
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* calc & store squared edge lengths, calculate maximal distance between edges */
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < count; i++ )
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvPoint pt1, pt2;
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double dx, dy;
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_READ_EDGE( pt1, pt2, reader1 );
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dx = pt2.x - pt1.x;
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dy = pt2.y - pt1.y;
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buffer[i] = (float)(1./sqrt(dx * dx + dy * dy));
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       do 2 passes.
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       First calculates maximal distance.
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       Second calculates histogram itself.
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     */
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( pass = 1; pass <= 2; pass++ )
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double dist_coeff = 0, angle_coeff = 0;
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        /* run external loop */
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < count; i++ )
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvPoint pt1, pt2;
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int dx, dy;
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int dist = 0;
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_READ_EDGE( pt1, pt2, reader1 );
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dx = pt2.x - pt1.x;
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dy = pt2.y - pt1.y;
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( (dx | dy) != 0 )
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int j;
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( pass == 2 )
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dist_coeff = buffer[i] * dist_scale;
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    angle_coeff = buffer[i] * (_CV_ACOS_TABLE_SIZE / 2);
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                /* run internal loop (for current edge) */
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( j = 0; j < count; j++ )
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CvPoint pt3, pt4;
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_READ_EDGE( pt3, pt4, reader2 );
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( i != j )        /* process edge pair */
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        int d1 = (pt3.y - pt1.y) * dx - (pt3.x - pt1.x) * dy;
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        int d2 = (pt4.y - pt1.y) * dx - (pt2.x - pt1.x) * dy;
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        int cross_flag;
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        int *hist_row = 0;
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        if( pass == 2 )
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            int dp = (pt4.x - pt3.x) * dx + (pt4.y - pt3.y) * dy;
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            dp = cvRound( dp * angle_coeff * buffer[j] ) +
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                (_CV_ACOS_TABLE_SIZE / 2);
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            dp = MAX( dp, 0 );
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            dp = MIN( dp, _CV_ACOS_TABLE_SIZE - 1 );
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            hist_row = pghi + dist_dim *
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                cvRound( icv_acos_table[dp] * angle_scale );
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            d1 = cvRound( d1 * dist_coeff );
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            d2 = cvRound( d2 * dist_coeff );
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        cross_flag = (d1 ^ d2) < 0;
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        d1 = CV_IABS( d1 );
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        d2 = CV_IABS( d2 );
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        if( pass == 2 )
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            if( d1 >= dist_dim )
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                d1 = dist_dim - 1;
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            if( d2 >= dist_dim )
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                d2 = dist_dim - 1;
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            if( !cross_flag )
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            {
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                if( d1 > d2 )   /* make d1 <= d2 */
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                {
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    d1 ^= d2;
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    d2 ^= d1;
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    d1 ^= d2;
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                }
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                for( ; d1 <= d2; d1++ )
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    hist_row[d1]++;
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            }
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            else
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            {
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                for( ; d1 >= 0; d1-- )
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    hist_row[d1]++;
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                for( ; d2 >= 0; d2-- )
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    hist_row[d2]++;
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            }
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        else    /* 1st pass */
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            d1 = CV_IMAX( d1, d2 );
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            dist = CV_IMAX( dist, d1 );
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }           /* end of processing of edge pair */
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }               /* end of internal loop */
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( pass == 1 )
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double scale = dist * buffer[i];
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dist_scale = MAX( dist_scale, scale );
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                       /* end of external loop */
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( pass == 1 )
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dist_scale = (dist_dim - 0.51) / dist_scale;
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* end of pass on loops */
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* convert hist to floats */
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < hist_size; i++ )
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ((float *) pghi)[i] = (float) pghi[i];
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( buffer != local_buffer_ptr )
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvFree( &buffer );
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCalcPGH( const CvSeq * contour, CvHistogram * hist )
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCalcPGH" );
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int size[CV_MAX_DIM];
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int dims;
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_HIST(hist))
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "The histogram header is invalid " );
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_SPARSE_HIST( hist ))
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "Sparse histogram are not supported" );
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dims = cvGetDims( hist->bins, size );
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( dims != 2 )
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadSize, "The histogram must be two-dimensional" );
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_SEQ_POLYGON( contour ) || CV_SEQ_ELTYPE( contour ) != CV_32SC2 )
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "The contour is not valid or the point type is not supported" );
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPPI_CALL( icvCalcPGH( contour, ((CvMatND*)(hist->bins))->data.fl, size[0], size[1] ));
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
364