if (firstHeading.isPresent() && secondHeading.isPresent()) final Angle candidate = firstHeading.get().difference(secondHeading.get()); if (candidate.isGreaterThan(maximum))
/** * @return The location of the biggest Angle in this {@link PolyLine} */ public Optional<Location> maximumAngleLocation() { final List<Segment> segments = segments(); if (segments.isEmpty() || segments.size() == 1) { return Optional.empty(); } Angle maximum = Angle.NONE; Location maximumAngleLocation = null; for (int i = 1; i < segments.size(); i++) { final Segment first = segments.get(i - 1); final Segment second = segments.get(i); final Optional<Heading> firstHeading = first.heading(); final Optional<Heading> secondHeading = second.heading(); if (firstHeading.isPresent() && secondHeading.isPresent()) { final Angle candidate = firstHeading.get().difference(secondHeading.get()); if (candidate.isGreaterThan(maximum) || maximumAngleLocation == null) { maximum = candidate; maximumAngleLocation = first.end(); } } } return Optional.ofNullable(maximumAngleLocation); }
if (firstHeading.isPresent() && secondHeading.isPresent()) final Angle candidate = firstHeading.get().difference(secondHeading.get()); if (candidate.isLessThanOrEqualTo(target))
if (firstHeading.isPresent() && secondHeading.isPresent()) final Angle candidate = firstHeading.get().difference(secondHeading.get()); if (candidate.isGreaterThanOrEqualTo(target))
/** * Checks if the difference in heading between the incoming and outgoing {@link Edge}s exceeds * the threshold * * @param incoming * The incoming {@link Edge} * @param outgoing * The outgoing {@link Edge} */ protected void checkIfEdgeHeadingDifferenceExceedsThreshold(final Edge incoming, final Edge outgoing) { if (!isSnakeRoad()) { final Optional<Heading> incomingHeading = incoming.overallHeading(); final Optional<Heading> outgoingHeading = outgoing.overallHeading(); if (incomingHeading.isPresent() && outgoingHeading.isPresent() && incomingHeading.get().difference(outgoingHeading.get()) .isGreaterThanOrEqualTo(this.edgeHeadingDifferenceThreshold)) { setSnakeRoadStatus(true); } } }
&& previousHeading.get().difference(nextHeading.get()).isGreaterThan(threshold))
Assert.assertEquals(Angle.NONE, Heading.degrees(-180).difference(Angle.degrees(0))); Assert.assertEquals(Angle.degrees(20), Heading.degrees(-180).difference(Angle.degrees(20))); Assert.assertEquals(Angle.degrees(70), Heading.degrees(-180).difference(Angle.degrees(70))); Assert.assertEquals(Angle.degrees(90), Heading.degrees(-180).difference(Angle.degrees(90))); Assert.assertEquals(Heading.degrees(-180).difference(Angle.degrees(160)), Angle.degrees(160)); Assert.assertEquals(Angle.MAXIMUM, Heading.degrees(-180).difference(Angle.degrees(180))); Assert.assertEquals(Heading.degrees(-180).difference(Angle.degrees(200)), Angle.degrees(160)); Assert.assertEquals(Heading.degrees(-180).difference(Angle.degrees(250)), Angle.degrees(110)); Assert.assertEquals(Heading.degrees(-180).difference(Angle.degrees(270)), Angle.degrees(90)); Assert.assertEquals(Heading.degrees(-180).difference(Angle.degrees(290)), Angle.degrees(70)); Assert.assertEquals(Heading.degrees(-180).difference(Angle.degrees(340)), Angle.degrees(20)); Assert.assertEquals(Angle.NONE, Heading.degrees(-180).difference(Angle.degrees(360))); Assert.assertEquals(Heading.degrees(-180).difference(Angle.degrees(380)), Angle.degrees(20)); Assert.assertEquals(Angle.degrees(90), Heading.degrees(-90).difference(Angle.degrees(0))); Assert.assertEquals(Angle.degrees(70), Heading.degrees(-90).difference(Angle.degrees(20))); Assert.assertEquals(Angle.degrees(20), Heading.degrees(-90).difference(Angle.degrees(70))); Assert.assertEquals(Angle.NONE, Heading.degrees(-90).difference(Angle.degrees(90))); Assert.assertEquals(Angle.degrees(70), Heading.degrees(-90).difference(Angle.degrees(160))); Assert.assertEquals(Angle.degrees(90), Heading.degrees(-90).difference(Angle.degrees(180))); Assert.assertEquals(Heading.degrees(-90).difference(Angle.degrees(200)), Angle.degrees(110));
Assert.assertEquals(Angle.MAXIMUM, Heading.degrees(-180).difference(Heading.degrees(0))); Assert.assertEquals(Heading.degrees(-180).difference(Heading.degrees(20)), Angle.degrees(160)); Assert.assertEquals(Heading.degrees(-180).difference(Heading.degrees(70)), Angle.degrees(110)); Assert.assertEquals(Heading.degrees(-180).difference(Heading.degrees(90)), Angle.degrees(90)); Assert.assertEquals(Heading.degrees(-180).difference(Heading.degrees(160)), Angle.degrees(20)); Assert.assertEquals(Heading.degrees(-180).difference(Heading.degrees(180)), Angle.degrees(0)); Assert.assertEquals(Heading.degrees(-180).difference(Heading.degrees(200)), Angle.degrees(20)); Assert.assertEquals(Heading.degrees(-180).difference(Heading.degrees(250)), Angle.degrees(70)); Assert.assertEquals(Heading.degrees(-180).difference(Heading.degrees(270)), Angle.degrees(90)); Assert.assertEquals(Heading.degrees(-180).difference(Heading.degrees(290)), Angle.degrees(110)); Assert.assertEquals(Heading.degrees(-180).difference(Heading.degrees(340)), Angle.degrees(160)); Assert.assertEquals(Angle.MAXIMUM, Heading.degrees(-180).difference(Heading.degrees(360))); Assert.assertEquals(Heading.degrees(-180).difference(Heading.degrees(380)), Angle.degrees(160)); Assert.assertEquals(Angle.degrees(90), Heading.degrees(-90).difference(Heading.degrees(0))); Assert.assertEquals(Heading.degrees(-90).difference(Heading.degrees(20)), Angle.degrees(110)); Assert.assertEquals(Heading.degrees(-90).difference(Heading.degrees(70)),
@Test public void testHeadingTo() { final Location location1 = new Location(Latitude.degrees(37.336900), Longitude.degrees(-122.005414)); final Location location2 = new Location(Latitude.degrees(37.332758), Longitude.degrees(-122.005409)); Assert.assertTrue(Heading.degrees(180).difference(location1.headingTo(location2)) .isLessThan(Angle.degrees(1))); }