gpt4 book ai didi

algorithm - 图轴的刻度线算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:56 24 4
gpt4 key购买 nike

我正在寻找一种在轴上放置刻度线的算法,给定显示范围、显示宽度以及测量刻度线宽度的函数。

例如,假设我需要在 1e-6 和 5e-6 之间显示以及以像素为单位显示的宽度,算法将确定我应该在 1e-6、2e-6、 3e-6、4e-6 和 5e-6。给定较小的宽度,它可能会决定最佳位置仅在偶数位置,即 2e-6 和 4e-6(因为放置更多刻度线会导致它们重叠)。

智能算法会优先选择 10、5 和 2 的倍数处的刻度线。此外,智能算法会围绕零对称。

最佳答案

由于我不喜欢目前找到的任何解决方案,因此我实现了自己的解决方案。它是用 C# 编写的,但可以轻松翻译成任何其他语言。

它基本上从可能的步骤列表中选择显示所有值的最小步骤,不会在边缘恰好留下任何值,让您轻松选择要使用的可能步骤(无需编辑丑陋的 if-else if block ),并支持任何范围的值。我使用 C# Tuple 返回三个值,只是为了进行快速简单的演示。

private static Tuple<decimal, decimal, decimal> GetScaleDetails(decimal min, decimal max)
{
// Minimal increment to avoid round extreme values to be on the edge of the chart
decimal epsilon = (max - min) / 1e6m;
max += epsilon;
min -= epsilon;
decimal range = max - min;

// Target number of values to be displayed on the Y axis (it may be less)
int stepCount = 20;
// First approximation
decimal roughStep = range / (stepCount - 1);

// Set best step for the range
decimal[] goodNormalizedSteps = { 1, 1.5m, 2, 2.5m, 5, 7.5m, 10 }; // keep the 10 at the end
// Or use these if you prefer: { 1, 2, 5, 10 };

// Normalize rough step to find the normalized one that fits best
decimal stepPower = (decimal)Math.Pow(10, -Math.Floor(Math.Log10((double)Math.Abs(roughStep))));
var normalizedStep = roughStep * stepPower;
var goodNormalizedStep = goodNormalizedSteps.First(n => n >= normalizedStep);
decimal step = goodNormalizedStep / stepPower;

// Determine the scale limits based on the chosen step.
decimal scaleMax = Math.Ceiling(max / step) * step;
decimal scaleMin = Math.Floor(min / step) * step;

return new Tuple<decimal, decimal, decimal>(scaleMin, scaleMax, step);
}

static void Main()
{
// Dummy code to show a usage example.
var minimumValue = data.Min();
var maximumValue = data.Max();
var results = GetScaleDetails(minimumValue, maximumValue);
chart.YAxis.MinValue = results.Item1;
chart.YAxis.MaxValue = results.Item2;
chart.YAxis.Step = results.Item3;
}

关于algorithm - 图轴的刻度线算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/237220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com