My float map library
fmap.cpp@0:1e9eea14a6b9, 2010-12-09 (annotated)
- Committer:
- est2fe
- Date:
- Thu Dec 09 14:19:12 2010 +0000
- Revision:
- 0:1e9eea14a6b9
0.9.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
est2fe | 0:1e9eea14a6b9 | 1 | #ifndef __map_c__ |
est2fe | 0:1e9eea14a6b9 | 2 | #define __map_c__ |
est2fe | 0:1e9eea14a6b9 | 3 | |
est2fe | 0:1e9eea14a6b9 | 4 | #include "fmap.h" |
est2fe | 0:1e9eea14a6b9 | 5 | #include <math.h> |
est2fe | 0:1e9eea14a6b9 | 6 | #include <stdlib.h> |
est2fe | 0:1e9eea14a6b9 | 7 | #include <string.h> |
est2fe | 0:1e9eea14a6b9 | 8 | |
est2fe | 0:1e9eea14a6b9 | 9 | int find_x_Bereich (float x, fmap_s *map) |
est2fe | 0:1e9eea14a6b9 | 10 | { |
est2fe | 0:1e9eea14a6b9 | 11 | // return -3 -> Tabelle ist ungültig, Anzahl Stützstellen ist negativ |
est2fe | 0:1e9eea14a6b9 | 12 | // return -2 -> Tabelle ist ungültig, Anzahl Stützstellen ist 0 |
est2fe | 0:1e9eea14a6b9 | 13 | // return -1 -> map->kl = NULL |
est2fe | 0:1e9eea14a6b9 | 14 | // |
est2fe | 0:1e9eea14a6b9 | 15 | int max_i = map->groesse; // map.groesse |
est2fe | 0:1e9eea14a6b9 | 16 | float *fz = 0x00; |
est2fe | 0:1e9eea14a6b9 | 17 | if (max_i < 0) |
est2fe | 0:1e9eea14a6b9 | 18 | { |
est2fe | 0:1e9eea14a6b9 | 19 | return -3; |
est2fe | 0:1e9eea14a6b9 | 20 | } else { } |
est2fe | 0:1e9eea14a6b9 | 21 | switch (max_i) |
est2fe | 0:1e9eea14a6b9 | 22 | { |
est2fe | 0:1e9eea14a6b9 | 23 | case 0: |
est2fe | 0:1e9eea14a6b9 | 24 | { |
est2fe | 0:1e9eea14a6b9 | 25 | return -2; |
est2fe | 0:1e9eea14a6b9 | 26 | //break; |
est2fe | 0:1e9eea14a6b9 | 27 | } |
est2fe | 0:1e9eea14a6b9 | 28 | case 1: |
est2fe | 0:1e9eea14a6b9 | 29 | { |
est2fe | 0:1e9eea14a6b9 | 30 | // Es ist nur ein Y-Wert vorhanden |
est2fe | 0:1e9eea14a6b9 | 31 | return 0; // y1 zurückgeben |
est2fe | 0:1e9eea14a6b9 | 32 | //break; |
est2fe | 0:1e9eea14a6b9 | 33 | } |
est2fe | 0:1e9eea14a6b9 | 34 | case 2: |
est2fe | 0:1e9eea14a6b9 | 35 | { |
est2fe | 0:1e9eea14a6b9 | 36 | // Kennlinie mit 2 Stützstellen -> den unteren X-Wert zurückgeben |
est2fe | 0:1e9eea14a6b9 | 37 | return 0; // Es ist nur eine Kennlinie und keine Kurve |
est2fe | 0:1e9eea14a6b9 | 38 | //break; |
est2fe | 0:1e9eea14a6b9 | 39 | } |
est2fe | 0:1e9eea14a6b9 | 40 | default: |
est2fe | 0:1e9eea14a6b9 | 41 | { |
est2fe | 0:1e9eea14a6b9 | 42 | // Anzahl Stützstellen > 2 -> X-Bereich suchen |
est2fe | 0:1e9eea14a6b9 | 43 | int i = 0; |
est2fe | 0:1e9eea14a6b9 | 44 | fz = map->kl; |
est2fe | 0:1e9eea14a6b9 | 45 | if (fz == 0) { return -1; } else { } |
est2fe | 0:1e9eea14a6b9 | 46 | if (x <= *fz) |
est2fe | 0:1e9eea14a6b9 | 47 | { |
est2fe | 0:1e9eea14a6b9 | 48 | // Wenn der X-Wert kleiner als die untere Stützstelle ist, Index = 0 |
est2fe | 0:1e9eea14a6b9 | 49 | return 0; |
est2fe | 0:1e9eea14a6b9 | 50 | } else { } |
est2fe | 0:1e9eea14a6b9 | 51 | while ((x >= *fz) && (i < (max_i - 1))) |
est2fe | 0:1e9eea14a6b9 | 52 | { |
est2fe | 0:1e9eea14a6b9 | 53 | i++; |
est2fe | 0:1e9eea14a6b9 | 54 | fz +=2; // +; fz++; // Jede 2. Float ist eine Stützstelle (x-Wert) |
est2fe | 0:1e9eea14a6b9 | 55 | } |
est2fe | 0:1e9eea14a6b9 | 56 | return --i; |
est2fe | 0:1e9eea14a6b9 | 57 | //break; |
est2fe | 0:1e9eea14a6b9 | 58 | } |
est2fe | 0:1e9eea14a6b9 | 59 | } |
est2fe | 0:1e9eea14a6b9 | 60 | // Da kommen im Regelfall eigentlich nie an! |
est2fe | 0:1e9eea14a6b9 | 61 | // Trotzdem abfangen, falls i < 0 gewesen waere! |
est2fe | 0:1e9eea14a6b9 | 62 | //return -3; |
est2fe | 0:1e9eea14a6b9 | 63 | } |
est2fe | 0:1e9eea14a6b9 | 64 | |
est2fe | 0:1e9eea14a6b9 | 65 | float calc_fix_map (float x, int i, fmap_s *map) |
est2fe | 0:1e9eea14a6b9 | 66 | { |
est2fe | 0:1e9eea14a6b9 | 67 | /* |
est2fe | 0:1e9eea14a6b9 | 68 | ^ |
est2fe | 0:1e9eea14a6b9 | 69 | y | / |
est2fe | 0:1e9eea14a6b9 | 70 | | / |
est2fe | 0:1e9eea14a6b9 | 71 | y2|------------------------------------------------------o |
est2fe | 0:1e9eea14a6b9 | 72 | | / | |
est2fe | 0:1e9eea14a6b9 | 73 | | / | |
est2fe | 0:1e9eea14a6b9 | 74 | y |----------------------------o / | |
est2fe | 0:1e9eea14a6b9 | 75 | | / | | |
est2fe | 0:1e9eea14a6b9 | 76 | | / | | |
est2fe | 0:1e9eea14a6b9 | 77 | y1|--------O m1 | | |
est2fe | 0:1e9eea14a6b9 | 78 | b | _ / | | | |
est2fe | 0:1e9eea14a6b9 | 79 | | m2 | | | |
est2fe | 0:1e9eea14a6b9 | 80 | | | | | |
est2fe | 0:1e9eea14a6b9 | 81 | ----------|-------------------|-------------------------|--------------> |
est2fe | 0:1e9eea14a6b9 | 82 | x0 x1 x x2 x |
est2fe | 0:1e9eea14a6b9 | 83 | |
est2fe | 0:1e9eea14a6b9 | 84 | y = m*x + b |
est2fe | 0:1e9eea14a6b9 | 85 | |
est2fe | 0:1e9eea14a6b9 | 86 | m = dy / dx |
est2fe | 0:1e9eea14a6b9 | 87 | |
est2fe | 0:1e9eea14a6b9 | 88 | m = m1 = (y2 - y1) / (x2 - x1) |
est2fe | 0:1e9eea14a6b9 | 89 | m2 = (y1 - b) / (x1 - 0) |
est2fe | 0:1e9eea14a6b9 | 90 | |
est2fe | 0:1e9eea14a6b9 | 91 | (y2-y1)/(x2-x1) = (y1-b)/x1 |
est2fe | 0:1e9eea14a6b9 | 92 | x1((y2-y1)/(x2-x1)) = y1-b |
est2fe | 0:1e9eea14a6b9 | 93 | b = y1 - x1((y2-y1)/(x2-x1)) |
est2fe | 0:1e9eea14a6b9 | 94 | b = y1 - x1*m mit m = (y2-y1)/(x2-x1) |
est2fe | 0:1e9eea14a6b9 | 95 | |
est2fe | 0:1e9eea14a6b9 | 96 | y = mx + b |
est2fe | 0:1e9eea14a6b9 | 97 | |
est2fe | 0:1e9eea14a6b9 | 98 | mit m1 = m2 -> b = x1 - y1 / m (umstellen nach b) |
est2fe | 0:1e9eea14a6b9 | 99 | |
est2fe | 0:1e9eea14a6b9 | 100 | y = m*x + x1 - y1 / m und -> m != 0! -> dx != 0!!! |
est2fe | 0:1e9eea14a6b9 | 101 | |
est2fe | 0:1e9eea14a6b9 | 102 | */ |
est2fe | 0:1e9eea14a6b9 | 103 | |
est2fe | 0:1e9eea14a6b9 | 104 | // Mittels Geradengleichung den y-Wert ermitteln |
est2fe | 0:1e9eea14a6b9 | 105 | // y = mx + b |
est2fe | 0:1e9eea14a6b9 | 106 | // m = dy/dx |
est2fe | 0:1e9eea14a6b9 | 107 | // return: NaN bei dx = 0 |
est2fe | 0:1e9eea14a6b9 | 108 | // b = y [x = 0]; |
est2fe | 0:1e9eea14a6b9 | 109 | // -> y = m*x + x1 - (y1 / m) und dx != 0 |
est2fe | 0:1e9eea14a6b9 | 110 | |
est2fe | 0:1e9eea14a6b9 | 111 | float *fz = 0x00; |
est2fe | 0:1e9eea14a6b9 | 112 | |
est2fe | 0:1e9eea14a6b9 | 113 | float x1; |
est2fe | 0:1e9eea14a6b9 | 114 | float x2; |
est2fe | 0:1e9eea14a6b9 | 115 | float y1; |
est2fe | 0:1e9eea14a6b9 | 116 | float y2; |
est2fe | 0:1e9eea14a6b9 | 117 | float dx; |
est2fe | 0:1e9eea14a6b9 | 118 | float dy; |
est2fe | 0:1e9eea14a6b9 | 119 | float b; |
est2fe | 0:1e9eea14a6b9 | 120 | |
est2fe | 0:1e9eea14a6b9 | 121 | fz = map->kl; |
est2fe | 0:1e9eea14a6b9 | 122 | if (i < 0) { return *(fz + 1); } else { } // y1 zurückgeben |
est2fe | 0:1e9eea14a6b9 | 123 | fz += 2 * i; |
est2fe | 0:1e9eea14a6b9 | 124 | x1 = *fz++; |
est2fe | 0:1e9eea14a6b9 | 125 | y1 = *fz++; |
est2fe | 0:1e9eea14a6b9 | 126 | x2 = *fz++; |
est2fe | 0:1e9eea14a6b9 | 127 | y2 = *fz; |
est2fe | 0:1e9eea14a6b9 | 128 | |
est2fe | 0:1e9eea14a6b9 | 129 | dx = x2 - x1; |
est2fe | 0:1e9eea14a6b9 | 130 | dy = y2 - y1; |
est2fe | 0:1e9eea14a6b9 | 131 | b = y1 - (x1 * (dy / dx)); |
est2fe | 0:1e9eea14a6b9 | 132 | if (dx == 0) { return NAN; } else { } |
est2fe | 0:1e9eea14a6b9 | 133 | if (dy == 0) { return y1; } else { } |
est2fe | 0:1e9eea14a6b9 | 134 | // an den Bereichsgrenzen waagerecht begrenzen |
est2fe | 0:1e9eea14a6b9 | 135 | if (x <= x1) { return y1; } else { } |
est2fe | 0:1e9eea14a6b9 | 136 | if (x >= x2) { return y2; } else { } |
est2fe | 0:1e9eea14a6b9 | 137 | |
est2fe | 0:1e9eea14a6b9 | 138 | // und jetzt y = m * x + b mit b = y2 - (x1 / m) |
est2fe | 0:1e9eea14a6b9 | 139 | // return m * x + b; |
est2fe | 0:1e9eea14a6b9 | 140 | return ((x * dy/dx) + b); |
est2fe | 0:1e9eea14a6b9 | 141 | } |
est2fe | 0:1e9eea14a6b9 | 142 | |
est2fe | 0:1e9eea14a6b9 | 143 | float calc_var_map (float x, fmap_s *map) |
est2fe | 0:1e9eea14a6b9 | 144 | { |
est2fe | 0:1e9eea14a6b9 | 145 | int i = find_x_Bereich (x, map); // i zeigt jetzt auf |
est2fe | 0:1e9eea14a6b9 | 146 | if (i >= 0) |
est2fe | 0:1e9eea14a6b9 | 147 | { |
est2fe | 0:1e9eea14a6b9 | 148 | // return calc_fix_map (x, (map->kl)); // das zählt er evtl. 4 floats weiter |
est2fe | 0:1e9eea14a6b9 | 149 | return calc_fix_map (x, i, map); // da zählt er evtl. 4 floats weiter |
est2fe | 0:1e9eea14a6b9 | 150 | } |
est2fe | 0:1e9eea14a6b9 | 151 | else |
est2fe | 0:1e9eea14a6b9 | 152 | { |
est2fe | 0:1e9eea14a6b9 | 153 | // ungültiger Index |
est2fe | 0:1e9eea14a6b9 | 154 | return NAN; // oder doch 0.0 ? |
est2fe | 0:1e9eea14a6b9 | 155 | } |
est2fe | 0:1e9eea14a6b9 | 156 | } |
est2fe | 0:1e9eea14a6b9 | 157 | |
est2fe | 0:1e9eea14a6b9 | 158 | fmap_s *new_map (int groesse) |
est2fe | 0:1e9eea14a6b9 | 159 | { |
est2fe | 0:1e9eea14a6b9 | 160 | fmap_s *mz = (fmap_s *)malloc (sizeof (fmap_s)); |
est2fe | 0:1e9eea14a6b9 | 161 | if (mz == 0x00) |
est2fe | 0:1e9eea14a6b9 | 162 | { |
est2fe | 0:1e9eea14a6b9 | 163 | return 0x00; |
est2fe | 0:1e9eea14a6b9 | 164 | } |
est2fe | 0:1e9eea14a6b9 | 165 | else |
est2fe | 0:1e9eea14a6b9 | 166 | { |
est2fe | 0:1e9eea14a6b9 | 167 | size_t gr = (2 * groesse) * sizeof (mz->kl); |
est2fe | 0:1e9eea14a6b9 | 168 | mz->kl = (float *) malloc (gr); |
est2fe | 0:1e9eea14a6b9 | 169 | if (mz->kl == NULL) |
est2fe | 0:1e9eea14a6b9 | 170 | { |
est2fe | 0:1e9eea14a6b9 | 171 | return 0; |
est2fe | 0:1e9eea14a6b9 | 172 | } |
est2fe | 0:1e9eea14a6b9 | 173 | else |
est2fe | 0:1e9eea14a6b9 | 174 | { |
est2fe | 0:1e9eea14a6b9 | 175 | memset (mz->kl, 0.0, gr); |
est2fe | 0:1e9eea14a6b9 | 176 | } |
est2fe | 0:1e9eea14a6b9 | 177 | } |
est2fe | 0:1e9eea14a6b9 | 178 | mz->groesse = groesse; |
est2fe | 0:1e9eea14a6b9 | 179 | return mz; |
est2fe | 0:1e9eea14a6b9 | 180 | } |
est2fe | 0:1e9eea14a6b9 | 181 | |
est2fe | 0:1e9eea14a6b9 | 182 | void free_map (fmap_s *m) |
est2fe | 0:1e9eea14a6b9 | 183 | { |
est2fe | 0:1e9eea14a6b9 | 184 | free (m->kl); |
est2fe | 0:1e9eea14a6b9 | 185 | free (m); |
est2fe | 0:1e9eea14a6b9 | 186 | } |
est2fe | 0:1e9eea14a6b9 | 187 | |
est2fe | 0:1e9eea14a6b9 | 188 | int set_map_val (fmap_s *m, int index, float x, float y) |
est2fe | 0:1e9eea14a6b9 | 189 | { |
est2fe | 0:1e9eea14a6b9 | 190 | // return -2 -> Index negativ |
est2fe | 0:1e9eea14a6b9 | 191 | // return -1 -> Index zu gross |
est2fe | 0:1e9eea14a6b9 | 192 | // return 0 -> alles ok |
est2fe | 0:1e9eea14a6b9 | 193 | if (index < 0) |
est2fe | 0:1e9eea14a6b9 | 194 | { |
est2fe | 0:1e9eea14a6b9 | 195 | return -2; |
est2fe | 0:1e9eea14a6b9 | 196 | } else {} |
est2fe | 0:1e9eea14a6b9 | 197 | if (index > m->groesse) |
est2fe | 0:1e9eea14a6b9 | 198 | { |
est2fe | 0:1e9eea14a6b9 | 199 | return -1; |
est2fe | 0:1e9eea14a6b9 | 200 | } |
est2fe | 0:1e9eea14a6b9 | 201 | else |
est2fe | 0:1e9eea14a6b9 | 202 | { |
est2fe | 0:1e9eea14a6b9 | 203 | *((m->kl) + (2 * index)) = x; |
est2fe | 0:1e9eea14a6b9 | 204 | *((m->kl) + (2 * index) + 1) = y; |
est2fe | 0:1e9eea14a6b9 | 205 | } |
est2fe | 0:1e9eea14a6b9 | 206 | return 0; |
est2fe | 0:1e9eea14a6b9 | 207 | } |
est2fe | 0:1e9eea14a6b9 | 208 | |
est2fe | 0:1e9eea14a6b9 | 209 | #endif |