1*e39da397SStephan Aßmus //---------------------------------------------------------------------------- 2*e39da397SStephan Aßmus // Anti-Grain Geometry - Version 2.4 3*e39da397SStephan Aßmus // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) 4*e39da397SStephan Aßmus // 5*e39da397SStephan Aßmus // Permission to copy, use, modify, sell and distribute this software 6*e39da397SStephan Aßmus // is granted provided this copyright notice appears in all copies. 7*e39da397SStephan Aßmus // This software is provided "as is" without express or implied 8*e39da397SStephan Aßmus // warranty, and with no claim as to its suitability for any purpose. 9*e39da397SStephan Aßmus // 10*e39da397SStephan Aßmus //---------------------------------------------------------------------------- 11*e39da397SStephan Aßmus // Contact: mcseem@antigrain.com 12*e39da397SStephan Aßmus // mcseemagg@yahoo.com 13*e39da397SStephan Aßmus // http://www.antigrain.com 14*e39da397SStephan Aßmus //---------------------------------------------------------------------------- 15*e39da397SStephan Aßmus #ifndef AGG_PATH_LENGTH_INCLUDED 16*e39da397SStephan Aßmus #define AGG_PATH_LENGTH_INCLUDED 17*e39da397SStephan Aßmus 18*e39da397SStephan Aßmus #include "agg_math.h" 19*e39da397SStephan Aßmus 20*e39da397SStephan Aßmus namespace agg 21*e39da397SStephan Aßmus { 22*e39da397SStephan Aßmus template<class VertexSource> 23*e39da397SStephan Aßmus double path_length(VertexSource& vs, unsigned path_id = 0) 24*e39da397SStephan Aßmus { 25*e39da397SStephan Aßmus double len = 0.0; 26*e39da397SStephan Aßmus double start_x = 0.0; 27*e39da397SStephan Aßmus double start_y = 0.0; 28*e39da397SStephan Aßmus double x1 = 0.0; 29*e39da397SStephan Aßmus double y1 = 0.0; 30*e39da397SStephan Aßmus double x2 = 0.0; 31*e39da397SStephan Aßmus double y2 = 0.0; 32*e39da397SStephan Aßmus bool first = true; 33*e39da397SStephan Aßmus 34*e39da397SStephan Aßmus unsigned cmd; 35*e39da397SStephan Aßmus vs.rewind(path_id); 36*e39da397SStephan Aßmus while(!is_stop(cmd = vs.vertex(&x2, &y2))) 37*e39da397SStephan Aßmus { 38*e39da397SStephan Aßmus if(is_vertex(cmd)) 39*e39da397SStephan Aßmus { 40*e39da397SStephan Aßmus if(first || is_move_to(cmd)) 41*e39da397SStephan Aßmus { 42*e39da397SStephan Aßmus start_x = x2; 43*e39da397SStephan Aßmus start_y = y2; 44*e39da397SStephan Aßmus } 45*e39da397SStephan Aßmus else 46*e39da397SStephan Aßmus { 47*e39da397SStephan Aßmus len += calc_distance(x1, y1, x2, y2); 48*e39da397SStephan Aßmus } 49*e39da397SStephan Aßmus x1 = x2; 50*e39da397SStephan Aßmus y1 = y2; 51*e39da397SStephan Aßmus first = false; 52*e39da397SStephan Aßmus } 53*e39da397SStephan Aßmus else 54*e39da397SStephan Aßmus { 55*e39da397SStephan Aßmus if(is_close(cmd) && !first) 56*e39da397SStephan Aßmus { 57*e39da397SStephan Aßmus len += calc_distance(x1, y1, start_x, start_y); 58*e39da397SStephan Aßmus } 59*e39da397SStephan Aßmus } 60*e39da397SStephan Aßmus } 61*e39da397SStephan Aßmus return len; 62*e39da397SStephan Aßmus } 63*e39da397SStephan Aßmus } 64*e39da397SStephan Aßmus 65*e39da397SStephan Aßmus #endif 66