File: SegmentChain.java

package info (click to toggle)
gpsprune 26.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,824 kB
  • sloc: java: 52,154; sh: 25; makefile: 21; python: 15
file content (114 lines) | stat: -rw-r--r-- 2,647 bytes parent folder | download | duplicates (4)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package tim.prune.function.sew;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import tim.prune.data.DataPoint;
import tim.prune.data.Track;

/**
 * A chain of segments
 */
public class SegmentChain
{
	private final ArrayList<Segment> _segments = new ArrayList<>();
	private final Track _track;

	/**
	 * Constructor
	 * @param inFirstSegment first segment of chain
	 */
	public SegmentChain(Track inTrack, Segment inFirstSegment) {
		_segments.add(inFirstSegment);
		_track = inTrack;
	}

	private DataPoint getFirstPoint() {
		return _track.getPoint(_segments.get(0).getStartIndex());
	}

	private DataPoint getLastPoint() {
		return _track.getPoint(_segments.get(_segments.size()-1).getEndIndex());
	}

	private boolean arePointsSame(DataPoint inFirst, DataPoint inSecond)
	{
		return inFirst.getLatitude().equals(inSecond.getLatitude())
			&& inFirst.getLongitude().equals(inSecond.getLongitude());
	}

	public boolean append(Segment inNextSegment)
	{
		DataPoint chainStart = getFirstPoint();
		DataPoint chainEnd = getLastPoint();
		for (int i=0; i<2; i++)
		{
			DataPoint segmentStart = _track.getPoint(inNextSegment.getStartIndex());
			if (arePointsSame(chainEnd, segmentStart))
			{
				_segments.add(inNextSegment);
				return true;
			}
			DataPoint segmentEnd = _track.getPoint(inNextSegment.getEndIndex());
			if (arePointsSame(chainStart, segmentEnd))
			{
				_segments.add(0, inNextSegment);
				return true;
			}
			inNextSegment.reverse();
		}
		return false;
	}

	/**
	 * Reverse the whole chain
	 */
	private void reverse()
	{
		for (Segment segment : _segments) {
			segment.reverse();
		}
		Collections.reverse(_segments);
	}

	/**
	 * Try to add another chain to this one
	 * @param inOther other chain
	 * @return true if successful, other one is now redundant
	 */
	public boolean append(SegmentChain inOther)
	{
		DataPoint chainStart = getFirstPoint();
		DataPoint chainEnd = getLastPoint();
		for (int i=0; i<2; i++)
		{
			DataPoint segmentStart = inOther.getFirstPoint();
			if (arePointsSame(chainEnd, segmentStart))
			{
				_segments.addAll(inOther._segments);
				return true;
			}
			DataPoint segmentEnd = inOther.getLastPoint();
			if (arePointsSame(chainStart, segmentEnd))
			{
				_segments.addAll(0, inOther._segments);
				return true;
			}
			inOther.reverse();
		}
		return false;
	}

	/**
	 * @return the point indices of this chain in order
	 */
	public List<Integer> getPointIndexes()
	{
		ArrayList<Integer> result = new ArrayList<>();
		for (Segment segment : _segments) {
			result.addAll(segment.getPointIndexes(result.isEmpty()));
		}
		return result;
	}
}