Skip to content

Commit 49c076f

Browse files
committed
core: fix identical positions when shifting envelope parts
1 parent 96fbe2b commit 49c076f

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

core/envelope-sim/src/main/java/fr/sncf/osrd/envelope/part/EnvelopePart.java

+21-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static fr.sncf.osrd.envelope.EnvelopePhysics.intersectStepWithSpeed;
44

5+
import com.carrotsearch.hppc.DoubleArrayList;
56
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
67
import fr.sncf.osrd.envelope.EnvelopeAttr;
78
import fr.sncf.osrd.envelope.EnvelopePhysics;
@@ -638,10 +639,26 @@ public EnvelopePart slice(
638639

639640
/** Returns a new EnvelopePart, where all positions are shifted by positionDelta */
640641
public EnvelopePart copyAndShift(double positionDelta) {
641-
var newPositions = new double[positions.length];
642-
for (int i = 0; i < positions.length; i++)
643-
newPositions[i] = positions[i] + positionDelta;
644-
return new EnvelopePart(new HashMap<>(attrs), newPositions, speeds, timeDeltas);
642+
var newPositions = new DoubleArrayList();
643+
var newSpeeds = new DoubleArrayList();
644+
var newTimeDeltas = new DoubleArrayList();
645+
newPositions.add(positions[0] + positionDelta);
646+
newSpeeds.add(speeds[0]);
647+
for (int i = 1; i < positions.length; i++) {
648+
var p = positions[i] + positionDelta;
649+
if (newPositions.get(newPositions.size() - 1) != p) {
650+
// Positions that are an epsilon away may be overlapping after the shift, we only add the distinct ones
651+
newPositions.add(p);
652+
newSpeeds.add(speeds[i]);
653+
newTimeDeltas.add(timeDeltas[i - 1]);
654+
}
655+
}
656+
return new EnvelopePart(
657+
new HashMap<>(attrs),
658+
newPositions.toArray(),
659+
newSpeeds.toArray(),
660+
newTimeDeltas.toArray()
661+
);
645662
}
646663

647664
// endregion

0 commit comments

Comments
 (0)