|
2 | 2 |
|
3 | 3 | import static fr.sncf.osrd.envelope.EnvelopePhysics.intersectStepWithSpeed;
|
4 | 4 |
|
| 5 | +import com.carrotsearch.hppc.DoubleArrayList; |
5 | 6 | import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
6 | 7 | import fr.sncf.osrd.envelope.EnvelopeAttr;
|
7 | 8 | import fr.sncf.osrd.envelope.EnvelopePhysics;
|
@@ -638,10 +639,26 @@ public EnvelopePart slice(
|
638 | 639 |
|
639 | 640 | /** Returns a new EnvelopePart, where all positions are shifted by positionDelta */
|
640 | 641 | 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 | + ); |
645 | 662 | }
|
646 | 663 |
|
647 | 664 | // endregion
|
|
0 commit comments