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