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