From 1b7c9b6e2eb89e2d17fd0b76d3e3f51308dbc37a Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Thu, 8 Jan 2015 00:40:23 +0100 Subject: panorama! --- ringbuf.h | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 ringbuf.h (limited to 'ringbuf.h') diff --git a/ringbuf.h b/ringbuf.h new file mode 100644 index 0000000..5756153 --- /dev/null +++ b/ringbuf.h @@ -0,0 +1,126 @@ +#include + +class Ringbuffer +{ + public: + + Ringbuffer(int size) + { + this->size = size; + idx = 0; + buf = new double[size]; + for (int i=0; ilow=low; + this->upp=upp; + this->span=upp-low; + rb->set(_fixup_range(0.0)); + } + + ~ModuloRingbuffer() + { + delete rb; + } + + double _fixup_range(double val) + { + while (val < low) val+=span; + while (val>= upp) val-=span; + return val; + } + + double get() + { + return rb->get(); + } + + void put(double val) + { + val=_fixup_range(val); + + // direct way + double dist1 = val - get(); + // over borders + double dist2 = dist1 + span; + double dist3 = dist1 - span; + + if (fabs(dist1) <= fabs(dist2) && fabs(dist1) <= fabs(dist3)) + rb->put(val); + else if (fabs(dist2) <= fabs(dist3)) + rb->put(val+span); + else + rb->put(val-span); + + while (get() < low) rb->add(span); + while (get()>= upp) rb->add(-span); + } + + void set(double val) + { + rb->set(_fixup_range(val)); + } +}; -- cgit v1.2.3