cloudceiling.java

来自「world wind java sdk 源码」· Java 代码 · 共 508 行 · 第 1/2 页

JAVA
508
字号
/*
Copyright (C) 2001, 2009 United States Government as represented by
the Administrator of the National Aeronautics and Space Administration.
All Rights Reserved.
*/
package gov.nasa.worldwind.applications.sar;

import gov.nasa.worldwind.*;
import gov.nasa.worldwind.geom.*;
import gov.nasa.worldwind.globes.Globe;
import gov.nasa.worldwind.layers.RenderableLayer;
import gov.nasa.worldwind.render.*;
import gov.nasa.worldwind.util.*;

import java.awt.*;
import java.util.*;

/**
 * Display one or two contour lines depicting lower and upper cloud ceiling around a list of positions.
 * 
 * @author Patrick Murris
 * @version $Id: CloudCeiling.java 10060 2009-04-09 17:43:54Z dcollins $
 */
public class CloudCeiling implements Restorable
{
    public static String DELTA_MODE_PLUS = "Sar.CloudCeiling.DeltaModePlus";
    public static String DELTA_MODE_MINUS = "Sar.CloudCeiling.DeltaModeMinus";
    public static String DELTA_MODE_BOTH = "Sar.CloudCeiling.DeltaModeBoth";

    private WorldWindow wwd;
    private RenderableLayer layer = new RenderableLayer();
    private ContourLinePolygon[] lines = new ContourLinePolygon[2];
    private ScreenElevationLine[] screenLines = new ScreenElevationLine[2];
    private String name = "";
    private boolean enabled = true;
    private boolean showExtent = true;
    private String elevationUnit = SAR2.UNIT_IMPERIAL;
    private Color color = Color.WHITE;
    // Elevation
    private double elevationBase = 0;
    private double elevationDelta = 0;
    private String deltaMode = DELTA_MODE_PLUS;
    // Extent
    private ArrayList<? extends LatLon> centerPositions;
    private ArrayList<LatLon> extentPositions;
    private double radius = 10e3;
    private SurfacePolygon shape;

    public CloudCeiling(WorldWindow wwd)
    {
        this.wwd = wwd;
        this.lines[0] = new ContourLinePolygon();
        this.lines[1] = new ContourLinePolygon();
        this.screenLines[0] = new ScreenElevationLine();
        this.screenLines[1] = new ScreenElevationLine();
        this.setColor(this.color);
        this.updateElevations();
        this.layer.addRenderable(lines[0]);
        this.layer.addRenderable(lines[1]);
        this.layer.addRenderable(screenLines[0]);
        this.layer.addRenderable(screenLines[1]);
        this.layer.setPickEnabled(false);
        this.wwd.getModel().getLayers().add(this.layer);
    }

