All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gov.nasa.worldwind.render.ContourLinePolygon Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2012 United States Government as represented by the Administrator of the
 * National Aeronautics and Space Administration.
 * All Rights Reserved.
 */
package gov.nasa.worldwind.render;

import gov.nasa.worldwind.geom.*;
import gov.nasa.worldwind.globes.Globe;
import gov.nasa.worldwind.util.*;

import java.util.*;

/**
 * Renders a contour line on the terrain at a given elevation. The controur line extent is bounded by a polygon defined
 * by a list of {@link LatLon}.
 *
 * @author Patrick Murris
 * @version $Id: ContourLinePolygon.java 1171 2013-02-11 21:45:02Z dcollins $
 */
public class ContourLinePolygon extends ContourLine
{
    private ArrayList positions;

    public ContourLinePolygon()
    {
        super();
    }

    public ContourLinePolygon(double elevation)
    {
        super(elevation);
    }

    public ContourLinePolygon(double elevation, ArrayList positions)
    {
        super(elevation);
        this.setPositions(positions);
    }

    /**
     * Get the list of {@link LatLon} that describe the current bounding polygon.
     *
     * @return the list of {@link LatLon} that describe the current bounding polygon.
     */
    public List getPositions()
    {
        return this.positions;
    }

    /**
     * Set the list of {@link LatLon} that describes a closed polygon - one which last position is equal to the first,
     * used to delineate the extent of the contour line.
     *
     * @param positions the list of {@link LatLon} that describe a closed polygon.
     *
     * @throws IllegalArgumentException if positions is null.
     */
    public void setPositions(ArrayList positions)
    {
        if (positions == null)
        {
            String message = Logging.getMessage("nullValue.PositionsListIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        this.positions = positions;
        this.setSector(Sector.boundingSector(positions));
        this.update();
    }

    /**
     * Filters the given intersection segments list according to some criteria - here the inclusion inside the current
     * polygon.
     *
     * @param dc   the current {@link DrawContext}
     * @param list the list of {@link Intersection} to be filtered.
     *
     * @return the filtered list.
     */
    protected ArrayList filterIntersections(DrawContext dc, ArrayList list)
    {
        // Filter against the bounding sector first
        list = super.filterIntersections(dc, list);

        // Filter the remaining segments against the polygon
        if (this.getPositions() == null)
            return list;

        Globe globe = dc.getGlobe();
        int i = 0;
        while (i < list.size())
        {
            if (WWMath.isLocationInside(globe.computePositionFromPoint(list.get(i).getIntersectionPoint()),
                this.positions) &&
                WWMath.isLocationInside(globe.computePositionFromPoint(list.get(i + 1).getIntersectionPoint()),
                    this.positions))
                // Keep segment
                i += 2;
            else
            {
                // Remove segment
                list.remove(i);
                list.remove(i);
            }
        }
        return list;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy