47228

2D graph animation on WorldWindJava canvas?

Question:

Perhaps there are some of you using NASA's worldwind in WWJ form. I just started and set up everything in NetBeans, so that the latest WWJ runs there with jogl and co. I tested it with basic demo code.

My aim is to display a graph on the WWJ canvas, that will be updated regularly and will be animated in this way. It will be a 2D graph of a dataset, that will be computed in the background and the WWJ programm has to read and display it.

Do you have some tips and EASY examples/tutorials for how I can do that?

Hi, I was able to insert a jfreechart chart, but I haven't been able to "update" the chart yet, could you help me?

package screensaver; import gov.nasa.worldwind.BasicModel; import gov.nasa.worldwind.avlist.AVKey; import gov.nasa.worldwind.awt.WorldWindowGLCanvas; import gov.nasa.worldwind.geom.Angle; import gov.nasa.worldwind.geom.Position; import gov.nasa.worldwind.layers.RenderableLayer; import gov.nasa.worldwind.render.Offset; import gov.nasa.worldwind.render.ScreenImage; import gov.nasa.worldwind.render.Size; import gov.nasa.worldwind.view.firstperson.BasicFlyView; import gov.nasa.worldwind.view.firstperson.FlyToFlyViewAnimator; import java.awt.Frame; import java.awt.event.KeyEvent; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Timer; import java.util.TimerTask; import javax.imageio.ImageIO; /// import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartFrame; import org.jfree.chart.JFreeChart; import org.jfree.data.general.DefaultPieDataset; import java.awt.image.BufferedImage; public class FullScreenTest{ public static double test = 0; /** * The animated view */ public static BasicFlyView view; /** * The ScreenSaver entry point, should run in windowed mode * with interactivity or fullscreen mode depending on flags * http://boinc.berkeley.edu/trac/wiki/ScreensaverEnhancements * @param args */ public static void main(String[] args) { view = new BasicFlyView(); Frame frame = new Frame("WorldwindFull"); final WorldWindowGLCanvas worldWindowGLCanvas = new WorldWindowGLCanvas(); worldWindowGLCanvas.setModel(new BasicModel()); worldWindowGLCanvas.setView(view); worldWindowGLCanvas.addKeyListener(new java.awt.event.KeyListener() { public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { System.exit(0); } } }); RenderableLayer creditsLayer = new RenderableLayer(); creditsLayer.setName("Credits"); try { creditsLayer.addRenderables(createCredits()); } catch (IOException ioEx) { ioEx.printStackTrace(); } worldWindowGLCanvas.getModel().getLayers().add(creditsLayer); //// RenderableLayer chartsLayer = new RenderableLayer(); chartsLayer.setName("Charts"); try { chartsLayer.addRenderables(createCharts()); } catch (IOException ioEx) { ioEx.printStackTrace(); } worldWindowGLCanvas.getModel().getLayers().add(chartsLayer); frame.add(worldWindowGLCanvas); frame.setSize(640, 480); frame.setUndecorated(true); int size = frame.getExtendedState(); size |= Frame.MAXIMIZED_BOTH; frame.setExtendedState(size); frame.setVisible(true); worldWindowGLCanvas.requestFocus(); setUpTimer(); } /** * Static method to produce credits for all involved * organisations * @return * @throws IOException */ public static List<ScreenImage> createCredits() throws IOException { List<ScreenImage> allCredits = new ArrayList<ScreenImage>(); ScreenImage creditWWC = new ScreenImage(); creditWWC.setImageSource(ImageIO.read( new File("src/images/worldwindcentral.gif"))); //TODO: More flexible out of code layout policy creditWWC.setScreenOffset(new Offset(0.10, 0.90, AVKey.FRACTION, AVKey.FRACTION)); creditWWC.setSize(new Size(Size.MAINTAIN_ASPECT_RATIO, 0.05, AVKey.FRACTION,Size.MAINTAIN_ASPECT_RATIO, 0.05, AVKey.FRACTION)); ScreenImage creditRKN = new ScreenImage(); creditRKN.setImageSource(ImageIO.read( new File("src/images/logo_selfnet1.png"))); //TODO: More flexible out of code layout policy creditRKN.setScreenOffset(new Offset(0.50, 0.90, AVKey.FRACTION, AVKey.FRACTION)); creditRKN.setSize(new Size(Size.MAINTAIN_ASPECT_RATIO, 0.05, AVKey.FRACTION,Size.MAINTAIN_ASPECT_RATIO, 0.05, AVKey.FRACTION)); allCredits.add(creditWWC); allCredits.add(creditRKN); return allCredits; } public static List<ScreenImage> createCharts() throws IOException { // create a dataset... DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("Category 1", 43.2-test); dataset.setValue("Category 2", 27.9+test); dataset.setValue("Category 3", 79.5); // create a chart... JFreeChart chart = ChartFactory.createPieChart( "Sample Pie Chart", dataset, true, // legend? true, // tooltips? false // URLs? ); //chart.createBufferedImage(100, 100); // create and display a frame... //ChartFrame frame1 = new ChartFrame("First", chart); //frame1.pack(); //frame1.setVisible(true); //frame1.createImage(100, 100); final BufferedImage image = chart.createBufferedImage(400, 300); List<ScreenImage> allCharts = new ArrayList<ScreenImage>(); ScreenImage chart1 = new ScreenImage(); chart1.setImageSource(image); //TODO: More flexible out of code layout policy chart1.setScreenOffset(new Offset(0.17, 0.60, AVKey.FRACTION, AVKey.FRACTION)); chart1.setSize(new Size(Size.MAINTAIN_ASPECT_RATIO, 0.05, AVKey.FRACTION,Size.MAINTAIN_ASPECT_RATIO, 0.05, AVKey.FRACTION)); allCharts.add(chart1); return allCharts; } /** * The globe auto-rotate animator * @param pos */ public static void moveToLocation(Position pos) { if (pos == null) { return; } double elevation = view.getGlobe().getElevation(pos.getLatitude(), pos.getLongitude()); FlyToFlyViewAnimator animator = FlyToFlyViewAnimator. createFlyToFlyViewAnimator(view, view.getEyePosition(), new Position(pos.latitude, pos.longitude, elevation), view.getHeading(), view.getHeading(), view.getPitch(), view.getPitch(), view.getEyePosition().getElevation(), view.getEyePosition().getElevation(), 10000, 0); view.addAnimator(animator); animator.start(); view.firePropertyChange(AVKey.VIEW, null, view); } /** * Convenience timer set-up to periodically rotate the globe */ public static void setUpTimer() { int delay = 5000; // delay for 5 sec. int period = 10000; // repeat every sec. Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { public void run() { Position pos = new Position(Angle.fromDegrees( 180*new Random().nextFloat()-90.0), Angle.fromDegrees( 360*new Random().nextFloat()-180.0), 0.0); moveToLocation(pos); Random rn = new Random(); int n = 10 - 0 + 1; int i = rn.nextInt() % n; FullScreenTest.test = 0 + i; System.out.println(FullScreenTest.test); } }, delay, period); } }

