-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFieldData.cs
64 lines (61 loc) · 2.47 KB
/
FieldData.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
namespace Segmentus
{
class FieldData
{
public const int InvalidSegmentID = -1;
const int MinSegmentDist = 50;
public int pointsCnt, segmentsCnt;
public Geom.Point[] points;
public Geom.Segment[] segments;
public int[,] segmentID;
public int[][] intersectedWith;
public int[] pointAbySegment;
public int[] pointBbySegment;
public FieldData(Geom.Point[] points)
{
this.points = points;
pointsCnt = points.Length;
segmentID = new int[pointsCnt, pointsCnt];
for (int i = 0; i < pointsCnt; ++i)
for (int j = 0; j < pointsCnt; ++j)
segmentID[i, j] = InvalidSegmentID;
segments = new Geom.Segment[pointsCnt * pointsCnt];
segmentsCnt = 0;
for (int i = 0; i < pointsCnt; ++i)
for (int j = i + 1; j < pointsCnt; ++j)
{
bool correct = true;
Geom.Segment cur = new Geom.Segment(points[i], points[j]);
for (int k = 0; k < pointsCnt && correct; ++k)
if (k != i && k != j)
correct &= Geom.Dist(cur, points[k]) >= MinSegmentDist;
if (!correct)
continue;
int segID = segmentsCnt++;
segmentID[i, j] = segmentID[j, i] = segID;
segments[segID] = cur;
}
Array.Resize(ref segments, segmentsCnt);
intersectedWith = new int[segmentsCnt][];
for (int i = 0; i < segmentsCnt; ++i)
{
intersectedWith[i] = new int[segmentsCnt];
int intersectedCnt = 0;
for (int j = 0; j < segmentsCnt; ++j)
if (Geom.IsIntersected(segments[i], segments[j]))
intersectedWith[i][intersectedCnt++] = j;
Array.Resize(ref intersectedWith[i], intersectedCnt);
}
pointAbySegment = new int[segmentsCnt];
pointBbySegment = new int[segmentsCnt];
for (int i = 0; i < pointsCnt; ++i)
for (int j = i + 1; j < pointsCnt; ++j)
if (segmentID[i, j] != InvalidSegmentID)
{
pointAbySegment[segmentID[i, j]] = i;
pointBbySegment[segmentID[i, j]] = j;
}
}
}
}