好的,这是我为我们的一个应用程序提出的。请注意,它不处理您提到的“可选值”场景,因为我们的可选值始终为 0,但您应该不难修改。
数据会不断地添加到系列中,因此我们只需通过检查每个添加的数据点来保持 y 值的范围是最新的;这是非常便宜且易于跟踪的。相同的最小值和最大值是特殊情况:间距为 0 表示不应绘制任何标记。
这个解决方案与上面 Andrew 的建议没有什么不同,只是它以一种稍微笨拙的方式处理了指数乘数的一些任意分数。
最后,此示例使用 C# 编写。希望能帮助到你。
private float GetYMarkerSpacing()
{
YValueRange range = m_ScrollableCanvas.
TimelineCanvas.DataModel.CurrentYRange;
if ( range.RealMinimum == range.RealMaximum )
{
return 0;
}
float absolute = Math.Max(
Math.Abs( range.RealMinimum ),
Math.Abs( range.RealMaximum ) ),
spacing = 0;
for ( int power = 0; power < 39; ++power )
{
float temp = ( float ) Math.Pow( 10, power );
if ( temp <= absolute )
{
spacing = temp;
}
else if ( temp / 2 <= absolute )
{
spacing = temp / 2;
break;
}
else if ( temp / 2.5 <= absolute )
{
spacing = temp / 2.5F;
break;
}
else if ( temp / 4 <= absolute )
{
spacing = temp / 4;
break;
}
else if ( temp / 5 <= absolute )
{
spacing = temp / 5;
break;
}
else
{
break;
}
}
return spacing;
}