Mercurial > hg > openttd
changeset 14940:f042e7eb7d0e draft
(svn r19543) -Feature [FS#3726]: Scale the vertical axis of graphs depending on the graph's highest value.
author | terkhen <terkhen@openttd.org> |
---|---|
date | Fri, 02 Apr 2010 16:45:53 +0000 |
parents | d5e618321973 |
children | b33bff663a19 |
files | src/graph_gui.cpp |
diffstat | 1 files changed, 19 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -199,25 +199,32 @@ byte colours[GRAPH_MAX_DATASETS]; OverflowSafeInt64 cost[GRAPH_MAX_DATASETS][GRAPH_NUM_MONTHS]; ///< Stored costs for the last #GRAPH_NUM_MONTHS months - int64 GetHighestValue(int initial_highest_value) const + /** + * Get the highest value of the graph's data. Excluded data is taken into account too, to prevent the graph + * from changing its size when enabling / disabling data. + * @return Highest value of the graph. + */ + int64 GetHighestValue() const { - OverflowSafeInt64 highest_value = initial_highest_value; + OverflowSafeInt64 highest_value = 0; for (int i = 0; i < this->num_dataset; i++) { - if (!HasBit(this->excluded_data, i)) { - for (int j = 0; j < this->num_on_x_axis; j++) { - OverflowSafeInt64 datapoint = this->cost[i][j]; + for (int j = 0; j < this->num_on_x_axis; j++) { + OverflowSafeInt64 datapoint = this->cost[i][j]; - if (datapoint != INVALID_DATAPOINT) { - /* For now, if the graph has negative values the scaling is - * symmetrical about the x axis, so take the absolute value - * of each data point. */ - highest_value = max(highest_value, abs(datapoint)); - } + if (datapoint != INVALID_DATAPOINT) { + /* For now, if the graph has negative values the scaling is + * symmetrical about the x axis, so take the absolute value + * of each data point. */ + highest_value = max(highest_value, abs(datapoint)); } } } + /* Prevent showing the highest value too close to the graph upper limit. */ + highest_value = (11 * highest_value) / 10; + /* Avoid using zero as the highest value. */ + if (highest_value == 0) highest_value = GRAPH_NUM_LINES_Y - 1; /* Round up highest_value so that it will divide cleanly into the number of * axis labels used. */ int round_val = highest_value % (GRAPH_NUM_LINES_Y - 1); @@ -274,13 +281,7 @@ r.left += 9; r.right -= 5; - /* Start of with a highest_value of twice the height of the graph in pixels. - * It's a bit arbitrary, but it makes the cargo payment graph look a little - * nicer, and prevents division by zero when calculating where the datapoint - * should be drawn. */ - highest_value = r.bottom - r.top + 1; - if (!this->has_negative_values) highest_value *= 2; - highest_value = GetHighestValue(highest_value); + highest_value = GetHighestValue(); /* Get width for Y labels */ int label_width = GetYLabelWidth(highest_value);