ErrorBarRep.cxx
Go to the documentation of this file.
1 
12 #ifdef _MSC_VER
13 // include max() and min() missing from MicroSoft Visual C++
14 #include "msdevstudio/MSconfig.h"
15 #endif //_MSC_VER
16 
17 #include "ErrorBarRep.h"
18 
20 #include "datasrcs/DataSource.h"
21 #include "graphics/ViewBase.h"
23 
24 #include <cassert>
25 
26 using std::string;
27 using std::vector;
28 
29 using namespace hippodraw;
30 
32  : RepBase ( "ErrorBar", 0 ),
33  m_x_flag ( false ),
34  m_y_flag ( false )
35 {
36 }
37 
39 {
40 }
41 
43 {
44  return new ErrorBarRep( *this );
45 }
46 
47 void ErrorBarRep::setXError ( bool flag )
48 {
49  m_x_flag = flag;
50 }
51 
52 void ErrorBarRep::setYError ( bool flag )
53 {
54  m_y_flag = flag;
55 }
56 
57 void
59 drawXError ( double x, double y, double error,
60  const TransformBase & tb )
61 {
62  try {
63  const BinaryTransform & t
64  = dynamic_cast < const BinaryTransform & > ( tb );
65 
66  double bull;
67 
68  double thi = m_y_range.high();
69  double tlo = m_y_range.low();
70  t.transform( bull, thi );
71  t.transform( bull, tlo );
72 
73  Range new_range( tlo, thi );
74  m_y_range = new_range;
75 
76  double xhi = x + error;
77  double xlo = x - error;
78 
79  t.transform( x, y );
80  t.transform( xlo, bull );
81  t.transform( xhi, bull );
82 
83  // The line.
84  m_x_err.push_back ( xhi );
85  m_y_err.push_back ( y );
86  m_x_err.push_back ( xlo );
87  m_y_err.push_back ( y );
88 
89  }
90  catch ( ... ) {
91  assert ( false );
92  }
93 }
94 
95 void
97 drawYError ( double x, double y, double error,
98  const TransformBase & tb )
99 {
100  try {
101  const BinaryTransform & t
102  = dynamic_cast < const BinaryTransform & > ( tb );
103 
104  double bull = 0.0;
105 
106  double thi = m_x_range.high();
107  double tlo = m_x_range.low();
108  t.transform( thi, bull );
109  t.transform( tlo, bull );
110 
111  Range new_range( tlo, thi );
112  m_x_range = new_range;
113 
114  double yhi = y + error; //0.5 * error;
115  double ylo = y - error; //0.5 * error;
116 
117  t.transform( x, y );
118  t.transform( bull, ylo );
119  t.transform( bull, yhi );
120 
121  // The line.
122  m_x_err.push_back ( x );
123  m_y_err.push_back ( yhi );
124  m_x_err.push_back ( x );
125  m_y_err.push_back ( ylo );
126 
127  }
128  catch ( ... ) {
129  assert ( false );
130  }
131 }
132 namespace dp = hippodraw::DataPoint2DTuple;
133 
134 void
137  TransformBase * transform,
138  ViewBase * view )
139 {
140  if ( m_x_flag == false &&
141  m_y_flag == false ) return;
142 
143  unsigned int size = ntuple -> rows ();
144  if ( size == 0 ) return;
145 
146  m_x_err.clear ();
147  m_y_err.clear ();
148 
149  unsigned int new_size = 0;
150  if ( m_x_flag ) {
151  new_size += 6 * size;
152  }
153  if ( m_y_flag ) {
154  new_size += 6 * size;
155  }
156 
157  m_x_err.reserve ( new_size );
158  m_y_err.reserve ( new_size );
159 
160  getRanges ( view );
161 
162  for ( unsigned int i = 0; i < size; i++ ) {
163  const vector < double > & row = ntuple -> getRow ( i );
164  double x = row [ dp::X ];
165  double y = row [ dp::Y ];
166 
167  if ( m_x_flag == true ) {
168  double err = row [ dp::XERR ];
169  drawXError ( x, y, err, *transform );
170  }
171 
172  if ( m_y_flag == true ) {
173  double err = row [ dp::YERR ];
174  drawYError ( x, y, err, *transform );
175  }
176  }
177 
178  const Rect & user_rect = view -> getUserRect ();
179  user_rect.makeInBounds ( m_x_err, m_y_err );
180  const Color & cur_color = color ();
181 
182  view -> drawLines ( m_x_err, m_y_err, Line::Solid, cur_color, m_size );
183 }
184 
185 void
187 getRanges ( const ViewBase * view )
188 {
189  m_x_range = view -> getRange ( Axes::X );
190  m_y_range = view -> getRange ( Axes::Y );
191 }

Generated for HippoDraw Class Library by doxygen