diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/asymptote/guide.cc |
Initial commit
Diffstat (limited to 'graphics/asymptote/guide.cc')
-rw-r--r-- | graphics/asymptote/guide.cc | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/graphics/asymptote/guide.cc b/graphics/asymptote/guide.cc new file mode 100644 index 0000000000..6479a00ba5 --- /dev/null +++ b/graphics/asymptote/guide.cc @@ -0,0 +1,53 @@ +/***** + * guide.cc + * Andy Hammerlindl 2005/02/23 + * + *****/ + +#include "guide.h" + +namespace camp { + +multiguide::multiguide(guidevector& v) +{ + // This constructor tests if the first subguide is also a multiguide and, + // if possible, uses the same base, extending it beyond what is used. + multiguide *rg = v.empty() ? 0 : dynamic_cast<multiguide *>(v[0]); + if (rg && rg->base->size() == rg->length) { + base = rg->base; + base->insert(base->end(), v.begin()+1, v.end()); + } + else + base = new guidevector(v); + + length = base->size(); +} + +void multiguide::flatten(flatguide& g, bool allowsolve) +{ + size_t n=length; + if(n > 0) { + for(size_t i=0; i+1 < n; ++i) { + subguide(i)->flatten(g,allowsolve); + if(!allowsolve && subguide(i)->cyclic()) { + g.precyclic(true); + g.resolvecycle(); + } + } + subguide(n-1)->flatten(g,allowsolve); + } +} + +void multiguide::print(ostream& out) const +{ + side lastLoc=JOIN; + for(size_t i=0; i < length; ++i) { + guide *g = subguide(i); + side loc = g->printLocation(); + adjustLocation(out,lastLoc,loc); + g->print(out); + lastLoc=loc; + } +} + +} // namespace camp |