My float map library

Committer:
est2fe
Date:
Thu Dec 09 14:19:12 2010 +0000
Revision:
0:1e9eea14a6b9
0.9.0

Who changed what in which revision?

UserRevisionLine numberNew 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