Skip to content

Commit dd11256

Browse files
committed
basic GetScreenPosition
1 parent 2c71ea8 commit dd11256

File tree

4 files changed

+55
-14
lines changed

4 files changed

+55
-14
lines changed

src/dsstats.maui/dsstats.builder/dsstats.builder.tests/ScreenAreaTests.cs

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,21 @@
33
[TestClass]
44
public sealed class ScreenAreaTests
55
{
6+
private void AssertPointsAreClose(RlPoint expected, RlPoint actual, int tolerance = 5)
7+
{
8+
Assert.IsTrue(
9+
Math.Abs(expected.X - actual.X) <= tolerance &&
10+
Math.Abs(expected.Y - actual.Y) <= tolerance,
11+
$"Expected ({expected.X}, {expected.Y}), but got ({actual.X}, {actual.Y}) with tolerance ±{tolerance}");
12+
}
13+
614
[TestMethod]
715
public void CanCalculateCenter()
816
{
917
var screenArea = new ScreenArea(2560, 1440);
1018
var center = screenArea.GetCenter();
1119
var expected = new RlPoint(1280, 600);
12-
Assert.AreEqual(expected, center, $"Wrong center: ({center.X},{center.Y}");
20+
AssertPointsAreClose(expected, center);
1321
}
1422

1523
[TestMethod]
@@ -29,52 +37,62 @@ public void CanMapCenterPoint()
2937
var screenArea = new ScreenArea(2560, 1440);
3038
var buildArea = new BuildArea();
3139
var buildCenter = buildArea.GetCenter();
32-
var screenPos = screenArea.GetScreenPosition(buildCenter);
40+
var normalizedBuildCenter = buildArea.NormalizeToTop(buildCenter);
41+
var screenPos = screenArea.GetScreenPosition(normalizedBuildCenter);
3342
var expected = screenArea.GetCenter();
34-
Assert.AreEqual(expected, screenPos, $"point map failed: ({expected.X},{expected.Y}) => ({screenPos.X},{screenPos.Y})");
43+
AssertPointsAreClose(expected, screenPos);
3544
}
3645

3746
[TestMethod]
3847
public void CanMapLeftPoint()
3948
{
4049
var screenArea = new ScreenArea(2560, 1440);
4150
var replayPos = new RlPoint(73, 82);
42-
var screenPos = screenArea.GetScreenPosition(replayPos);
51+
var buildArea = new BuildArea();
52+
var normalizedReplayPos = buildArea.NormalizeToTop(replayPos);
53+
var screenPos = screenArea.GetScreenPosition(normalizedReplayPos);
4354

4455
var expected = new RlPoint(485, 437);
45-
Assert.AreEqual(expected, screenPos, $"point map failed: ({expected.X},{expected.Y}) => ({screenPos.X},{screenPos.Y})");
56+
AssertPointsAreClose(expected, screenPos);
4657
}
4758

4859
[TestMethod]
4960
public void CanMapRightPoint()
5061
{
5162
var screenArea = new ScreenArea(2560, 1440);
5263
var replayPos = new RlPoint(101, 76);
53-
var screenPos = screenArea.GetScreenPosition(replayPos);
64+
var buildArea = new BuildArea();
65+
var normalizedReplayPos = buildArea.NormalizeToTop(replayPos);
66+
var screenPos = screenArea.GetScreenPosition(normalizedReplayPos);
5467

5568
var expected = new RlPoint(2100, 765);
56-
Assert.AreEqual(expected, screenPos, $"point map failed: ({expected.X},{expected.Y}) => ({screenPos.X},{screenPos.Y})");
69+
AssertPointsAreClose(expected, screenPos);
5770
}
5871

