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