Skip to content

Commit

Permalink
DS v2
Browse files Browse the repository at this point in the history
  • Loading branch information
RZR-UA committed Feb 22, 2025
1 parent 6b8b215 commit 780a678
Showing 1 changed file with 47 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
public class OverlappedSegmentsMergerDS {

private static final double PRECISION = KMapUtils.DEFAULT_LATLON_PRECISION;
private static final double MAX_OVERLAP_DISTANCE_METERS = 10.0;

public static Track mergeSegmentsWithOverlapHandling(Track originalTrack) {
List<TrkSegment> originalSegments = new ArrayList<>(originalTrack.getSegments());
Expand Down Expand Up @@ -74,18 +75,63 @@ private static TrkSegment attemptMerge(TrkSegment a, TrkSegment b, ConnectionTyp
private static int findValidOverlap(List<WptPt> a, List<WptPt> b) {
for (int overlap = Math.min(a.size(), b.size()); overlap > 0; overlap--) {
if (isEdgeOverlap(a, b, overlap) && !createsLoop(a, b, overlap)) {
return overlap;
// Проверка и удаление "лишних" точек
int validOverlap = adjustOverlap(a, b, overlap);
return validOverlap;
}
}
return 0;
}

private static int adjustOverlap(List<WptPt> a, List<WptPt> b, int overlap) {
List<WptPt> aPart = a.subList(a.size() - overlap, a.size());
List<WptPt> bPart = b.subList(0, overlap);

// Удаляем точки из перекрытия, если они близки к линии другого сегмента
int valid = 0;
for (int i = 0; i < overlap; i++) {
if (isPointValid(aPart.get(i), b) || isPointValid(bPart.get(i), a)) {
valid++;
} else {
break;
}
}
return valid;
}

private static boolean isPointValid(WptPt pt, List<WptPt> segment) {
for (int j = 0; j < segment.size() - 1; j++) {
WptPt from = segment.get(j);
WptPt to = segment.get(j + 1);
double distance = KMapUtils.INSTANCE.getOrthogonalDistance(
pt.getLatitude(), pt.getLongitude(),
from.getLatitude(), from.getLongitude(),
to.getLatitude(), to.getLongitude()
);
if (distance <= MAX_OVERLAP_DISTANCE_METERS) {
return true;
}
}
return false;
}

private static boolean isEdgeOverlap(List<WptPt> a, List<WptPt> b, int overlap) {
List<WptPt> aPart = a.subList(a.size() - overlap, a.size());
List<WptPt> bPart = b.subList(0, overlap);
return isOverlap(aPart, bPart);
}

private static boolean isOverlap(List<WptPt> aPart, List<WptPt> bPart) {
for (int i = 0; i < aPart.size(); i++) {
WptPt aPt = aPart.get(i);
WptPt bPt = bPart.get(i);
if (!equals(aPt, bPt)) {
return false;
}
}
return true;
}

private static boolean createsLoop(List<WptPt> a, List<WptPt> b, int overlap) {
if (overlap <= 0 || overlap > a.size() || overlap > b.size()) {
return false;
Expand All @@ -103,13 +149,6 @@ private static boolean createsLoop(List<WptPt> a, List<WptPt> b, int overlap) {
return equals(firstAfterMerge, lastAfterMerge);
}

private static boolean isOverlap(List<WptPt> aPart, List<WptPt> bPart) {
for (int i = 0; i < aPart.size(); i++) {
if (!equals(aPart.get(i), bPart.get(i))) return false;
}
return true;
}

private static boolean isValidSegment(TrkSegment segment) {
List<WptPt> points = segment.getPoints();
if (points.size() < 2) return false;
Expand Down

0 comments on commit 780a678

Please sign in to comment.