| |
| //---------------------------------------------------------------------------- |
| // Anti-Grain Geometry - Version 2.3 |
| // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) |
| // |
| // Permission to copy, use, modify, sell and distribute this software |
| // is granted provided this copyright notice appears in all copies. |
| // This software is provided "as is" without express or implied |
| // warranty, and with no claim as to its suitability for any purpose. |
| // |
| //---------------------------------------------------------------------------- |
| // Contact: mcseem@antigrain.com |
| // mcseemagg@yahoo.com |
| // http://www.antigrain.com |
| //---------------------------------------------------------------------------- |
| #ifndef AGG_SHORTEN_PATH_INCLUDED |
| #define AGG_SHORTEN_PATH_INCLUDED |
| #include "agg_basics.h" |
| #include "agg_vertex_sequence.h" |
| namespace agg |
| { |
| template<class VertexSequence> |
| void shorten_path(VertexSequence& vs, float s, unsigned closed = 0) |
| { |
| typedef typename VertexSequence::value_type vertex_type; |
| if(s > 0 && vs.size() > 1) { |
| float d; |
| int n = int(vs.size() - 2); |
| while(n) { |
| d = vs[n].dist; |
| if(d > s) { |
| break; |
| } |
| vs.remove_last(); |
| s -= d; |
| --n; |
| } |
| if(vs.size() < 2) { |
| vs.remove_all(); |
| } else { |
| n = vs.size() - 1; |
| vertex_type& prev = vs[n - 1]; |
| vertex_type& last = vs[n]; |
| d = (prev.dist - s) / prev.dist; |
| float x = prev.x + (last.x - prev.x) * d; |
| float y = prev.y + (last.y - prev.y) * d; |
| last.x = x; |
| last.y = y; |
| if(!prev(last)) { |
| vs.remove_last(); |
| } |
| vs.close(closed != 0); |
| } |
| } |
| } |
| } |
| #endif |