DefaultsRoadNl.java

package org.opentrafficsim.road.definitions;

import java.awt.Color;
import java.util.List;
import java.util.Locale;

import org.djunits.value.vdouble.scalar.Length;
import org.djunits.value.vdouble.vector.LengthVector;
import org.opentrafficsim.base.StripeElement;
import org.opentrafficsim.core.definitions.DefaultsNl;
import org.opentrafficsim.road.gtu.generator.GeneratorPositions.LaneBias;
import org.opentrafficsim.road.gtu.generator.GeneratorPositions.LaneBiases;
import org.opentrafficsim.road.network.lane.LaneType;
import org.opentrafficsim.road.network.lane.StripeData;
import org.opentrafficsim.road.network.lane.StripeData.StripePhaseSync;

/**
 * Road defaults for locale nl_NL.
 * <p>
 * Copyright (c) 2022-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
 * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
 * </p>
 * @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a>
 * @author <a href="https://github.com/peter-knoppers">Peter Knoppers</a>
 * @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
 */
public class DefaultsRoadNl extends DefaultsRoad
{

    /**
     * Constructor setting locale nl_NL.
     */
    DefaultsRoadNl()
    {
        super(new Locale("nl", "NL"));
    }

    /***************************************************************************************/
    /**************************************** LANE *****************************************/
    /***************************************************************************************/

    /** For two-way roads. */
    public static final LaneType TWO_WAY_LANE = new LaneType("NL.TWO_WAY_LANE");

    /** Provincial road (provinciaalse weg / N-weg, 80km/h). */
    public static final LaneType PROVINCIAL_ROAD = new LaneType("NL.PROVINCIAL_ROAD", TWO_WAY_LANE);

    /** Rural (landelijk, 60km/h). */
    public static final LaneType RURAL_ROAD = new LaneType("NL.RURAL_ROAD", TWO_WAY_LANE);

    /** Urban (stedelijk, 50km/h). */
    public static final LaneType URBAN_ROAD = new LaneType("NL.URBAN_ROAD", TWO_WAY_LANE);

    /** Residential (woonerf, 30km/h). */
    public static final LaneType RESIDENTIAL_ROAD = new LaneType("NL.RESIDENTIAL_ROAD", TWO_WAY_LANE);

    /** For one-way roads. */
    public static final LaneType ONE_WAY_LANE = new LaneType("NL.ONE_WAY_LANE");

    /** Freeway (snelweg, 130km/h). */
    public static final LaneType FREEWAY = new LaneType("NL.FREEWAY", ONE_WAY_LANE);

    /** Highway (autoweg, 100km/h). */
    public static final LaneType HIGHWAY = new LaneType("NL.HIGHWAY", ONE_WAY_LANE);

    /** Bus lane. */
    public static final LaneType BUS_LANE = new LaneType("NL.BUS_LANE");

    /** Moped path (fiets-/bromfietspad). */
    public static final LaneType MOPED_PATH = new LaneType("NL.MOPED_PATH");

    /** Bicycle path (fietspad). */
    public static final LaneType BICYCLE_PATH = new LaneType("NL.BICYCLE_PATH", MOPED_PATH);

    /** Footpath (voetpad). */
    public static final LaneType FOOTPATH = new LaneType("NL.FOOTPATH");

    static
    {
        TWO_WAY_LANE.addCompatibleGtuType(DefaultsNl.ROAD_USER);
        ONE_WAY_LANE.addCompatibleGtuType(DefaultsNl.ROAD_USER);
        FREEWAY.addIncompatibleGtuType(DefaultsNl.PEDESTRIAN);
        FREEWAY.addIncompatibleGtuType(DefaultsNl.BICYCLE);
        HIGHWAY.addIncompatibleGtuType(DefaultsNl.PEDESTRIAN);
        HIGHWAY.addIncompatibleGtuType(DefaultsNl.BICYCLE);
        PROVINCIAL_ROAD.addIncompatibleGtuType(DefaultsNl.PEDESTRIAN);
        PROVINCIAL_ROAD.addIncompatibleGtuType(DefaultsNl.BICYCLE);
        BUS_LANE.addCompatibleGtuType(DefaultsNl.BUS);
        MOPED_PATH.addCompatibleGtuType(DefaultsNl.BICYCLE);
        BICYCLE_PATH.addIncompatibleGtuType(DefaultsNl.MOPED);
        FOOTPATH.addCompatibleGtuType(DefaultsNl.PEDESTRIAN);
    }

    /***************************************************************************************/
    /************************************** LANE BIAS **************************************/
    /***************************************************************************************/

    public static final LaneBiases LANE_BIAS_CAR_TRUCK = new LaneBiases();

    static
    {
        LANE_BIAS_CAR_TRUCK.addBias(DefaultsNl.CAR, LaneBias.WEAK_LEFT);
        LANE_BIAS_CAR_TRUCK.addBias(DefaultsNl.TRUCK, LaneBias.TRUCK_RIGHT);
    }

    /***************************************************************************************/
    /*************************************** STRIPES ***************************************/
    /***************************************************************************************/

    /** Standard width. */
    private static final Length CM20 = Length.instantiateSI(0.2);

    /** Standard dashes. */
    private static final LengthVector DASH = new LengthVector(new double[] {9.0, 3.0});

    /** Solid stripe. */
    public static final StripeData SOLID = new StripeData(List.of(StripeElement.continuous(CM20, Color.WHITE)), false, false);

    /** Left-permeable stripe. */
    public static final StripeData LEFT = new StripeData(List.of(StripeElement.continuous(CM20, Color.WHITE),
            StripeElement.gap(CM20), StripeElement.dashed(CM20, Color.WHITE, DASH)), true, false);

    /** Right-permable stripe. */
    public static final StripeData RIGHT = new StripeData(List.of(StripeElement.dashed(CM20, Color.WHITE, DASH),
            StripeElement.gap(CM20), StripeElement.continuous(CM20, Color.WHITE)), false, true);

    /** Dashed stripe. */
    public static final StripeData DASHED = new StripeData(List.of(StripeElement.dashed(CM20, Color.WHITE, DASH)), true, true);

    /** Double solid stripe. */
    public static final StripeData DOUBLE_SOLID = new StripeData(List.of(StripeElement.continuous(CM20, Color.WHITE),
            StripeElement.gap(CM20), StripeElement.continuous(CM20, Color.WHITE)), false, false);

    /** Double dashed stripe. */
    public static final StripeData DOUBLE_DASHED = new StripeData(List.of(StripeElement.dashed(CM20, Color.WHITE, DASH),
            StripeElement.gap(CM20), StripeElement.dashed(CM20, Color.WHITE, DASH)), true, true);

    /** Block stripe. */
    public static final StripeData BLOCK = new StripeData(
            List.of(StripeElement.dashed(CM20.times(2.0), Color.WHITE, new LengthVector(new double[] {3.0, 1.0}))), true, true);
    
    static
    {
        LEFT.setPhaseSync(StripePhaseSync.UPSTREAM);
        RIGHT.setPhaseSync(StripePhaseSync.UPSTREAM);
        DASHED.setPhaseSync(StripePhaseSync.UPSTREAM);
        DOUBLE_DASHED.setPhaseSync(StripePhaseSync.UPSTREAM);
        BLOCK.setPhaseSync(StripePhaseSync.UPSTREAM);
    }

}