glviewvol

annotate src/curve.cc @ 14:0d2447b9c512

did the histogram... doesn't seem to work right
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 01 Jan 2015 06:36:45 +0200
parents 71b479ffb9f7
children
rev   line source
nuclear@12 1 /*
nuclear@12 2 glviewvol is an OpenGL 3D volume data viewer
nuclear@12 3 Copyright (C) 2014 John Tsiombikas <nuclear@member.fsf.org>
nuclear@12 4
nuclear@12 5 This program is free software: you can redistribute it and/or modify
nuclear@12 6 it under the terms of the GNU General Public License as published by
nuclear@12 7 the Free Software Foundation, either version 3 of the License, or
nuclear@12 8 (at your option) any later version.
nuclear@12 9
nuclear@12 10 This program is distributed in the hope that it will be useful,
nuclear@12 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
nuclear@12 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nuclear@12 13 GNU General Public License for more details.
nuclear@12 14
nuclear@12 15 You should have received a copy of the GNU General Public License
nuclear@12 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
nuclear@12 17 */
nuclear@4 18 #include <algorithm>
nuclear@4 19 #include "curve.h"
nuclear@4 20
nuclear@4 21 #define CLAMP(x, low, high) std::min<float>(std::max<float>(x, low), high)
nuclear@4 22 #define INDEX(x) ((x) * 65535.0)
nuclear@4 23
nuclear@4 24 void Curve::set_point(float t, float val)
nuclear@4 25 {
nuclear@4 26 uint16_t x = INDEX(CLAMP(t, 0.0, 1.0));
nuclear@4 27 set_point_int(x, val);
nuclear@4 28 }
nuclear@4 29
nuclear@4 30 static bool cpcmp(const CurvePoint &a, const CurvePoint &b)
nuclear@4 31 {
nuclear@4 32 return a.t_int < b.t_int;
nuclear@4 33 }
nuclear@4 34
nuclear@4 35 void Curve::set_point_int(uint16_t ti, float val)
nuclear@4 36 {
nuclear@4 37 CurvePoint *p = get_point_at(ti);
nuclear@4 38 if(p) {
nuclear@4 39 p->value = val;
nuclear@4 40 } else {
nuclear@4 41 CurvePoint p;
nuclear@4 42 p.t_int = ti;
nuclear@4 43 p.value = val;
nuclear@4 44 cp.push_back(p);
nuclear@4 45 std::sort(cp.begin(), cp.end(), cpcmp);
nuclear@4 46 }
nuclear@4 47 }
nuclear@4 48
nuclear@4 49 bool Curve::delete_point(uint16_t ti)
nuclear@4 50 {
nuclear@4 51 int sz = (int)cp.size();
nuclear@4 52 for(int i=0; i<sz; i++) {
nuclear@4 53 if(cp[i].t_int == ti) {
nuclear@4 54 cp.erase(cp.begin() + i);
nuclear@4 55 return true;
nuclear@4 56 }
nuclear@4 57 }
nuclear@4 58 return false;
nuclear@4 59 }
nuclear@4 60
nuclear@4 61 CurvePoint *Curve::get_point(int idx)
nuclear@4 62 {
nuclear@7 63 if(idx < 0 || idx >= (int)cp.size()) {
nuclear@4 64 return 0;
nuclear@4 65 }
nuclear@4 66 return &cp[idx];
nuclear@4 67 }
nuclear@4 68
nuclear@4 69 const CurvePoint *Curve::get_point(int idx) const
nuclear@4 70 {
nuclear@7 71 if(idx < 0 || idx >= (int)cp.size()) {
nuclear@4 72 return 0;
nuclear@4 73 }
nuclear@4 74 return &cp[idx];
nuclear@4 75 }
nuclear@4 76
nuclear@4 77 int Curve::get_num_points() const
nuclear@4 78 {
nuclear@4 79 return (int)cp.size();
nuclear@4 80 }
nuclear@4 81
nuclear@4 82 CurvePoint *Curve::get_point_at(uint16_t ti)
nuclear@4 83 {
nuclear@4 84 int sz = (int)cp.size();
nuclear@4 85 for(int i=0; i<sz; i++) {
nuclear@4 86 if(cp[i].t_int == ti) {
nuclear@4 87 return &cp[i];
nuclear@4 88 }
nuclear@4 89 }
nuclear@4 90 return 0;
nuclear@4 91 }
nuclear@4 92
nuclear@4 93 const CurvePoint *Curve::get_point_at(uint16_t ti) const
nuclear@4 94 {
nuclear@4 95 int sz = (int)cp.size();
nuclear@4 96 for(int i=0; i<sz; i++) {
nuclear@4 97 if(cp[i].t_int == ti) {
nuclear@4 98 return &cp[i];
nuclear@4 99 }
nuclear@4 100 }
nuclear@4 101 return 0;
nuclear@4 102 }
nuclear@4 103
nuclear@4 104 float Curve::value(float t) const
nuclear@4 105 {
nuclear@4 106 uint16_t x = INDEX(CLAMP(t, 0.0, 1.0));
nuclear@4 107 return value_int(x);
nuclear@4 108 }
nuclear@4 109
nuclear@4 110 float Curve::value_int(uint16_t ti) const
nuclear@4 111 {
nuclear@4 112 CurvePoint p = { ti, 0 };
nuclear@4 113 std::vector<CurvePoint>::const_iterator it;
nuclear@4 114 it = std::lower_bound(cp.begin(), cp.end(), p, cpcmp);
nuclear@4 115 if(ti >= it->t_int || it == cp.begin()) {
nuclear@4 116 return it->value;
nuclear@4 117 }
nuclear@4 118
nuclear@4 119 std::vector<CurvePoint>::const_iterator prev = it - 1;
nuclear@4 120
nuclear@4 121 float t = (float)(ti - prev->t_int) / (float)(it->t_int - prev->t_int);
nuclear@4 122 return prev->value + (it->value - prev->value) * t;
nuclear@4 123 }