    public String getName()
    {
        return this.name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public boolean isEnabled()
    {
        return this.enabled;
    }

    public void setEnabled(boolean enabled)
    {
        this.enabled = enabled;
        this.lines[0].setEnabled(enabled);
        this.screenLines[0].setEnabled(enabled);
        if (this.elevationDelta > 0)
        {
            this.lines[1].setEnabled(enabled);
            this.screenLines[1].setEnabled(enabled);
        }
    }

    public Color getColor()
    {
        return this.color;
    }

    public void setColor(Color color)
    {
        this.color = color;
        this.lines[0].setColor(color.darker());
        this.lines[1].setColor(color.brighter());
        this.screenLines[0].setColor(color.darker());
        this.screenLines[1].setColor(color.brighter());
    }

    public String getElevationUnit()
    {
        return this.elevationUnit;
    }

    public void setElevationUnit(String unit)
    {
        if (!this.elevationUnit.equals(unit))
        {
            if (SAR2.UNIT_IMPERIAL.equals(unit))
            {
                this.elevationBase = SAR2.metersToFeet(this.elevationBase);
                this.elevationDelta = SAR2.metersToFeet(this.elevationDelta);
            }
            else
            {
                this.elevationBase = SAR2.feetToMeters(this.elevationBase);
                this.elevationDelta = SAR2.feetToMeters(this.elevationDelta);
            }
            this.elevationUnit = unit;
        }
    }

    public double getElevationBase()
    {
        return this.elevationBase;
    }

    public void setElevationBase(double elevation)
    {
        this.elevationBase = elevation;
        this.updateElevations();
    }

    public double getElevationDelta()
    {
        return this.elevationDelta;
    }

    public void setElevationDelta(double elevation)
    {
        this.elevationDelta = elevation;
        this.updateElevations();
    }

    public String getDeltaMode()
    {
        return this.deltaMode;
    }

    public void setDeltaMode(String mode)
    {
        this.deltaMode = mode;
        this.updateElevations();
    }

    private void updateElevations()
    {
        // Contour lines elevation is in meter, so convert if we are using feet
        double unitConvertion = SAR2.UNIT_IMPERIAL.equals(this.elevationUnit) ? SAR2.feetToMeters(1) : 1;
        if (this.deltaMode.equals(DELTA_MODE_PLUS))
        {
            lines[0].setElevation(this.elevationBase * unitConvertion);
            lines[1].setElevation((this.elevationBase + this.elevationDelta) * unitConvertion);
        }
        else if (this.deltaMode.equals(DELTA_MODE_MINUS))
        {
            lines[0].setElevation((this.elevationBase - this.elevationDelta) * unitConvertion);
            lines[1].setElevation(this.elevationBase * unitConvertion);
        }
        else if (this.deltaMode.equals(DELTA_MODE_BOTH))
        {
            lines[0].setElevation((this.elevationBase - this.elevationDelta) * unitConvertion);
            lines[1].setElevation((this.elevationBase + this.elevationDelta) * unitConvertion);
        }

        if (this.elevationDelta > 0)
            lines[1].setEnabled(this.isEnabled());
        else
            lines[1].setEnabled(false);

        // Synchonize screen lines
        screenLines[0].setElevation(lines[0].getElevation());
        screenLines[1].setElevation(lines[1].getElevation());
        screenLines[1].setEnabled(lines[1].isEnabled());
    }

    public double getRadius()
    {
        return this.radius;
    }

    public void setRadius(double radius)
    {
        this.radius = radius;
        this.updateExtent();
    }

    public ArrayList<? extends LatLon> getPositions()
    {
        return this.centerPositions;
    }

    public void setPositions(ArrayList<? extends LatLon> centerPositions)
    {
        this.centerPositions = centerPositions;
        this.updateExtent();
    }

    private void updateExtent()
    {
        if (this.centerPositions == null || this.radius <= 0)
            return;

        // Compute cloud ceiling perimeter extent positions
        this.computeExtentPositions();

        // Update contour lines
        this.lines[0].setPositions(this.extentPositions);
        this.lines[1].setPositions(this.extentPositions);
        updateExtentShape();
    }

    private void updateExtentShape()
    {
        if (this.shape != null)
        {
            this.layer.removeRenderable(this.shape);
        }
        if (this.enabled && this.showExtent && this.extentPositions != null && this.extentPositions.size() > 0)
        {
            this.shape = new SurfacePolygon(this.extentPositions);
            this.shape.getAttributes().setDrawOutline(false);
            this.shape.getAttributes().setInteriorMaterial(Material.WHITE);
            this.shape.getAttributes().setInteriorOpacity(0.2);
            this.layer.addRenderable(this.shape);
        }
    }

    /**
     * Compute the positions of a perimeter line surrounding the track center positions at radius distance.
     */
    private void computeExtentPositions()
    {
        Globe globe = this.wwd.getModel().getGlobe();
        this.extentPositions = new ArrayList<LatLon>();
        Angle heading = Angle.ZERO;
        int cpn = 0; // Current position number

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?