00001
00012 #include "CutRangeRep.h"
00013
00014 #include "datasrcs/TupleCut.h"
00015 #include "graphics/ViewBase.h"
00016 #include "transforms/BinaryTransform.h"
00017
00018 using std::vector;
00019
00020 CutRangeRep::CutRangeRep ( )
00021 : PointRepBase ( "CutRangeRep", 0.0 )
00022 {
00023 setColor ( Color::yellow );
00024 }
00025
00026 CutRangeRep::CutRangeRep ( const CutRangeRep & point_rep )
00027 : PointRepBase ( point_rep )
00028 {
00029 }
00030
00031 RepBase * CutRangeRep::clone()
00032 {
00033 return new CutRangeRep( *this );
00034 }
00035
00036 void
00037 CutRangeRep::
00038 drawRange ( const Range & x_range,
00039 const Range & y_range,
00040 const std::vector < TupleCut > & cuts,
00041 const TransformBase & tb,
00042 ViewBase & view )
00043 {
00044 int dim = cuts.size();
00045
00046 bool yes = cuts[0].getInversion ();
00047 if ( dim == 2 ) yes |= cuts[1].getInversion ();
00048 if ( yes ) {
00049 if ( dim == 1 ) {
00050 drawInvertedRange1D ( x_range, y_range, cuts, tb, view );
00051 }
00052 else {
00053 drawInvertedRange2D ( x_range, y_range, cuts, tb, view );
00054 }
00055 }
00056 else drawNormalRange ( x_range, y_range, cuts, tb, view );
00057 }
00058
00059 void
00060 CutRangeRep::
00061 drawNormalRange ( const Range & x_range, const Range & y_range,
00062 const std::vector < TupleCut > & cuts,
00063 const TransformBase & tb,
00064 ViewBase & view )
00065 {
00066 const BinaryTransform & t
00067 = dynamic_cast < const BinaryTransform & > ( tb );
00068
00069 double x1 = x_range.low ();
00070 double y1 = y_range.low ();
00071 double x2 = x_range.high ();
00072 double y2 = y_range.high ();
00073
00074 if ( cuts.size () >= 1 )
00075 {
00076 const Range & range = cuts[0].getRange ();
00077 double cut_low = range.low ();
00078 double cut_high = range.high ();
00079 if ( cut_low > x1 ) x1 = cut_low;
00080 if ( cut_high < x2 ) x2 = cut_high;
00081 }
00082
00083 if ( cuts.size () >= 2 )
00084 {
00085 const Range & range = cuts[1].getRange ();
00086 double cut_low = range.low ();
00087 double cut_high = range.high ();
00088 if ( cut_low > y1 ) y1 = cut_low;
00089 if ( cut_high < y2 ) y2 = cut_high;
00090 }
00091
00092 t.transform ( x1, y1 );
00093 t.transform ( x2, y2 );
00094
00095 int red;
00096 int green;
00097 int blue;
00098
00099 if ( m_desel == false ) {
00100 red = m_color.getRed ();
00101 green = m_color.getGreen ();
00102 blue = m_color.getBlue ();
00103 }
00104 else {
00105 red = s_desel_color.getRed ();
00106 green = s_desel_color.getGreen ();
00107 blue = s_desel_color.getBlue ();
00108 }
00109 view.drawSquare ( x1, y1, x2, y2, red, green, blue );
00110 }
00111
00112 void
00113 CutRangeRep::
00114 drawInvertedRange1D ( const Range & x_range, const Range & y_range,
00115 const std::vector < TupleCut > & cuts,
00116 const TransformBase & tb,
00117 ViewBase & view )
00118 {
00119 double xl = x_range.low ();
00120 double xr = x_range.high ();
00121
00122 const Range range = cuts[0].getRange ();
00123 double cut_low = range.low();
00124 double cut_high = range.high ();
00125
00126 double x1 = std::max ( cut_low, xl );
00127 double x2 = std::min ( cut_high, xr );
00128
00129 double y1 = y_range.low ();
00130 double y2 = y_range.high ();
00131
00132 double yl = y1;
00133 double yr = y2;
00134 const BinaryTransform & t
00135 = dynamic_cast < const BinaryTransform & > ( tb );
00136
00137 t.transform ( x1, y1 );
00138 t.transform ( x2, y2 );
00139
00140 t.transform ( xl, yl );
00141 t.transform ( xr, yr );
00142
00143 int red;
00144 int green;
00145 int blue;
00146
00147 if ( m_desel == false ) {
00148 red = m_color.getRed ();
00149 green = m_color.getGreen ();
00150 blue = m_color.getBlue ();
00151 }
00152 else {
00153 red = s_desel_color.getRed ();
00154 green = s_desel_color.getGreen ();
00155 blue = s_desel_color.getBlue ();
00156 }
00157
00158 view.drawSquare ( xl, y1, x1, y2, red, green, blue );
00159 view.drawSquare ( x2, y1, xr, yr, red, green, blue );
00160 }
00161
00162 void
00163 CutRangeRep::
00164 drawInvertedRange2D ( const Range & x_range, const Range & y_range,
00165 const std::vector < TupleCut > & cuts,
00166 const TransformBase & tb,
00167 ViewBase & view )
00168 {
00169 const BinaryTransform & t
00170 = dynamic_cast < const BinaryTransform & > ( tb );
00171
00172
00173 double xLow = x_range.low ();
00174 double yLow = y_range.low ();
00175
00176
00177 double xHigh = x_range.high ();
00178 double yHigh = y_range.high ();
00179
00180
00181 double x1 = xLow;
00182 double x2 = xHigh;
00183 double y1 = yLow;
00184 double y2 = yHigh;
00185
00186 if ( cuts.size () >= 1 )
00187 {
00188 const Range & range = cuts[0].getRange ();
00189 double cut_low = range.low();
00190 double cut_high = range.high ();
00191 if ( cut_low > x1 ) x1 = cut_low;
00192 if ( cut_high < x2 ) x2 = cut_high;
00193 }
00194
00195 if ( cuts.size() >= 2 )
00196 {
00197 const Range & range = cuts[1].getRange ();
00198 double cut_low = range.low();
00199 double cut_high = range.high();
00200 if ( cut_low > y1 ) y1 = cut_low;
00201 if ( cut_high < y2 ) y2 = cut_high;
00202 }
00203
00204 t.transform ( x1, y1 );
00205 t.transform ( x2, y2 );
00206
00207 t.transform ( xLow, yLow );
00208 t.transform ( xHigh, yHigh );
00209
00210 int red;
00211 int green;
00212 int blue;
00213
00214 if ( m_desel == false ) {
00215 red = m_color.getRed ();
00216 green = m_color.getGreen ();
00217 blue = m_color.getBlue ();
00218 }
00219 else {
00220 red = s_desel_color.getRed ();
00221 green = s_desel_color.getGreen ();
00222 blue = s_desel_color.getBlue ();
00223 }
00224
00225
00226
00227 view.drawSquare( xLow, yLow, x1, yHigh, red, green, blue );
00228
00229
00230 view.drawSquare( x2, yLow, xHigh, yHigh, red, green, blue );
00231
00232
00233 view.drawSquare( x1, y2, x2, yHigh, red, green, blue );
00234
00235
00236 view.drawSquare( x1, yLow, x2, y1, red, green, blue );
00237
00238 }
00239
00240 void
00241 CutRangeRep::
00242 drawProjectedValues ( const DataSource * ntuple,
00243 TransformBase * transform,
00244 ViewBase * view )
00245 {
00246 }