Skip to content

Commit 4abb91c

Browse files
committed
Implemented FlatImage.IntersectionOfSegments() method with tests
1 parent 5fb6dfe commit 4abb91c

2 files changed

Lines changed: 94 additions & 0 deletions

File tree

Src/ScreenGrid.Models.Tests/FlatImageTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,48 @@ public void FindZeroSegmentsTestSimpleSegment2()
133133
Assert.AreEqual(4, result[0].Item2);
134134
}
135135

136+
[Test]
137+
public void IntersectionOfSegmentsFullIntersection()
138+
{
139+
var result = FlatImage.IntersectionOfSegments(
140+
new Tuple<int, int>(1, 2),
141+
new Tuple<int, int>(1, 2));
142+
Assert.AreEqual(new Tuple<int, int>(1, 2), result);
143+
}
144+
145+
[Test]
146+
public void IntersectionOfSegmentsPartialIntersection()
147+
{
148+
var a = new Tuple<int, int>(1, 4);
149+
var b = new Tuple<int, int>(2, 8);
150+
151+
Assert.AreEqual(new Tuple<int, int>(2, 4), FlatImage.IntersectionOfSegments(a, b));
152+
Assert.AreEqual(new Tuple<int, int>(2, 4), FlatImage.IntersectionOfSegments(b, a));
153+
}
154+
155+
[Test]
156+
public void IntersectionOfSegmentsNoIntersection()
157+
{
158+
var result = FlatImage.IntersectionOfSegments(
159+
new Tuple<int, int>(1, 2),
160+
new Tuple<int, int>(4, 5));
161+
Assert.IsNull(result);
162+
}
163+
164+
[Test]
165+
public void IntersectionOfSegments()
166+
{
167+
var result = FlatImage.IntersectionOfSegments(new[]
168+
{
169+
new[] { new Tuple<int, int>(1, 2), new Tuple<int, int>(4, 6) },
170+
new[] { new Tuple<int, int>(1, 2), new Tuple<int, int>(5, 10) },
171+
});
172+
173+
Assert.AreEqual(2, result.Count);
174+
Assert.AreEqual(new Tuple<int, int>(1, 2), result[0]);
175+
Assert.AreEqual(new Tuple<int, int>(5, 6), result[1]);
176+
}
177+
136178
private static FlatImage LoadFlatImageFromResource(string resourceName)
137179
{
138180
FlatImage flatImage;

Src/ScreenGrid.Models/FlatImage.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ public UInt32[] GetHorizontalStripe(int iy)
5555
return result;
5656
}
5757

58+
// TODO: move to separate class
59+
5860
public static UInt32[] GetDerivative(UInt32[] stripe)
5961
{
6062
var result = new UInt32[stripe.Length];
@@ -124,6 +126,56 @@ private static bool CheckSegmentLength(Tuple<int, int> segment, int minimalSegme
124126
return ((segment.Item2 - segment.Item1 + 1) >= minimalSegmentLength);
125127
}
126128

129+
public static Tuple<int, int> IntersectionOfSegments(Tuple<int, int> segment1, Tuple<int, int> segment2)
130+
{
131+
if ((segment1.Item1 > segment2.Item2) || (segment1.Item2 < segment2.Item1))
132+
{
133+
return null;
134+
}
135+
else
136+
{
137+
var start = Math.Max(segment1.Item1, segment2.Item1);
138+
var end = Math.Min(segment1.Item2, segment2.Item2);
139+
return new Tuple<int, int>(start, end);
140+
}
141+
}
142+
143+
public static IList<Tuple<int, int>> IntersectionOfSegments(IEnumerable<IList<Tuple<int, int>>> lines)
144+
{
145+
var sum = new List<Tuple<int, int>>();
146+
foreach (var line in lines)
147+
{
148+
if (sum.Count == 0)
149+
{
150+
sum.AddRange(line);
151+
}
152+
else
153+
{
154+
// Perform intersection checks
155+
var newSum = new List<Tuple<int, int>>();
156+
foreach (var segmentA in sum)
157+
{
158+
foreach (var segmentB in line)
159+
{
160+
var r = IntersectionOfSegments(segmentA, segmentB);
161+
if (r != null)
162+
{
163+
newSum.Add(r);
164+
}
165+
}
166+
}
167+
168+
sum = newSum;
169+
if (sum.Count == 0)
170+
{
171+
break;
172+
}
173+
}
174+
}
175+
176+
return sum;
177+
}
178+
127179
public bool CompareWithFragment(FlatImage fragment, int startX, int startY)
128180
{
129181
for (var x = 0; x < fragment.Width; x++)

0 commit comments

Comments
 (0)