Answer1:

So you added a renderable layer called creditsLayer which displays an image. A simple (maybe a bit crude) way to update the image is to dispose the layer (creditsLayer.dispose()) and re-add it with another image and after worldWindowGLCanvas.redraw(). As the screensaver won't update too often this might be acceptable. Or you can have different layers for each image you have and enable/disable them as you need and redraw the canvas. HTH

Recommend

  • How to remove separator line in jfree chart- donut chart
  • Image won't appear in JLabel
  • Change ImageIcon being displayed in JFrame
  • Stack Cards horizontally with some offset
  • LibGdx GLES2.0 cube texel stretching
  • Getting data from database using HQL
  • How are 32 bit JavaScript numbers resulting from a bit-wise operation converted back to 64 bit numbe
  • Program crashes when run outside IDE
  • Retrieving a double from a JTextArea while solving for X
  • How can I determine which routines MATLAB uses to solve a sparse matrix?
  • Stitching 2 images (OpenCV)
  • What is the reason that Policy.getPolicy() is considered as it will retain a static reference to the
  • NSMutableArray instance used in a block
  • Scala: Function returning an unknown type
  • Get the number 18437736874454810627
  • C++ friend class std::vector
  • C# fibonacci function returning errors
  • Checking if an array in C is symmetric
  • How to match http request and response using Jersey ContainerRequestFilter and ContainerResponseFilt
  • How do I open a C file with a relative path?
  • Use of this Javascript
  • Python urlparse: small issue
  • FileReader+canvas image loading problem
  • Linq Objects Group By & Sum
  • Validaiting emails with Net.Mail MailAddress
  • sending/ receiving email in Java
  • How to format a variable of double type
  • Cannot Parse HTML Data Using Android / JSOUP
  • How to delete a row from a dynamic generate table using jquery?
  • Buffer size for converting unsigned long to string
  • Proper way to use connect-multiparty with express.js?
  • JTable with a ScrollPane misbehaving
  • Java static initializers and reflection
  • python draw pie shapes with colour filled
  • unknown Exception android
  • Checking variable from a different class in C#
  • Observable and ngFor in Angular 2
  • failed to connect to specific WiFi in android programmatically
  • Unable to use reactive element in my shiny app
  • How can I use threading to 'tick' a timer to be accessed by other threads?