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 + -
显示快捷键?