src/analog/functions.h

changeset 316
dcd472be9ae8
child 322
e7ca120d93c7
equal deleted inserted replaced
315:cf4e83cecdb5 316:dcd472be9ae8
1 /***************************************************************************
2 * Copyright (C) 2006-2008 by Tomasz Ziobrowski *
3 * http://www.3electrons.com *
4 * e-mail: t.ziobrowski@3electrons.com *
5 * *
6 * *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program; if not, write to the *
19 * Free Software Foundation, Inc., *
20 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21 ***************************************************************************/
22
23 #ifndef _FUNCTIONS_H_
24 #define _FUNCTIONS_H_
25
26 #include <assert.h>
27 #include <cmath>
28 //#include <iostream> // dla testów
29
30 using namespace std;
31
32 /**
33 * Znajduje największą wartość mniejszą od scaleSize/steps i
34 * jednocześnie będącą całkowicie podzielną przez wartość
35 * 10^N gdzie n jest dowolną liczbą całkowitą.
36 * dla 5,2,1 jest to odpowiedniio {...,500,50,5,0.5,...},
37 * {...200,20,2,0.2,0.02,...} etc.
38 */
39
40
41 double minimalStep(double scaleSize, int steps);
42
43
44 /**
45 * Szablonowa funkcja do wyznaczania skali w zadanym przedziale o wyznaczonej ilości punktów skali.
46 * Na podstawie wartości minimalnej oraz maksymalnej, jaką chcemy osiągnać ustawia
47 * wartości m_min oraz m_max w taki sposób cały przedział skali (m_max-m_min) był podzielny
48 * przez ilość punktów skali a odległość pomiędzy punktami skali była wartoscią która jest
49 * wieloktornością liczby 5. Dodatkowo isnieje możliwość przesunięcia skali w lewo lub prawo by
50 * rozpoczynała się jak najbliżej wartości minimalnej lub kończyła jak najbliżej wartości
51 * maksymalnej.
52 *
53 * @param m_minimum - wartość minilana na skali jaka ma być widoczna
54 * @param m_maximum - wartość maksymalna na skali jaka ma być widoczna
55 * @param m_min - wyliczona wartość początkowa skali
56 * @param m_max - wyliczona wartość końcowa skali
57 * @param stesp - ilość węzłów jaką ma mieć skala
58 * @param left - czy skala ma być wyrównana do lewej czy do prawej (domyślnie do prawej).
59 * @return Funkcja zwraca wartość true jeżeli wartości m_min oraz m_max w wyniku zmiany zakresu
60 * zmieniły swoją wartość. Na podstawie tej wartości wiadomo czy należy np. przerysować skalę
61 * - podając wcześniej poprzednie wartości zakresu skali.
62 */
63
64 template <typename T>
65 bool range(T m_minimum,T m_maximum, T & m_min, T & m_max,unsigned int steps, bool left = false,double inc = 5.0)
66 {
67 //cout<<"("<<m_minimum<<","<<m_maximum<<") ("<<m_min<<","<<m_max<<")"<<endl;
68 T max_tmp = m_max, min_tmp = m_min;
69 m_max=m_maximum;
70 m_min=m_minimum;
71 assert( m_max > m_min );
72 // assert( (m_max - m_min) > 0 );
73 // if (m_max<0) left!=left;
74
75 T diff = abs(m_max - m_min);
76 T scale = 0, factor = 0 ;
77
78 while (inc * steps > (m_maximum-m_minimum))
79 if (inc/10 > 0 ) inc/=10;
80 else break;
81
82 bool done = false;
83 while ( diff > scale )
84 { factor+=static_cast<T>(inc); scale = factor * steps; }
85
86 while (!done)
87 {
88
89 // dirty hack to have zero equal exactly zero
90 if (m_max<0) m_max=m_min - fmodf(m_min,steps);
91 else m_max = 0.0;
92
93 while ( m_max < m_maximum ) m_max +=factor;
94 m_min = m_max - scale;
95 if (m_min <= m_minimum ) done = true;
96 else { factor+=static_cast<T>(inc); scale = factor * steps; }
97 }
98 // Wprowadzenie koretkty by skala nie przesuwała się w lewo na osi X
99 if (left)
100 while (m_min + factor <= m_minimum)
101 {
102 m_min+=factor;
103 m_max+=factor;
104 }
105 // cout<<"Min:"<<m_min<<" Max:"<<m_max<<endl;
106 return (m_max != max_tmp) | (m_min != min_tmp);
107 }
108
109
110 #endif // _FUNCTIONS_H_

mercurial