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
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cvaux.h"
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define PATH_TO_E       1
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define PATH_TO_SE      2
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define PATH_TO_S       3
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define K_S         2
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define E_S         2
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define C_S         .01
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define K_Z         5000
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define K_NM        50000
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define K_B         40
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define NULL_EDGE   0.001f
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define inf         DBL_MAX
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct __CvWork
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double w_east;
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double w_southeast;
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double w_south;
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char path_e;
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char path_se;
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char path_s;
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}_CvWork;
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renndouble _cvBendingWork(  CvPoint2D32f* B0,
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CvPoint2D32f* F0,
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CvPoint2D32f* B1,
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CvPoint2D32f* F1/*,
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CvPoint* K */);
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renndouble _cvStretchingWork(CvPoint2D32f* P1,
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         CvPoint2D32f* P2);
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid _cvWorkEast     (int i, int j, _CvWork** W, CvPoint2D32f* edges1, CvPoint2D32f* edges2);
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid _cvWorkSouthEast(int i, int j, _CvWork** W, CvPoint2D32f* edges1, CvPoint2D32f* edges2);
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid _cvWorkSouth    (int i, int j, _CvWork** W, CvPoint2D32f* edges1, CvPoint2D32f* edges2);
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvPoint2D32f null_edge = {0,0};
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renndouble _cvStretchingWork(CvPoint2D32f* P1,
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         CvPoint2D32f* P2)
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double L1,L2, L_min, dL;
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    L1 = sqrt( (double)P1->x*P1->x + P1->y*P1->y);
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    L2 = sqrt( (double)P2->x*P2->x + P2->y*P2->y);
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    L_min = MIN(L1, L2);
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dL = fabs( L1 - L2 );
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return K_S * pow( dL, E_S ) / ( L_min + C_S*dL );
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn////////////////////////////////////////////////////////////////////////////////////
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renndouble _cvBendingWork(  CvPoint2D32f* B0,
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CvPoint2D32f* F0,
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CvPoint2D32f* B1,
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CvPoint2D32f* F1/*,
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CvPoint* K*/)
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f Q( CvPoint2D32f q0, CvPoint2D32f q1, CvPoint2D32f q2, double t );
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double angle( CvPoint2D32f A, CvPoint2D32f B );
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f Q0, Q1, Q2;
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f Q1_nm = { 0, 0 }, Q2_nm = { 0, 0 };
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double d0, d1, d2, des, t_zero;
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double k_zero, k_nonmon;
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f center;
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double check01, check02;
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char check_origin;
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double d_angle, d_nm_angle;
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (B0->x==0) && (B0->y==0) )
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (F0->x==0) && (F0->y==0) )
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B1->x = -B1->x;
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B1->y = -B1->y;
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = acos( (B1->x*F1->x + B1->y*F1->y)/sqrt( (B1->x*B1->x + B1->y*B1->y)*(F1->x*F1->x + F1->y*F1->y) ) );
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = CV_PI - d_angle;
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B1->x = -B1->x;
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B1->y = -B1->y;
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            //return d_angle*K_B;
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return 100;
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        K->x = -K->x;
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        K->y = -K->y;
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        B1->x = -B1->x;
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        B1->y = -B1->y;
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        d_angle = acos( (B1->x*F1->x + B1->y*F1->y)/sqrt( (B1->x*B1->x + B1->y*B1->y)*(F1->x*F1->x + F1->y*F1->y) ) );
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        d_angle = d_angle - acos( (F0->x*K->x + F0->y*K->y)/sqrt( (F0->x*F0->x + F0->y*F0->y)*(K->x*K->x + K->y*K->y) ) );
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        d_angle = d_angle - CV_PI*0.5;
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        d_angle = fabs(d_angle);
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        K->x = -K->x;
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        K->y = -K->y;
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        B1->x = -B1->x;
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        B1->y = -B1->y;
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        //return d_angle*K_B;
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return 100;
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (F0->x==0) && (F0->y==0) )
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            K->x = -K->x;
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            K->y = -K->y;
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B1->x = -B1->x;
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B1->y = -B1->y;
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = acos( (B1->x*F1->x + B1->y*F1->y)/sqrt( (B1->x*B1->x + B1->y*B1->y)*(F1->x*F1->x + F1->y*F1->y) ) );
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = d_angle - acos( (B0->x*K->x + B0->y*K->y)/sqrt( (B0->x*B0->x + B0->y*B0->y)*(K->x*K->x + K->y*K->y) ) );
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = d_angle - CV_PI*0.5;
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = fabs(d_angle);
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            K->x = -K->x;
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            K->y = -K->y;
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B1->x = -B1->x;
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B1->y = -B1->y;
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            //return d_angle*K_B;
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return 100;
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn///////////////
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (B1->x==0) && (B1->y==0) )
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (F1->x==0) && (F1->y==0) )
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B0->x = -B0->x;
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B0->y = -B0->y;
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = acos( (B0->x*F0->x + B0->y*F0->y)/sqrt( (B0->x*B0->x + B0->y*B0->y)*(F0->x*F0->x + F0->y*F0->y) ) );
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = CV_PI - d_angle;
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B0->x = -B0->x;
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B0->y = -B0->y;
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            //return d_angle*K_B;
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return 100;
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        K->x = -K->x;
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        K->y = -K->y;
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        B0->x = -B0->x;
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        B0->y = -B0->y;
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        d_angle = acos( (B0->x*F0->x + B0->y*F0->y)/sqrt( (B0->x*B0->x + B0->y*B0->y)*(F0->x*F0->x + F0->y*F0->y) ) );
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        d_angle = d_angle - acos( (F1->x*K->x + F1->y*K->y)/sqrt( (F1->x*F1->x + F1->y*F1->y)*(K->x*K->x + K->y*K->y) ) );
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        d_angle = d_angle - CV_PI*0.5;
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        d_angle = fabs(d_angle);
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        K->x = -K->x;
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        K->y = -K->y;
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        B0->x = -B0->x;
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        B0->y = -B0->y;
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        //return d_angle*K_B;
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return 100;
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (F1->x==0) && (F1->y==0) )
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            K->x = -K->x;
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            K->y = -K->y;
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B0->x = -B0->x;
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B0->y = -B0->y;
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = acos( (B0->x*F0->x + B0->y*F0->y)/sqrt( (B0->x*B0->x + B0->y*B0->y)*(F0->x*F0->x + F0->y*F0->y) ) );
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = d_angle - acos( (B1->x*K->x + B1->y*K->y)/sqrt( (B1->x*B1->x + B1->y*B1->y)*(K->x*K->x + K->y*K->y) ) );
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = d_angle - CV_PI*0.5;
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = fabs(d_angle);
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            K->x  = -K->x;
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            K->y  = -K->y;
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B0->x = -B0->x;
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            B0->y = -B0->y;
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            //return d_angle*K_B;
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return 100;
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    B0->x = -B0->x;
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    B0->y = -B0->y;
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    B1->x = -B1->x;
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    B1->y = -B1->y;
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Q0.x = F0->x * (-B0->x) + F0->y * (-B0->y);
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Q0.y = F0->x * (-B0->y) - F0->y * (-B0->x);
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Q1.x = 0.5f*( (F1->x * (-B0->x) + F1->y * (-B0->y)) + (F0->x * (-B1->x) + F0->y * (-B1->y)) );
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Q1.y = 0.5f*( (F1->x * (-B0->y) - F1->y * (-B0->x)) + (F0->x * (-B1->y) - F0->y * (-B1->x)) );
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Q2.x = F1->x * (-B1->x) + F1->y * (-B1->y);
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Q2.y = F1->x * (-B1->y) - F1->y * (-B1->x);
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    d0 = Q0.x * Q1.y - Q0.y * Q1.x;
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    d1 = 0.5f*(Q0.x * Q2.y - Q0.y * Q2.x);
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    d2 = Q1.x * Q2.y - Q1.y * Q2.x;
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Check angles goes to zero
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    des = Q1.y*Q1.y - Q0.y*Q2.y;
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    k_zero = 0;
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( des >= 0 )
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t_zero = ( Q0.y - Q1.y + sqrt(des) )/( Q0.y - 2*Q1.y + Q2.y );
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (0 < t_zero) && (t_zero < 1) && ( Q(Q0, Q1, Q2, t_zero).x > 0 ) )
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            k_zero = inf;
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t_zero = ( Q0.y - Q1.y - sqrt(des) )/( Q0.y - 2*Q1.y + Q2.y );
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (0 < t_zero) && (t_zero < 1) && ( Q(Q0, Q1, Q2, t_zero).x > 0 ) )
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            k_zero = inf;
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Check nonmonotonic
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    des = d1*d1 - d0*d2;
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    k_nonmon = 0;
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( des >= 0 )
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t_zero = ( d0 - d1 - sqrt(des) )/( d0 - 2*d1 + d2 );
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (0 < t_zero) && (t_zero < 1) )
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            k_nonmon = 1;
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            Q1_nm = Q(Q0, Q1, Q2, t_zero);
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        t_zero = ( d0 - d1 + sqrt(des) )/( d0 - 2*d1 + d2 );
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (0 < t_zero) && (t_zero < 1) )
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            k_nonmon += 2;
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            Q2_nm = Q(Q0, Q1, Q2, t_zero);
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Finde origin lie in Q0Q1Q2
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    check_origin = 1;
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    center.x = (Q0.x + Q1.x + Q2.x)/3;
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    center.y = (Q0.y + Q1.y + Q2.y)/3;
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    check01 = (center.x - Q0.x)*(Q1.y - Q0.y) + (center.y - Q0.y)*(Q1.x - Q0.x);
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    check02 = (-Q0.x)*(Q1.y - Q0.y) + (-Q0.y)*(Q1.x - Q0.x);
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( check01*check02 > 0 )
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        check01 = (center.x - Q1.x)*(Q2.y - Q1.y) + (center.y - Q1.y)*(Q2.x - Q1.x);
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        check02 = (-Q1.x)*(Q2.y - Q1.y) + (-Q1.y)*(Q2.x - Q1.x);
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( check01*check02 > 0 )
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            check01 = (center.x - Q2.x)*(Q0.y - Q2.y) + (center.y - Q2.y)*(Q0.x - Q2.x);
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            check02 = (-Q2.x)*(Q0.y - Q2.y) + (-Q2.y)*(Q0.x - Q2.x);
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( check01*check02 > 0 )
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                check_origin = 0;
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Calculate angle
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    d_nm_angle = 0;
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    d_angle = angle(Q0,Q2);
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( k_nonmon == 0 )
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( check_origin == 0 )
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_angle = 2*CV_PI - d_angle;
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( k_nonmon == 1 )
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_nm_angle = angle(Q0,Q1_nm);
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(d_nm_angle > d_angle)
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                d_nm_angle = d_nm_angle - d_angle;
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( k_nonmon == 2 )
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_nm_angle = angle(Q0,Q2_nm);
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(d_nm_angle > d_angle)
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                d_nm_angle = d_nm_angle - d_angle;
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( k_nonmon == 3 )
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            d_nm_angle = angle(Q0,Q1_nm);
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if(d_nm_angle > d_angle)
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                d_nm_angle = d_nm_angle - d_angle;
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                d_nm_angle = d_nm_angle + angle(Q0, Q2_nm);
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                d_nm_angle = d_nm_angle + angle(Q2,Q2_nm);
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    B0->x = -B0->x;
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    B0->y = -B0->y;
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    B1->x = -B1->x;
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    B1->y = -B1->y;
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return d_angle*K_B + d_nm_angle*K_NM + k_zero*K_Z;
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //return 0;
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////////////////////////////////////////////////////////////////
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid _cvWorkEast(int i, int j, _CvWork** W, CvPoint2D32f* edges1, CvPoint2D32f* edges2)
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double w1,w2;
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f small_edge;
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //W[i,j].w_east
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    w1 = W[i-1][j].w_east /*+ _cvBendingWork(   &edges1[i-2],
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            &edges1[i-1],
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            &null_edge ,
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            &null_edge,
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            NULL)*/;
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    small_edge.x = NULL_EDGE*edges1[i-1].x;
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    small_edge.y = NULL_EDGE*edges1[i-1].y;
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    w2 = W[i-1][j].w_southeast + _cvBendingWork(&edges1[i-2],
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                &edges1[i-1],
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                &edges2[j-1],
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                /*&null_edge*/&small_edge/*,
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                &edges2[j]*/);
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if(w1<w2)
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_east = w1 + _cvStretchingWork( &edges1[i-1], &null_edge );
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].path_e = PATH_TO_E;
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_east = w2 + _cvStretchingWork( &edges1[i-1], &null_edge );
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].path_e = PATH_TO_SE;
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn////////////////////////////////////////////////////////////////////////////////////
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid _cvWorkSouthEast(int i, int j, _CvWork** W, CvPoint2D32f* edges1, CvPoint2D32f* edges2)
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double w1,w2,w3;
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f small_edge;
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //W[i,j].w_southeast
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    small_edge.x = NULL_EDGE*edges1[i-2].x;
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    small_edge.y = NULL_EDGE*edges1[i-2].y;
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    w1 = W[i-1][j-1].w_east + _cvBendingWork(&edges1[i-2],
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            &edges1[i-1],
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            /*&null_edge*/&small_edge,
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            &edges2[j-1]/*,
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            &edges2[j-2]*/);
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    w2 = W[i-1][j-1].w_southeast + _cvBendingWork(  &edges1[i-2],
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    &edges1[i-1],
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    &edges2[j-2],
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    &edges2[j-1]/*,
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    NULL*/);
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    small_edge.x = NULL_EDGE*edges2[j-2].x;
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    small_edge.y = NULL_EDGE*edges2[j-2].y;
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    w3 = W[i-1][j-1].w_south + _cvBendingWork(  /*&null_edge*/&small_edge,
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                &edges1[i-1],
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                &edges2[j-2],
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                &edges2[j-1]/*,
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                &edges1[i-2]*/);
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( w1<w2 )
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if(w1<w3)
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            W[i][j].w_southeast = w1 + _cvStretchingWork( &edges1[i-1], &edges2[j-1] );
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            W[i][j].path_se = PATH_TO_E;
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            W[i][j].w_southeast = w3 + _cvStretchingWork( &edges1[i-1], &edges2[j-1] );
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            W[i][j].path_se = 3;
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( w2<w3)
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            W[i][j].w_southeast = w2 + _cvStretchingWork( &edges1[i-1], &edges2[j-1] );
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            W[i][j].path_se = PATH_TO_SE;
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            W[i][j].w_southeast = w3 + _cvStretchingWork( &edges1[i-1], &edges2[j-1] );
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            W[i][j].path_se = 3;
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//////////////////////////////////////////////////////////////////////////////////////
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid _cvWorkSouth(int i, int j, _CvWork** W, CvPoint2D32f* edges1, CvPoint2D32f* edges2)
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double w1,w2;
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f small_edge;
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //W[i,j].w_south
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    small_edge.x = NULL_EDGE*edges2[j-1].x;
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    small_edge.y = NULL_EDGE*edges2[j-1].y;
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    w1 = W[i][j-1].w_southeast + _cvBendingWork(&edges1[i-1],
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                /*&null_edge*/&small_edge,
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                &edges2[j-2],
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                &edges2[j-1]/*,
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                &edges1[i]*/);
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    w2 = W[i][j-1].w_south /*+ _cvBendingWork(  &null_edge ,
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            &null_edge,
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            &edges2[j-2],
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            &edges2[j-1],
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            NULL)*/;
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( w1<w2 )
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_south = w1 + _cvStretchingWork( &null_edge, &edges2[j-1] );
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].path_s = PATH_TO_SE;
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_south = w2 + _cvStretchingWork( &null_edge, &edges2[j-1] );
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].path_s = 3;
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//===================================================
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvPoint2D32f Q(CvPoint2D32f q0,CvPoint2D32f q1,CvPoint2D32f q2,double t)
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f q;
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    q.x = (float)(q0.x*(1-t)*(1-t) + 2*q1.x*t*(1-t) + q2.x*t*t);
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    q.y = (float)(q0.y*(1-t)*(1-t) + 2*q1.y*t*(1-t) + q2.y*t*t);
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return q;
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renndouble angle(CvPoint2D32f A, CvPoint2D32f B)
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return acos( (A.x*B.x + A.y*B.y)/sqrt( (double)(A.x*A.x + A.y*A.y)*(B.x*B.x + B.y*B.y) ) );
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/***************************************************************************************\
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*   This function compute intermediate polygon between contour1 and contour2
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*   Correspondence between points of contours specify by corr
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*   param = [0,1];  0 correspondence to contour1, 1 - contour2
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\***************************************************************************************/
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSeq* icvBlendContours(CvSeq* contour1,
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CvSeq* contour2,
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CvSeq* corr,
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        double param,
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CvMemStorage* storage)
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int j;
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeqWriter writer01;
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeqReader reader01;
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int Ni,Nj;              // size of contours
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                  // counter
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint* point1;        // array of first contour point
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint* point2;        // array of second contour point
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint point_output;   // intermediate storage of ouput point
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int corr_point;
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Create output sequence.
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeq* output = cvCreateSeq(0,
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                sizeof(CvSeq),
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                sizeof(CvPoint),
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                storage );
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Find size of contours.
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Ni = contour1->total + 1;
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Nj = contour2->total + 1;
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    point1 = (CvPoint* )malloc( Ni*sizeof(CvPoint) );
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    point2 = (CvPoint* )malloc( Nj*sizeof(CvPoint) );
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Initialize arrays of point
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvCvtSeqToArray( contour1, point1, CV_WHOLE_SEQ );
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvCvtSeqToArray( contour2, point2, CV_WHOLE_SEQ );
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // First and last point mast be equal.
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    point1[Ni-1] = point1[0];
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    point2[Nj-1] = point2[0];
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Initializes process of writing to sequence.
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvStartAppendToSeq( output, &writer01);
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    i = Ni-1; //correspondence to points of contour1
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; corr; corr = corr->h_next )
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        //Initializes process of sequential reading from sequence
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvStartReadSeq( corr, &reader01, 0 );
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(j=0; j < corr->total; j++)
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            // Read element from sequence.
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_READ_SEQ_ELEM( corr_point, reader01 );
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            // Compute point of intermediate polygon.
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            point_output.x = cvRound(point1[i].x + param*( point2[corr_point].x - point1[i].x ));
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            point_output.y = cvRound(point1[i].y + param*( point2[corr_point].y - point1[i].y ));
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            // Write element to sequence.
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_WRITE_SEQ_ELEM( point_output, writer01 );
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i--;
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Updates sequence header.
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvFlushSeqWriter( &writer01 );
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return output;
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/**************************************************************************************************
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn**************************************************************************************************/
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid icvCalcContoursCorrespondence(CvSeq* contour1,
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   CvSeq* contour2,
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   CvSeq** corr,
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   CvMemStorage* storage)
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i,j;                    // counter of cycles
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int Ni,Nj;                  // size of contours
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    _CvWork** W;                // graph for search minimum of work
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint* point1;            // array of first contour point
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint* point2;            // array of second contour point
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f* edges1;       // array of first contour edge
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f* edges2;       // array of second contour edge
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //CvPoint null_edge = {0,0};    //
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f small_edge;
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //double inf;                   // infinity
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeq* corr01;
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeqWriter writer;
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char path;                  //
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Find size of contours
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Ni = contour1->total + 1;
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Nj = contour2->total + 1;
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Create arrays
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    W = (_CvWork**)malloc(sizeof(_CvWork*)*Ni);
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for(i=0; i<Ni; i++)
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i] = (_CvWork*)malloc(sizeof(_CvWork)*Nj);
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    point1 = (CvPoint* )malloc( Ni*sizeof(CvPoint) );
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    point2 = (CvPoint* )malloc( Nj*sizeof(CvPoint) );
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    edges1 = (CvPoint2D32f* )malloc( (Ni-1)*sizeof(CvPoint2D32f) );
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    edges2 = (CvPoint2D32f* )malloc( (Nj-1)*sizeof(CvPoint2D32f) );
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Initialize arrays of point
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvCvtSeqToArray( contour1, point1, CV_WHOLE_SEQ );
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvCvtSeqToArray( contour2, point2, CV_WHOLE_SEQ );
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    point1[Ni-1] = point1[0];
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    point2[Nj-1] = point2[0];
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for(i=0;i<Ni-1;i++)
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        edges1[i].x = (float)( point1[i+1].x - point1[i].x );
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        edges1[i].y = (float)( point1[i+1].y - point1[i].y );
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for(i=0;i<Nj-1;i++)
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        edges2[i].x = (float)( point2[i+1].x - point2[i].x );
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        edges2[i].y = (float)( point2[i+1].y - point2[i].y );
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Find infinity constant
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //inf=1;
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//Find min path in graph
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    W[0][0].w_east      = 0;
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    W[0][0].w_south     = 0;
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    W[0][0].w_southeast = 0;
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    W[1][1].w_southeast = _cvStretchingWork( &edges1[0], &edges2[0] );
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    W[1][1].w_east = inf;
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    W[1][1].w_south = inf;
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    W[1][1].path_se = PATH_TO_SE;
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    W[0][1].w_south =  _cvStretchingWork( &null_edge, &edges2[0] );
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    W[0][1].path_s = 3;
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    W[1][0].w_east =  _cvStretchingWork( &edges2[0], &null_edge );
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    W[1][0].path_e = PATH_TO_E;
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i=1; i<Ni; i++ )
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][0].w_south     = inf;
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][0].w_southeast = inf;
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for(j=1; j<Nj; j++)
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[0][j].w_east      = inf;
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[0][j].w_southeast = inf;
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for(i=2; i<Ni; i++)
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        j=0;/////////
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_east = W[i-1][j].w_east;
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_east = W[i][j].w_east /*+
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            _cvBendingWork( &edges1[i-2], &edges1[i-1], &null_edge, &null_edge, NULL )*/;
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_east = W[i][j].w_east + _cvStretchingWork( &edges2[i-1], &null_edge );
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].path_e = PATH_TO_E;
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        j=1;//////////
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_south = inf;
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        _cvWorkEast (i, j, W, edges1, edges2);
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_southeast = W[i-1][j-1].w_east;
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_southeast = W[i][j].w_southeast + _cvStretchingWork( &edges1[i-1], &edges2[j-1] );
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        small_edge.x = NULL_EDGE*edges1[i-2].x;
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        small_edge.y = NULL_EDGE*edges1[i-2].y;
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_southeast = W[i][j].w_southeast +
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            _cvBendingWork( &edges1[i-2], &edges1[i-1], /*&null_edge*/&small_edge, &edges2[j-1]/*, &edges2[Nj-2]*/);
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].path_se = PATH_TO_E;
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for(j=2; j<Nj; j++)
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i=0;//////////
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_south = W[i][j-1].w_south;
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_south = W[i][j].w_south + _cvStretchingWork( &null_edge, &edges2[j-1] );
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_south = W[i][j].w_south /*+
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            _cvBendingWork( &null_edge, &null_edge, &edges2[j-2], &edges2[j-1], NULL )*/;
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].path_s = 3;
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        i=1;///////////
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_east= inf;
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        _cvWorkSouth(i, j, W, edges1, edges2);
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_southeast = W[i-1][j-1].w_south;
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_southeast = W[i][j].w_southeast + _cvStretchingWork( &edges1[i-1], &edges2[j-1] );
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        small_edge.x = NULL_EDGE*edges2[j-2].x;
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        small_edge.y = NULL_EDGE*edges2[j-2].y;
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].w_southeast = W[i][j].w_southeast +
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            _cvBendingWork( /*&null_edge*/&small_edge, &edges1[i-1], &edges2[j-2], &edges2[j-1]/*, &edges1[Ni-2]*/);
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        W[i][j].path_se = 3;
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for(i=2; i<Ni; i++)
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(j=2; j<Nj; j++)
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            _cvWorkEast     (i, j, W, edges1, edges2);
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            _cvWorkSouthEast(i, j, W, edges1, edges2);
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            _cvWorkSouth    (i, j, W, edges1, edges2);
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    i=Ni-1;j=Nj-1;
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *corr = cvCreateSeq(0,
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        sizeof(CvSeq),
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        sizeof(int),
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        storage );
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    corr01 = *corr;
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvStartAppendToSeq( corr01, &writer );
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( W[i][j].w_east > W[i][j].w_southeast )
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( W[i][j].w_southeast > W[i][j].w_south )
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                path = 3;
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                path = PATH_TO_SE;
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( W[i][j].w_east < W[i][j].w_south )
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                path = PATH_TO_E;
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                path = 3;
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    do
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_WRITE_SEQ_ELEM( j, writer );
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        switch( path )
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case PATH_TO_E:
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            path = W[i][j].path_e;
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            i--;
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvFlushSeqWriter( &writer );
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            corr01->h_next = cvCreateSeq(   0,
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            sizeof(CvSeq),
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            sizeof(int),
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            storage );
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            corr01 = corr01->h_next;
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvStartAppendToSeq( corr01, &writer );
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case PATH_TO_SE:
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            path = W[i][j].path_se;
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            j--; i--;
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvFlushSeqWriter( &writer );
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            corr01->h_next = cvCreateSeq(   0,
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            sizeof(CvSeq),
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            sizeof(int),
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            storage );
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            corr01 = corr01->h_next;
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            cvStartAppendToSeq( corr01, &writer );
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        case 3:
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            path = W[i][j].path_s;
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            j--;
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            break;
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    } while( (i>=0) && (j>=0) );
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvFlushSeqWriter( &writer );
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // Free memory
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for(i=1;i<Ni;i++)
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        free(W[i]);
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    free(W);
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    free(point1);
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    free(point2);
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    free(edges1);
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    free(edges2);
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
856