Merge pull request #17068 from peppy/fix-hit-distribution-rounding

Fix hit distribution graph midpoint rounding not looking great around zero
This commit is contained in:
Dean Herbert 2022-03-04 22:16:30 +09:00 committed by GitHub
commit d6e78e7d95
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 2 deletions

View File

@ -23,6 +23,12 @@ namespace osu.Game.Tests.Visual.Ranking
createTest(CreateDistributedHitEvents()); createTest(CreateDistributedHitEvents());
} }
[Test]
public void TestManyDistributedEventsOffset()
{
createTest(CreateDistributedHitEvents(-3.5));
}
[Test] [Test]
public void TestAroundCentre() public void TestAroundCentre()
{ {

View File

@ -64,10 +64,22 @@ namespace osu.Game.Screens.Ranking.Statistics
// Prevent div-by-0 by enforcing a minimum bin size // Prevent div-by-0 by enforcing a minimum bin size
binSize = Math.Max(1, binSize); binSize = Math.Max(1, binSize);
bool roundUp = true;
foreach (var e in hitEvents) foreach (var e in hitEvents)
{ {
int binOffset = (int)Math.Round(e.TimeOffset / binSize, MidpointRounding.AwayFromZero); double binOffset = e.TimeOffset / binSize;
bins[timing_distribution_centre_bin_index + binOffset]++;
// .NET's round midpoint handling doesn't provide a behaviour that works amazingly for display
// purposes here. We want midpoint rounding to roughly distribute evenly to each adjacent bucket
// so the easiest way is to cycle between downwards and upwards rounding as we process events.
if (Math.Abs(binOffset - (int)binOffset) == 0.5)
{
binOffset = (int)binOffset + Math.Sign(binOffset) * (roundUp ? 1 : 0);
roundUp = !roundUp;
}
bins[timing_distribution_centre_bin_index + (int)Math.Round(binOffset, MidpointRounding.AwayFromZero)]++;
} }
int maxCount = bins.Max(); int maxCount = bins.Max();