/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.jlab.groot.math;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author gavalian
*/
public class Dimension1D implements Cloneable{
public final double SMALL_NUMBER = 10e-25;
double dimMin = 0.0;
double dimMax = 1.0;
boolean isLog = false;
public Dimension1D(){
}
public Dimension1D(double min, double max){
this.setMinMax(min, max);
}
public final void setMinMax(double min, double max){
this.dimMin = min;
this.dimMax = max;
}
public double getMin(){
return this.dimMin;
}
public boolean getLog(){
return this.isLog;
}
public void setLog(boolean flag){
this.isLog = flag;
}
public double getMax(){
return this.dimMax;
}
public Dimension1D clone() throws CloneNotSupportedException{
return (Dimension1D) super.clone();
}
public void copy(Dimension1D dim){
this.setMinMax(dim.getMin(), dim.getMax());
}
public double getFraction(double point){
if(this.isLog==false){
return (point-this.dimMin)/(this.dimMax-this.dimMin);
}
double min = this.dimMin;
double datapoint = point;
if(datapointdimMax){
this.setMinMax(dimMin, point);
}
}
/**
* returns an array of nice numbers to represent the dimension
* as axis.
* @param maxTicks
* @return
*/
public List getDimensionTicks(int maxTicks){
List axisTicks = new ArrayList();
double range = niceNum(dimMax - dimMin, false);
double tickSpacing = niceNum(range / (maxTicks - 1), true);
double niceMin =
Math.floor(dimMin / tickSpacing) * tickSpacing;
double niceMax =
Math.ceil(dimMax / tickSpacing) * tickSpacing;
double numberX = niceMin;
while(numberX<=this.dimMax){
if(numberX>=this.dimMin&&numberX<=this.dimMax){
axisTicks.add(numberX);
}
numberX += tickSpacing;
}
return axisTicks;
}
private List createTicks(int maxTicks, double min, double max){
List axisTicks = new ArrayList();
double range = niceNum(max - min, false);
double tickSpacing = niceNum(range / (maxTicks - 1), true);
double niceMin =
Math.floor(min / tickSpacing) * tickSpacing;
double niceMax =
Math.ceil(max / tickSpacing) * tickSpacing;
double numberX = niceMin;
while(numberX<=max){
if(numberX>=min&&numberX<=max){
axisTicks.add(numberX);
}
numberX += tickSpacing;
}
return axisTicks;
}
public List getDimensionTicksLog(int maxTicks){
List ticks = new ArrayList();
double axisMinimum = this.dimMin;
if(axisMinimum orderTicks = this.createTicks(maxTicks, orderMin, orderMax);
int count = 0;
for(Double value : orderTicks){
int power = (int) value.intValue();
//System.out.println(count + " : " + Math.pow(10, power));
ticks.add(Math.pow(10,power));
}
return ticks;
}
public boolean contains(double x){
return (x>=this.dimMin&&x<=this.dimMax);
}
/**
* Returns a "nice" number approximately equal to range Rounds
* the number if round = true Takes the ceiling if round = false.
*
* @param range the data range
* @param round whether to round the result
* @return a "nice" number to be used for the data range
*/
private double niceNum(double range, boolean round) {
double exponent; /** exponent of range */
double fraction; /** fractional part of range */
double niceFraction; /** nice, rounded fraction */
exponent = Math.floor(Math.log10(range));
fraction = range / Math.pow(10, exponent);
if (round) {
if (fraction < 1.5)
niceFraction = 1;
else if (fraction < 3)
niceFraction = 2;
else if (fraction < 7)
niceFraction = 5;
else
niceFraction = 10;
} else {
if (fraction <= 1)
niceFraction = 1;
else if (fraction <= 2)
niceFraction = 2;
else if (fraction <= 5)
niceFraction = 5;
else
niceFraction = 10;
}
return niceFraction * Math.pow(10, exponent);
}
public void addPadding(double fraction){
double value = fraction*getLength();
setMinMax(this.dimMin-value,this.dimMax+value);
}
public void addPadding(double frLow, double frHigh){
double valueL = frLow*getLength();
double valueH = frHigh*getLength();
setMinMax(this.dimMin-valueL,this.dimMax+valueH);
}
@Override
public String toString(){
return String.format("Dimension1D : %8.4f %8.4f", this.dimMin,this.dimMax);
}
public static void main(String[] args){
Dimension1D x = new Dimension1D(0.1,100.0);
x.setLog(true);
for(double value = 1.0; value < 10.0 ; value += 1.0){
System.out.println(value + " --> " + x.getFraction(value) + " length = " + x.length());
}
List ticks = x.getDimensionTicks(8);
for(Double v : ticks){
System.out.println(v);
}
List ticksLog = x.getDimensionTicksLog(8);
}
}
Ads help maintain this website.