2011-05-02 121 views
0

也許你們中有一些人正在使用美國宇航局的WWW形式的世界風。我剛剛開始並在NetBeans中設置了所有內容,以便最新的WWJ與jogl和co。 我用基本的演示代碼測試了它。WorldWindJava畫布上的2D圖形動畫?

我的目標是在WWJ畫布上顯示一個圖形,該圖形將定期更新並以這種方式進行動畫處理。它將是數據集的2D圖形,將在後臺計算,WWJ程序必須讀取並顯示它。

你有一些提示和簡單的例子/教程,我怎麼能做到這一點?您好,我能夠插入jfreechart圖表,但我還沒有能夠「更新」圖表呢,你能幫我嗎?

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); 
    } 
} 
+0

嗨,我能夠插入jfreechart圖表,但我還沒有能夠「更新」圖表呢,你能幫我嗎? – 2011-05-14 22:27:01

+0

另請參閱此[問題](http://stackoverflow.com/questions/5929725)和[示例](http://stackoverflow.com/questions/5048852)。 – trashgod 2011-05-14 23:24:16

回答

0

所以你加入稱爲creditsLayer一個可呈現層,其顯示圖像。一個簡單的(也許有點粗糙)的方式來更新圖像是處理圖層(creditsLayer.dispose())並重新添加與另一個圖像和worldWindowGLCanvas.redraw()後。由於屏幕保護程序不會更新太頻繁,這可能是可以接受的。或者,您可以爲每個圖像設置不同的圖層,並根據需要啓用/禁用它們並重新繪製畫布。 HTH