OK、これが私たちのアプリケーションの 1 つに思いついたものです。オプションの値は常に0であるため、言及した「オプションの値」シナリオは処理しないことに注意してください。ただし、変更するのは難しくありません。
データはシリーズに継続的に追加されるため、追加された各データ ポイントを検査することで、y 値の範囲を最新の状態に保ちます。これは非常に安価で、簡単に追跡できます。最小値と最大値が等しいという特殊なケースがあります。間隔 0 は、マーカーを描画しないことを示します。
このソリューションは、指数乗数の任意の分数を少し扱いにくい方法で処理することを除いて、上記のアンドリューの提案と似ていません。
最後に、このサンプルは 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;
}