1 22 28 package org.jrobin.graph; 29 30 import org.jrobin.core.XmlWriter; 31 32 import java.util.*; 33 34 39 class ValueAxisUnit 40 { 41 private double gridStep = 2; 45 private double labelStep = 10; 46 47 57 ValueAxisUnit( double gridStep, double labelStep ) 58 { 59 this.gridStep = gridStep; 60 this.labelStep = labelStep; 61 } 62 63 double getGridStep() { 64 return gridStep; 65 } 66 67 double getLabelStep() { 68 return labelStep; 69 } 70 71 72 82 ValueMarker[] getValueMarkers( double lower, double upper ) 83 { 84 double minPoint = 0.0; 85 double majPoint = 0.0; 86 87 if ( lower > 0 ) 89 { 90 minPoint = lower; 91 double mod = ( lower % labelStep ); 92 93 if ( mod > 0 ) 94 majPoint = lower + (labelStep - mod ); 95 else 96 majPoint = lower; 97 } 98 else if ( lower < 0 ) 99 { 100 minPoint = lower; 101 double mod = ( lower % labelStep ); 102 103 if ( Math.abs(mod) > 0 ) 104 majPoint = lower - mod; 105 else 106 majPoint = lower; 107 } 108 109 ArrayList markerList = new ArrayList(); 112 113 while ( minPoint <= upper && majPoint <= upper ) 114 { 115 if ( minPoint < majPoint ) 116 { 117 markerList.add( new ValueMarker(minPoint, false) ); 118 minPoint = round( minPoint + gridStep ); 119 } 120 else 121 { 122 if ( minPoint == majPoint ) { 124 markerList.add( new ValueMarker(majPoint, true) ); 125 minPoint = round( minPoint + gridStep ); 126 majPoint = round( majPoint + labelStep ); 127 } 128 else 129 { 130 markerList.add( new ValueMarker(majPoint, true) ); 131 majPoint = round( majPoint + labelStep ); 132 } 133 } 134 } 135 136 while ( minPoint <= upper ) 137 { 138 markerList.add( new ValueMarker(minPoint, false) ); 139 minPoint = round( minPoint + gridStep ); 140 } 141 142 while ( majPoint <= upper ) 143 { 144 markerList.add( new ValueMarker(majPoint, true) ); 145 majPoint = round( majPoint + labelStep ); 146 } 147 148 return (ValueMarker[]) markerList.toArray( new ValueMarker[0] ); 149 } 150 151 157 double getNiceLower( double ovalue ) 158 { 159 double gridFactor = 1.0; 161 double mGridFactor = 1.0; 162 163 double gridStep = this.gridStep; 164 double mGridStep = this.labelStep; 165 166 while ( gridStep < 10.0 ) { 167 gridStep *= 10; 168 gridFactor *= 10; 169 } 170 171 while ( mGridStep < 10.0 ) { 172 mGridStep *= 10; 173 mGridFactor *= 10; 174 } 175 176 int sign = ( ovalue > 0 ? 1 : -1 ); 177 178 long lGridStep = new Double ( gridStep ).longValue(); 179 long lmGridStep = new Double ( mGridStep ).longValue(); 180 181 long lValue = new Double (sign * ovalue * gridFactor).longValue(); 182 long lmValue = new Double (sign * ovalue * mGridFactor).longValue(); 183 184 long lMod = lValue % lGridStep; 185 long lmMod = lmValue % lmGridStep; 186 187 if ( ovalue < 0 ) 188 { 189 if ( lmMod > ( mGridStep * 0.5 ) ) 190 return ((double) (sign*lmValue + lmMod - lmGridStep ) / mGridFactor); 191 else if ( lMod > 0 ) 192 return ((double) (sign*lValue + lMod - lGridStep) / gridFactor); 193 else 194 return ((double) (sign*lValue - lGridStep) / gridFactor); 195 } 196 else 197 { 198 if ( lmMod < ( mGridStep * 0.5 ) ) 199 return ((double) (sign*lmValue - lmMod) / mGridFactor); 200 else if ( lMod > 0 ) 201 return ((double) (sign*lValue - lMod) / gridFactor); 202 else 203 return ((double) (sign*lValue) / gridFactor); 204 } 205 } 206 207 213 double getNiceHigher( double ovalue ) 214 { 215 double gridFactor = 1.0; 216 double mGridFactor = 1.0; 217 218 double gridStep = this.gridStep; 219 double mGridStep = this.labelStep; 220 221 while ( gridStep < 10.0 ) { 222 gridStep *= 10; 223 gridFactor *= 10; 224 } 225 226 while ( mGridStep < 10.0 ) { 227 mGridStep *= 10; 228 mGridFactor *= 10; 229 } 230 231 int sign = ( ovalue > 0 ? 1 : -1 ); 232 233 long lGridStep = new Double ( gridStep ).longValue(); 234 long lmGridStep = new Double ( mGridStep ).longValue(); 235 236 long lValue = new Double (sign * ovalue * gridFactor).longValue(); 237 long lmValue = new Double (sign * ovalue * mGridFactor).longValue(); 238 239 long lMod = lValue % lGridStep; 240 long lmMod = lmValue % lmGridStep; 241 242 if ( ovalue < 0 ) 243 { 244 if ( lmMod < ( mGridStep * 0.5 ) ) 245 return ((double) (sign*lmValue + lmMod ) / mGridFactor); 246 else 247 return ((double) (sign*lValue + lMod ) / gridFactor); 248 } 249 else 250 { 251 if ( lmMod > ( mGridStep * 0.5 ) ) 252 return ((double) ( sign * lmValue - lmMod + lmGridStep) / mGridFactor); 253 else 254 return ((double) ( sign * lValue - lMod + lGridStep) / gridFactor); 255 } 256 257 } 258 259 260 269 private double round( double value ) 270 { 271 return round( value, 14 ); } 273 274 280 private double round( double value, int numDecs ) 281 { 282 return new java.math.BigDecimal (value).setScale(numDecs , java.math.BigDecimal.ROUND_HALF_EVEN).doubleValue(); 283 } 284 285 void exportXmlTemplate(XmlWriter xml) { 286 xml.startTag("value_axis"); 287 xml.writeTag("grid_step", getGridStep()); 288 xml.writeTag("label_step", getLabelStep()); 289 xml.closeTag(); } 291 } 292 | Popular Tags |