📄 logaxis.java
字号:
*
* @since 1.0.7
*/
protected void selectHorizontalAutoTickUnit(Graphics2D g2,
Rectangle2D dataArea, RectangleEdge edge) {
double tickLabelWidth = estimateMaximumTickLabelWidth(g2,
getTickUnit());
// start with the current tick unit...
TickUnitSource tickUnits = getStandardTickUnits();
TickUnit unit1 = tickUnits.getCeilingTickUnit(getTickUnit());
double unit1Width = exponentLengthToJava2D(unit1.getSize(), dataArea,
edge);
// then extrapolate...
double guess = (tickLabelWidth / unit1Width) * unit1.getSize();
NumberTickUnit unit2 = (NumberTickUnit)
tickUnits.getCeilingTickUnit(guess);
double unit2Width = exponentLengthToJava2D(unit2.getSize(), dataArea,
edge);
tickLabelWidth = estimateMaximumTickLabelWidth(g2, unit2);
if (tickLabelWidth > unit2Width) {
unit2 = (NumberTickUnit) tickUnits.getLargerTickUnit(unit2);
}
setTickUnit(unit2, false, false);
}
/**
* Converts a length in data coordinates into the corresponding length in
* Java2D coordinates.
*
* @param length the length.
* @param area the plot area.
* @param edge the edge along which the axis lies.
*
* @return The length in Java2D coordinates.
*
* @since 1.0.7
*/
public double exponentLengthToJava2D(double length, Rectangle2D area,
RectangleEdge edge) {
double one = valueToJava2D(calculateValue(1.0), area, edge);
double l = valueToJava2D(calculateValue(length + 1.0), area, edge);
return Math.abs(l - one);
}
/**
* Selects an appropriate tick value for the axis. The strategy is to
* display as many ticks as possible (selected from an array of 'standard'
* tick units) without the labels overlapping.
*
* @param g2 the graphics device.
* @param dataArea the area in which the plot should be drawn.
* @param edge the axis location.
*
* @since 1.0.7
*/
protected void selectVerticalAutoTickUnit(Graphics2D g2,
Rectangle2D dataArea,
RectangleEdge edge) {
double tickLabelHeight = estimateMaximumTickLabelHeight(g2);
// start with the current tick unit...
TickUnitSource tickUnits = getStandardTickUnits();
TickUnit unit1 = tickUnits.getCeilingTickUnit(getTickUnit());
double unitHeight = exponentLengthToJava2D(unit1.getSize(), dataArea,
edge);
// then extrapolate...
double guess = (tickLabelHeight / unitHeight) * unit1.getSize();
NumberTickUnit unit2 = (NumberTickUnit)
tickUnits.getCeilingTickUnit(guess);
double unit2Height = exponentLengthToJava2D(unit2.getSize(), dataArea,
edge);
tickLabelHeight = estimateMaximumTickLabelHeight(g2);
if (tickLabelHeight > unit2Height) {
unit2 = (NumberTickUnit) tickUnits.getLargerTickUnit(unit2);
}
setTickUnit(unit2, false, false);
}
/**
* Estimates the maximum tick label height.
*
* @param g2 the graphics device.
*
* @return The maximum height.
*
* @since 1.0.7
*/
protected double estimateMaximumTickLabelHeight(Graphics2D g2) {
RectangleInsets tickLabelInsets = getTickLabelInsets();
double result = tickLabelInsets.getTop() + tickLabelInsets.getBottom();
Font tickLabelFont = getTickLabelFont();
FontRenderContext frc = g2.getFontRenderContext();
result += tickLabelFont.getLineMetrics("123", frc).getHeight();
return result;
}
/**
* Estimates the maximum width of the tick labels, assuming the specified
* tick unit is used.
* <P>
* Rather than computing the string bounds of every tick on the axis, we
* just look at two values: the lower bound and the upper bound for the
* axis. These two values will usually be representative.
*
* @param g2 the graphics device.
* @param unit the tick unit to use for calculation.
*
* @return The estimated maximum width of the tick labels.
*
* @since 1.0.7
*/
protected double estimateMaximumTickLabelWidth(Graphics2D g2,
TickUnit unit) {
RectangleInsets tickLabelInsets = getTickLabelInsets();
double result = tickLabelInsets.getLeft() + tickLabelInsets.getRight();
if (isVerticalTickLabels()) {
// all tick labels have the same width (equal to the height of the
// font)...
FontRenderContext frc = g2.getFontRenderContext();
LineMetrics lm = getTickLabelFont().getLineMetrics("0", frc);
result += lm.getHeight();
}
else {
// look at lower and upper bounds...
FontMetrics fm = g2.getFontMetrics(getTickLabelFont());
Range range = getRange();
double lower = range.getLowerBound();
double upper = range.getUpperBound();
String lowerStr = "";
String upperStr = "";
NumberFormat formatter = getNumberFormatOverride();
if (formatter != null) {
lowerStr = formatter.format(lower);
upperStr = formatter.format(upper);
}
else {
lowerStr = unit.valueToString(lower);
upperStr = unit.valueToString(upper);
}
double w1 = fm.stringWidth(lowerStr);
double w2 = fm.stringWidth(upperStr);
result += Math.max(w1, w2);
}
return result;
}
/**
* Zooms in on the current range.
*
* @param lowerPercent the new lower bound.
* @param upperPercent the new upper bound.
*/
public void zoomRange(double lowerPercent, double upperPercent) {
Range range = getRange();
double start = range.getLowerBound();
double end = range.getUpperBound();
double log1 = calculateLog(start);
double log2 = calculateLog(end);
double length = log2 - log1;
Range adjusted = null;
if (isInverted()) {
double logA = log1 + length * (1 - upperPercent);
double logB = log1 + length * (1 - lowerPercent);
adjusted = new Range(calculateValue(logA), calculateValue(logB));
}
else {
double logA = log1 + length * lowerPercent;
double logB = log1 + length * upperPercent;
adjusted = new Range(calculateValue(logA), calculateValue(logB));
}
setRange(adjusted);
}
/**
* Creates a tick label for the specified value.
*
* @param value the value.
*
* @return The label.
*/
private String createTickLabel(double value) {
if (this.numberFormatOverride != null) {
return this.numberFormatOverride.format(value);
}
else {
return this.tickUnit.valueToString(value);
}
}
/**
* Tests this axis for equality with an arbitrary object.
*
* @param obj the object (<code>null</code> permitted).
*
* @return A boolean.
*/
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof LogAxis)) {
return false;
}
LogAxis that = (LogAxis) obj;
if (this.base != that.base) {
return false;
}
if (this.smallestValue != that.smallestValue) {
return false;
}
if (this.minorTickCount != that.minorTickCount) {
return false;
}
return super.equals(obj);
}
/**
* Returns a hash code for this instance.
*
* @return A hash code.
*/
public int hashCode() {
int result = 193;
long temp = Double.doubleToLongBits(this.base);
result = 37 * result + (int) (temp ^ (temp >>> 32));
result = 37 * result + this.minorTickCount;
temp = Double.doubleToLongBits(this.smallestValue);
result = 37 * result + (int) (temp ^ (temp >>> 32));
if (this.numberFormatOverride != null) {
result = 37 * result + this.numberFormatOverride.hashCode();
}
result = 37 * result + this.tickUnit.hashCode();
return result;
}
/**
* Returns a collection of tick units for log (base 10) values.
* Uses a given Locale to create the DecimalFormats.
*
* @param locale the locale to use to represent Numbers.
*
* @return A collection of tick units for integer values.
*
* @since 1.0.7
*/
public static TickUnitSource createLogTickUnits(Locale locale) {
TickUnits units = new TickUnits();
NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
units.add(new NumberTickUnit(1, numberFormat));
units.add(new NumberTickUnit(2, numberFormat));
units.add(new NumberTickUnit(5, numberFormat));
units.add(new NumberTickUnit(10, numberFormat));
units.add(new NumberTickUnit(20, numberFormat));
units.add(new NumberTickUnit(50, numberFormat));
units.add(new NumberTickUnit(100, numberFormat));
units.add(new NumberTickUnit(200, numberFormat));
units.add(new NumberTickUnit(500, numberFormat));
units.add(new NumberTickUnit(1000, numberFormat));
units.add(new NumberTickUnit(2000, numberFormat));
units.add(new NumberTickUnit(5000, numberFormat));
units.add(new NumberTickUnit(10000, numberFormat));
units.add(new NumberTickUnit(20000, numberFormat));
units.add(new NumberTickUnit(50000, numberFormat));
units.add(new NumberTickUnit(100000, numberFormat));
units.add(new NumberTickUnit(200000, numberFormat));
units.add(new NumberTickUnit(500000, numberFormat));
units.add(new NumberTickUnit(1000000, numberFormat));
units.add(new NumberTickUnit(2000000, numberFormat));
units.add(new NumberTickUnit(5000000, numberFormat));
units.add(new NumberTickUnit(10000000, numberFormat));
units.add(new NumberTickUnit(20000000, numberFormat));
units.add(new NumberTickUnit(50000000, numberFormat));
units.add(new NumberTickUnit(100000000, numberFormat));
units.add(new NumberTickUnit(200000000, numberFormat));
units.add(new NumberTickUnit(500000000, numberFormat));
units.add(new NumberTickUnit(1000000000, numberFormat));
units.add(new NumberTickUnit(2000000000, numberFormat));
units.add(new NumberTickUnit(5000000000.0, numberFormat));
units.add(new NumberTickUnit(10000000000.0, numberFormat));
return units;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -