/* Copyright (C) 2001, 2006 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved. */ package gov.nasa.worldwind.examples; import gov.nasa.worldwind.ViewStateIterator; import gov.nasa.worldwind.geom.Angle; import gov.nasa.worldwind.geom.LatLon; import gov.nasa.worldwind.geom.Position; import gov.nasa.worldwind.view.EyePositionIterator; import gov.nasa.worldwind.view.OrbitView; import gov.nasa.worldwind.view.ScheduledOrbitViewStateIterator; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.util.ArrayList; /** * @author tag * @version $Id: ViewIteration.java 4100 2008-01-08 02:49:54Z dcollins $ */ public class ViewIteration extends ApplicationTemplate { public static class AppFrame extends JFrame { static ArrayList<Position> path; static { path = new ArrayList<Position>(); path.add(Position.fromDegrees(0, 0, 1e5)); path.add(Position.fromDegrees(0, 10, 1e5)); path.add(Position.fromDegrees(0, 20, 1e5)); path.add(Position.fromDegrees(0, 30, 1e5)); path.add(Position.fromDegrees(0, 40, 1e5)); path.add(Position.fromDegrees(0, 50, 1e5)); path.add(Position.fromDegrees(0, 60, 1e5)); path.add(Position.fromDegrees(0, 70, 1e5)); } private int pathPosition = 0; private PathAction[] pathActions = new PathAction[]{ new GoToLatLonFromCurrent("Zero", LatLon.ZERO), new FollowPath("Follow"), new Heading("Heading"), new Forward("Forward"), new Backwards("Backwards"), }; private Dimension canvasSize = new Dimension(800, 600); private ApplicationTemplate.AppPanel wwjPanel; public AppFrame() { // Create the WorldWindow. this.wwjPanel = new ApplicationTemplate.AppPanel(this.canvasSize, true); this.wwjPanel.setPreferredSize(canvasSize); JPanel controlPanel = makeControlPanel(); controlPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 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); } private JPanel makeControlPanel() { JPanel innerPanel = new JPanel(new GridLayout(8, 1)); innerPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Go To"), BorderFactory.createEmptyBorder(5, 5, 5, 5))); for (PathAction pa : pathActions) { JButton btn = new JButton(pa); innerPanel.add(btn); } JPanel cp = new JPanel(new BorderLayout()); cp.add(innerPanel, BorderLayout.CENTER); return cp; } private abstract class PathAction extends AbstractAction { PathAction(String name) { super(name); } } // // Specific Actions // private class Forward extends PathAction { public Forward(String name) { super(name); } public void actionPerformed(ActionEvent actionEvent) { if (pathPosition < path.size() - 1) { OrbitView view = (OrbitView) wwjPanel.getWwd().getView(); view.setHeading(Angle.fromDegrees(90)); ViewStateIterator vsi = new EyePositionIterator( 4000, view.getEyePosition(), path.get(++pathPosition)); wwjPanel.getWwd().getView().applyStateIterator(vsi); } } } private class Backwards extends PathAction { public Backwards(String name) { super(name); } public void actionPerformed(ActionEvent actionEvent) { if (pathPosition > 0) { OrbitView view = (OrbitView) wwjPanel.getWwd().getView(); ViewStateIterator vsi = new EyePositionIterator( 4000, view.getEyePosition(), path.get(--pathPosition)); wwjPanel.getWwd().getView().applyStateIterator(vsi); } } } private class Heading extends PathAction { public Heading(String name) { super(name); } public void actionPerformed(ActionEvent actionEvent) { Angle heading; if (pathPosition == 0) heading = computeHeading(path.get(0), path.get(1)); else heading = computeHeading(path.get(pathPosition - 1), path.get(pathPosition)); OrbitView view = (OrbitView) wwjPanel.getWwd().getView(); ScheduledOrbitViewStateIterator vsi = ScheduledOrbitViewStateIterator.createHeadingIterator(view.getHeading(), heading); wwjPanel.getWwd().getView().applyStateIterator(vsi); } } private Angle computeHeading(Position pa, Position pb) { return LatLon.greatCircleAzimuth(pa.getLatLon(), pb.getLatLon()); } private class GoToLatLonFromCurrent extends PathAction { private final LatLon latlon; GoToLatLonFromCurrent(String name, LatLon latlon) { super(name); this.latlon = latlon; } public void actionPerformed(ActionEvent actionEvent) { OrbitView view = (OrbitView) wwjPanel.getWwd().getView(); ViewStateIterator vsi = new EyePositionIterator( 4000, view.getEyePosition(), new Position(this.latlon, view.getEyePosition().getElevation())); wwjPanel.getWwd().getView().applyStateIterator(vsi); } } private class FollowPath extends PathAction { ArrayList<Position> path = new ArrayList<Position>(); FollowPath(String name) { super(name); path.add(Position.fromDegrees(0, 0, 1e5)); path.add(Position.fromDegrees(1, 3, 1e5)); path.add(Position.fromDegrees(2, 4, 1e5)); path.add(Position.fromDegrees(3, 5, 1e5)); } private class PosToPos implements Runnable { Position pos; PosToPos(Position pos) { this.pos = pos; } public void run() { final OrbitView view = (OrbitView) wwjPanel.getWwd().getView(); ViewStateIterator vsi = new EyePositionIterator(4000, view.getEyePosition(), pos); wwjPanel.getWwd().getView().applyStateIterator(vsi); } } public void actionPerformed(ActionEvent actionEvent) { for (Position p : path) { final OrbitView view = (OrbitView) wwjPanel.getWwd().getView(); ViewStateIterator vsi = new EyePositionIterator( 4000, view.getEyePosition(), new Position(p.getLatLon(), view.getEyePosition().getElevation())); wwjPanel.getWwd().getView().applyStateIterator(vsi); // EventQueue.invokeLater(new PosToPos(p)); } } } } public static void main(String[] args) { try { AppFrame frame = new AppFrame(); frame.setTitle("World Wind View Paths"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }