📄 shapes.java
字号:
/*Copyright (C) 2001, 2006 United States Governmentas represented by the Administrator of theNational Aeronautics and Space Administration.All Rights Reserved.*/package gov.nasa.worldwind.examples;import com.sun.opengl.util.j2d.TextRenderer;import gov.nasa.worldwind.Configuration;import gov.nasa.worldwind.event.*;import gov.nasa.worldwind.geom.*;import gov.nasa.worldwind.layers.RenderableLayer;import gov.nasa.worldwind.pick.PickedObjectList;import gov.nasa.worldwind.render.*;import javax.swing.*;import javax.swing.border.*;import javax.swing.event.*;import java.awt.*;import java.awt.event.*;import java.util.ArrayList;/** * @author tag * @version $Id: Shapes.java 10925 2009-05-06 22:22:50Z dcollins $ */public class Shapes{ private static class Info { private final Object object; private final String name; public Info(String name, Object object) { this.object = object; this.name = name; } } protected static class AppFrame extends JFrame { private Dimension canvasSize = new Dimension(800, 600); private ApplicationTemplate.AppPanel wwjPanel; private RenderableLayer layer = new RenderableLayer(); private TextRenderer textRenderer = new TextRenderer(java.awt.Font.decode("Arial-Plain-13"), true, false); public AppFrame() { // Create the WorldWindow. this.wwjPanel = new ApplicationTemplate.AppPanel(this.canvasSize, true); this.wwjPanel.setPreferredSize(canvasSize); ApplicationTemplate.insertBeforePlacenames(this.wwjPanel.getWwd(), layer); JPanel shapesPanel = makeShapeSelectionPanel(); shapesPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); JPanel attrsPanel = makeAttributesPanel(); attrsPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // Put the pieces together. JPanel controlPanel = new JPanel(new BorderLayout()); controlPanel.add(shapesPanel, BorderLayout.CENTER); JPanel p = new JPanel(new BorderLayout(6, 6)); p.add(attrsPanel, BorderLayout.CENTER); controlPanel.add(p, BorderLayout.SOUTH); this.getContentPane().add(wwjPanel, BorderLayout.CENTER); this.getContentPane().add(controlPanel, BorderLayout.WEST); this.pack(); // Center the application on the screen. Dimension prefSize = this.getPreferredSize(); Dimension parentSize; java.awt.Point parentLocation = new java.awt.Point(0, 0); parentSize = Toolkit.getDefaultToolkit().getScreenSize(); int x = parentLocation.x + (parentSize.width - prefSize.width) / 2; int y = parentLocation.y + (parentSize.height - prefSize.height) / 2; this.setLocation(x, y); this.setResizable(true); wwjPanel.getWwd().addRenderingListener(new RenderingListener() { public void stageChanged(RenderingEvent event) { if (!event.getStage().equals(RenderingEvent.BEFORE_BUFFER_SWAP)) return; if (currentShape instanceof Polyline) { Polyline p = (Polyline) currentShape; String length = Double.toString(p.getLength()); textRenderer.beginRendering(wwjPanel.getWidth(), wwjPanel.getHeight()); textRenderer.draw(length, 100, 100); textRenderer.endRendering(); } } }); // Enable dragging and other selection responses this.setupSelection(); } private Renderable currentShape; private String currentPathColor = "Yellow"; private int currentPathOpacity = 10; private float currentPathWidth = 1; private String currentPathType = "Great Circle"; private String currentPathStyle = "Solid"; private boolean currentFollowTerrain = true; private float currentOffset = 0; private int currentTerrainConformance = 10; private int currentNumSubsegments = 10; private String currentBorderColor = "Yellow"; private float currentBorderWidth = 1; private int currentBorderOpacity = 10; private String currentBorderStyle = "Solid"; private String currentInteriorColor = "Yellow"; private int currentInteriorOpacity = 10; private String currentInteriorStyle = "Solid"; private ArrayList<JComponent> onTerrainOnlyItems = new ArrayList<JComponent>(); private ArrayList<JComponent> offTerrainOnlyItems = new ArrayList<JComponent>(); private void update() { for (JComponent c : onTerrainOnlyItems) c.setEnabled(currentFollowTerrain); for (JComponent c : offTerrainOnlyItems) c.setEnabled(!currentFollowTerrain); if (this.currentShape instanceof AbstractSurfaceShape) { AbstractSurfaceShape shape = (AbstractSurfaceShape) currentShape; if (!currentBorderStyle.equals("None")) { float alpha = currentBorderOpacity >= 10 ? 1f : currentBorderOpacity <= 0 ? 0f : currentBorderOpacity / 10f; Color color = null; if (currentBorderColor.equals("Yellow")) color = new Color(1f, 1f, 0f); else if (currentBorderColor.equals("Red")) color = new Color(1f, 0f, 0f); else if (currentBorderColor.equals("Green")) color = new Color(0f, 1f, 0f); else if (currentBorderColor.equals("Blue")) color = new Color(0f, 0f, 1f); shape.getAttributes().setDrawOutline(true); shape.getAttributes().setOutlineMaterial(new Material(color)); shape.getAttributes().setOutlineOpacity(alpha); shape.getAttributes().setOutlineWidth(currentBorderWidth); } else { shape.getAttributes().setDrawOutline(false); } if (!currentInteriorStyle.equals("None")) { float alpha = currentInteriorOpacity >= 10 ? 1f : currentInteriorOpacity <= 0 ? 0f : currentInteriorOpacity / 10f; Color color = null; if (currentInteriorColor.equals("Yellow")) color = new Color(1f, 1f, 0f); else if (currentInteriorColor.equals("Red")) color = new Color(1f, 0f, 0f); else if (currentInteriorColor.equals("Green")) color = new Color(0f, 1f, 0f); else if (currentInteriorColor.equals("Blue")) color = new Color(0f, 0f, 1f); shape.getAttributes().setInteriorMaterial(new Material(color)); shape.getAttributes().setInteriorOpacity(alpha); shape.getAttributes().setDrawInterior(true); } else { shape.getAttributes().setDrawInterior(false); } } else { float alpha = currentPathOpacity >= 10 ? 1f : currentPathOpacity <= 0 ? 0f : currentPathOpacity / 10f; Color color = null; if (currentPathColor.equals("Yellow")) color = new Color(1f, 1f, 0f, alpha); else if (currentPathColor.equals("Red")) color = new Color(1f, 0f, 0f, alpha); else if (currentPathColor.equals("Green")) color = new Color(0f, 1f, 0f, alpha); else if (currentPathColor.equals("Blue")) color = new Color(0f, 0f, 1f, alpha); if (currentShape instanceof Polyline) { Polyline pl = (Polyline) currentShape; pl.setColor(color); pl.setLineWidth(currentPathWidth); pl.setFollowTerrain(currentFollowTerrain); pl.setTerrainConformance(currentTerrainConformance); pl.setNumSubsegments(currentNumSubsegments); if (currentPathType.equalsIgnoreCase("linear")) pl.setPathType(Polyline.LINEAR); else if (currentPathType.equalsIgnoreCase("rhumb line")) pl.setPathType(Polyline.RHUMB_LINE); else pl.setPathType(Polyline.GREAT_CIRCLE); pl.setOffset(currentOffset); if (currentPathStyle.equals("Dash")) { pl.setStippleFactor(5); pl.setStipplePattern((short) 0xAAAA); } else { pl.setStippleFactor(0); // solid } } } this.layer.removeAllRenderables(); if (this.currentShape != null) this.layer.addRenderable(this.currentShape); this.wwjPanel.getWwd().redraw(); } private Info[] buildSurfaceShapes() { LatLon position = new LatLon(Angle.fromDegrees(38), Angle.fromDegrees(-105)); ArrayList<LatLon> surfaceLinePositions = new ArrayList<LatLon>();// surfaceLinePositions.add(LatLon.fromDegrees(37.8484, -119.9754));// surfaceLinePositions.add(LatLon.fromDegrees(38.3540, -119.1526));// surfaceLinePositions.add(new LatLon(Angle.fromDegrees(0), Angle.fromDegrees(-150)));// surfaceLinePositions.add(new LatLon(Angle.fromDegrees(60), Angle.fromDegrees(0))); surfaceLinePositions.add(position); surfaceLinePositions.add(LatLon.fromDegrees(39, -104)); surfaceLinePositions.add(LatLon.fromDegrees(39, -105)); surfaceLinePositions.add(position); return new Info[] { new Info("Circle", new SurfaceCircle(position, 100e3)), new Info("Ellipse", new SurfaceEllipse(position, 100e3, 90e3, Angle.ZERO)), new Info("Square", new SurfaceSquare(position, 100e3)), new Info("Quad", new SurfaceQuad(position, 100e3, 60e3, Angle.ZERO)), new Info("Sector", new SurfaceSector(Sector.fromDegrees(38, 40, -105, -103))), new Info("Polygon", new SurfacePolygon(surfaceLinePositions)), }; } private Info[] buildFreeShapes() { double elevation = 10e3; ArrayList<Position> positions = new ArrayList<Position>(); positions.add(new Position(Angle.fromDegrees(37.8484), Angle.fromDegrees(-119.9754), elevation)); positions.add(new Position(Angle.fromDegrees(39.3540), Angle.fromDegrees(-110.1526), elevation)); positions.add(new Position(Angle.fromDegrees(38.3540), Angle.fromDegrees(-100.1526), elevation)); ArrayList<Position> positions2 = new ArrayList<Position>(); positions2.add(new Position(Angle.fromDegrees(0), Angle.fromDegrees(-150), elevation)); positions2.add(new Position(Angle.fromDegrees(25), Angle.fromDegrees(-75), elevation)); positions2.add(new Position(Angle.fromDegrees(50), Angle.fromDegrees(0), elevation)); ArrayList<Position> positions3 = new ArrayList<Position>(); for (double lat = 42, lon = -100; lat <= 45; lat += .1, lon += .1) positions3.add(new Position(Angle.fromDegrees(lat), Angle.fromDegrees(lon), elevation)); ArrayList<Position> positions4 = new ArrayList<Position>(); positions4.add(new Position(Angle.fromDegrees(90), Angle.fromDegrees(-110), elevation)); positions4.add(new Position(Angle.fromDegrees(-90), Angle.fromDegrees(-110), elevation)); ArrayList<Position> positions5 = new ArrayList<Position>(); for (int i = 0; i < 100; i++) positions5.add(Position.fromDegrees(38.0 + i * 0.0001, 30.0 + i * 0.0001, 1000.0 + i * 5.0)); @SuppressWarnings({"UnnecessaryLocalVariable"}) Info[] infos = new Info[] { new Info("Short Path", new Polyline(positions)), new Info("Long Path", new Polyline(positions2)), new Info("Incremental Path", new Polyline(positions3)), new Info("Vertical Path", new Polyline(positions4)), new Info("Small-segment Path", new Polyline(positions5)), new Info("Quad", new Quadrilateral(Sector.fromDegrees(38, 40, -104, -105), elevation)), new Info("None", null) }; return infos; } private JPanel makeShapeSelectionPanel() { final Info[] surfaceShapeInfos = this.buildSurfaceShapes(); GridLayout layout = new GridLayout(surfaceShapeInfos.length, 1); JPanel ssPanel = new JPanel(layout); ButtonGroup group = new ButtonGroup(); for (final Info info : surfaceShapeInfos) { JRadioButton b = new JRadioButton(info.name); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { currentShape = (Renderable) info.object; update(); } }); group.add(b); ssPanel.add(b); if (info.name.equalsIgnoreCase("none")) b.setSelected(true); } ssPanel.setBorder(this.createTitleBorder("Surface Shapes")); final Info[] freeShapeInfos = this.buildFreeShapes(); layout = new GridLayout(freeShapeInfos.length, 1); JPanel fsPanel = new JPanel(layout); for (final Info info : freeShapeInfos) { JRadioButton b = new JRadioButton(info.name); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { currentShape = (Renderable) info.object; update(); } }); group.add(b); fsPanel.add(b); if (info.name.equalsIgnoreCase("none")) b.setSelected(true); } fsPanel.setBorder(this.createTitleBorder("Path Shapes")); JPanel shapesPanel = new JPanel(new GridLayout(1, 2, 8, 1)); shapesPanel.add(fsPanel); shapesPanel.add(ssPanel); return shapesPanel; } private Border createTitleBorder(String title) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -