package org.osm2world.core.world.data; import static java.util.Arrays.asList; import java.util.List; import org.osm2world.core.map_data.data.MapWaySegment; import org.osm2world.core.map_elevation.creation.EleConstraintEnforcer; import org.osm2world.core.map_elevation.data.EleConnector; import org.osm2world.core.math.AxisAlignedBoundingBoxXZ; import org.osm2world.core.math.VectorXYZ; import org.osm2world.core.math.VectorXZ; import org.osm2world.core.math.datastructures.IntersectionTestObject; /** * superclass for {@link WaySegmentWorldObject}s that don't have an outline, * and are not part of a network. * Instead, they can be considered infinitely thin. */ public abstract class NoOutlineWaySegmentWorldObject implements WaySegmentWorldObject, IntersectionTestObject { protected final MapWaySegment segment; private final EleConnector startConnector; private final EleConnector endConnector; public NoOutlineWaySegmentWorldObject(MapWaySegment segment) { this.segment = segment; startConnector = new EleConnector(getStartPosition(), segment.getStartNode(), getGroundState()); endConnector = new EleConnector(getEndPosition(), segment.getEndNode(), getGroundState()); } @Override public final MapWaySegment getPrimaryMapElement() { return segment; } @Override public Iterable<EleConnector> getEleConnectors() { return asList(startConnector, endConnector); } @Override public void defineEleConstraints(EleConstraintEnforcer enforcer) {} @Override public VectorXZ getStartPosition() { return segment.getStartNode().getPos(); } @Override public VectorXZ getEndPosition() { return segment.getEndNode().getPos(); } @Override public AxisAlignedBoundingBoxXZ getAxisAlignedBoundingBoxXZ() { return new AxisAlignedBoundingBoxXZ(asList( getStartPosition(), getEndPosition())); } /** * returns the 3d start position. * Only available after elevation calculation. */ protected VectorXYZ getStartXYZ() { return startConnector.getPosXYZ(); } /** * returns the 3d end position. * Only available after elevation calculation. */ protected VectorXYZ getEndXYZ() { return endConnector.getPosXYZ(); } /** * returns the 3d vertex sequence running along the segment. * Only available after elevation calculation. */ protected List<VectorXYZ> getBaseline() { return asList(getStartXYZ(), getEndXYZ()); } }