5972
[TestMethod]
6073
public void CanMapTopPoint()
6174
{
6275
var screenArea = new ScreenArea(2560, 1440);
6376
var replayPos = new RlPoint(84, 93);
64-
var screenPos = screenArea.GetScreenPosition(replayPos);
77+
var buildArea = new BuildArea();
78+
var normalizedReplayPos = buildArea.NormalizeToTop(replayPos);
79+
var screenPos = screenArea.GetScreenPosition(normalizedReplayPos);
6580

6681
var expected = new RlPoint(1124, -110);
67-
Assert.AreEqual(expected, screenPos, $"point map failed: ({expected.X},{expected.Y}) => ({screenPos.X},{screenPos.Y})");
82+
AssertPointsAreClose(expected, screenPos);
6883
}
6984

7085
[TestMethod]
7186
public void CanMapBottomPoint()
7287
{
7388
var screenArea = new ScreenArea(2560, 1440);
7489
var replayPos = new RlPoint(90, 65);
75-
var screenPos = screenArea.GetScreenPosition(replayPos);
90+
var buildArea = new BuildArea();
91+
var normalizedReplayPos = buildArea.NormalizeToTop(replayPos);
92+
var screenPos = screenArea.GetScreenPosition(normalizedReplayPos);
7693

7794
var expected = new RlPoint(1468, 1423);
78-
Assert.AreEqual(expected, screenPos, $"point map failed: ({expected.X},{expected.Y}) => ({screenPos.X},{screenPos.Y})");
95+
AssertPointsAreClose(expected, screenPos);
7996
}
8097
}
98+

src/dsstats.maui/dsstats.builder/dsstats.builder/BuildArea.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ public bool PlaceUnit(string unit, RlPoint position)
3131
return true;
3232
}
3333

34+
public RlPoint NormalizeToTop(RlPoint point)
35+
{
36+
var top = polygon[1]; // Top corner is reference
37+
return new RlPoint(point.X - top.X, point.Y - top.Y);
38+
}
39+
3440
public RlPoint GetCenter()
3541
{
3642
int x1 = polygon.Min(m => m.X);

src/dsstats.maui/dsstats.builder/dsstats.builder/RlPoint.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ public static RlPoint Lerp(RlPoint a, RlPoint b, double t)
1313
public static RlPoint operator +(RlPoint a, RlPoint b) => new(a.X + b.X, a.Y + b.Y);
1414
public static RlPoint operator -(RlPoint a, RlPoint b) => new(a.X - b.X, a.Y - b.Y);
1515
public static RlPoint operator /(RlPoint a, int scalar) => new(a.X / scalar, a.Y / scalar);
16+
public static RlPoint operator *(RlPoint a, double scalar)
17+
=> new((int)(a.X * scalar), (int)(a.Y * scalar));
18+
1619

1720
public static RlPoint Zero => new(0, 0);
1821
}

src/dsstats.maui/dsstats.builder/dsstats.builder/ScreenArea.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,26 @@ public RlPoint GetCenter()
5252
}
5353

5454
/// <summary>
55-
/// maps the replay unit position to the screen position
55+
/// maps the normalized replay unit position to the screen position
5656
/// </summary>
5757
/// <param name="buildPoint"></param>
5858
/// <returns></returns>
59-
public RlPoint GetScreenPosition(RlPoint buildPoint)
59+
public RlPoint GetScreenPosition(RlPoint normalizedBuildPoint)
6060
{
61-
return RlPoint.Zero;
61+
var screenTop = polygon[1]; // Normalized origin
62+
var screenRight = polygon[2]; // (17, -17)
63+
var screenLeft = polygon[0]; // (-11, -11)
64+
65+
// Basis vectors (from Top)
66+
var xBasis = screenRight - screenTop; // ∆x over 17
67+
var yBasis = screenLeft - screenTop; // ∆y over -11
68+
69+
// Scale x/y contributions
70+
var xComponent = xBasis * (normalizedBuildPoint.X / 17.0);
71+
var yComponent = yBasis * (normalizedBuildPoint.Y / -11.0);
72+
73+
var screenPos = screenTop + xComponent + yComponent;
74+
75+
return ApplyTransforms(screenPos);
6276
}
6377
}

0 commit comments

Comments
 (0)