1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//---------------------------------------------------------------------------- 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Anti-Grain Geometry - Version 2.3 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Permission to copy, use, modify, sell and distribute this software 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// is granted provided this copyright notice appears in all copies. 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// This software is provided "as is" without express or implied 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// warranty, and with no claim as to its suitability for any purpose. 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//---------------------------------------------------------------------------- 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Contact: mcseem@antigrain.com 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// mcseemagg@yahoo.com 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// http://www.antigrain.com 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//---------------------------------------------------------------------------- 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef AGG_SHORTEN_PATH_INCLUDED 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define AGG_SHORTEN_PATH_INCLUDED 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_basics.h" 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "agg_vertex_sequence.h" 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace agg 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtemplate<class VertexSequence> 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid shorten_path(VertexSequence& vs, FX_FLOAT s, unsigned closed = 0) 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef typename VertexSequence::value_type vertex_type; 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(s > 0 && vs.size() > 1) { 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT d; 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int n = int(vs.size() - 2); 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while(n) { 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov d = vs[n].dist; 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(d > s) { 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vs.remove_last(); 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov s -= d; 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov --n; 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(vs.size() < 2) { 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vs.remove_all(); 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov n = vs.size() - 1; 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vertex_type& prev = vs[n - 1]; 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vertex_type& last = vs[n]; 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov d = (prev.dist - s) / prev.dist; 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT x = prev.x + (last.x - prev.x) * d; 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT y = prev.y + (last.y - prev.y) * d; 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last.x = x; 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last.y = y; 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!prev(last)) { 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vs.remove_last(); 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov vs.close(closed != 0); 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 58