|
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_ |