An axis legend source regarding the range as ordinary numbers and producing
string legends for them. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30526 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
707b2f9a94
commit
5664cf424e
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "chart/DefaultChartAxisLegendSource.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "chart/ChartDataRange.h"
|
||||||
|
#include "chart/StringChartLegend.h"
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
DefaultChartAxisLegendSource::GetAxisLegends(const ChartDataRange& range,
|
||||||
|
ChartLegend** legends, double* values, int32 maxLegends)
|
||||||
|
{
|
||||||
|
// TODO: Also support scientific notation! Otherwise the numbers can get really
|
||||||
|
// long.
|
||||||
|
double start = range.min;
|
||||||
|
double end = range.max;
|
||||||
|
double rangeSpan = end - start;
|
||||||
|
|
||||||
|
if (rangeSpan >= maxLegends / 2) {
|
||||||
|
// We only need to consider the integer part.
|
||||||
|
|
||||||
|
// find an interval so that we get maxLegends / 2 to maxLegends legends
|
||||||
|
double baseInterval = 1;
|
||||||
|
double relativeFactor = 1;
|
||||||
|
while (rangeSpan / baseInterval / relativeFactor >= maxLegends) {
|
||||||
|
if (relativeFactor == 1) {
|
||||||
|
relativeFactor = 2;
|
||||||
|
} else if (relativeFactor == 2) {
|
||||||
|
relativeFactor = 5;
|
||||||
|
} else if (relativeFactor == 5) {
|
||||||
|
baseInterval *= 10;
|
||||||
|
relativeFactor = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate the legends
|
||||||
|
int32 count = 0;
|
||||||
|
double interval = baseInterval * relativeFactor;
|
||||||
|
double value = ceil(start / interval) * interval;
|
||||||
|
for (; value <= end; value += interval) {
|
||||||
|
char buffer[128];
|
||||||
|
snprintf(buffer, sizeof(buffer), "%.0f", value);
|
||||||
|
StringChartLegend* legend
|
||||||
|
= new(std::nothrow) StringChartLegend(buffer, 1);
|
||||||
|
if (legend == NULL)
|
||||||
|
return count;
|
||||||
|
|
||||||
|
legends[count] = legend;
|
||||||
|
values[count++] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The range is so small that we need a fraction interval.
|
||||||
|
|
||||||
|
// First find out how many places after the decimal point we need.
|
||||||
|
int positions = 0;
|
||||||
|
double factor = 1;
|
||||||
|
while (rangeSpan * factor < maxLegends / 2) {
|
||||||
|
factor *= 10;
|
||||||
|
positions++;
|
||||||
|
}
|
||||||
|
|
||||||
|
double relativeFactor = 1;
|
||||||
|
if (rangeSpan * factor / relativeFactor >= maxLegends) {
|
||||||
|
relativeFactor = 2;
|
||||||
|
if (rangeSpan * factor / relativeFactor >= maxLegends)
|
||||||
|
relativeFactor = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate the legends
|
||||||
|
int32 count = 0;
|
||||||
|
double interval = relativeFactor / factor;
|
||||||
|
double shiftedValue = ceil(start / interval);
|
||||||
|
for (; shiftedValue * interval <= end; shiftedValue++) {
|
||||||
|
double value = shiftedValue * interval;
|
||||||
|
char buffer[128];
|
||||||
|
snprintf(buffer, sizeof(buffer), "%.*f", positions, value);
|
||||||
|
StringChartLegend* legend
|
||||||
|
= new(std::nothrow) StringChartLegend(buffer, 1);
|
||||||
|
if (legend == NULL)
|
||||||
|
return count;
|
||||||
|
|
||||||
|
legends[count] = legend;
|
||||||
|
values[count++] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef DEFAULT_CHART_AXIS_LEGEND_SOURCE_H
|
||||||
|
#define DEFAULT_CHART_AXIS_LEGEND_SOURCE_H
|
||||||
|
|
||||||
|
#include "chart/ChartAxisLegendSource.h"
|
||||||
|
|
||||||
|
|
||||||
|
class DefaultChartAxisLegendSource : public ChartAxisLegendSource {
|
||||||
|
public:
|
||||||
|
virtual int32 GetAxisLegends(const ChartDataRange& range,
|
||||||
|
ChartLegend** legends, double* values,
|
||||||
|
int32 maxLegends);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // DEFAULT_CHART_AXIS_LEGEND_SOURCE_H
|
|
@ -14,6 +14,7 @@ MergeObject DebugAnalyzer_gui_chart.o
|
||||||
ChartDataSource.cpp
|
ChartDataSource.cpp
|
||||||
ChartLegend.cpp
|
ChartLegend.cpp
|
||||||
ChartRenderer.cpp
|
ChartRenderer.cpp
|
||||||
|
DefaultChartAxisLegendSource.cpp
|
||||||
LegendChartAxis.cpp
|
LegendChartAxis.cpp
|
||||||
LineChartRenderer.cpp
|
LineChartRenderer.cpp
|
||||||
StringChartLegend.cpp
|
StringChartLegend.cpp
|
||||||
|
|
Loading…
Reference in New Issue