在WorldWindJava画布2D图形动画? [英] 2D graph animation on WorldWindJava canvas?

查看:173
本文介绍了在WorldWindJava画布2D图形动画?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

也许还有利用美国宇航局的世界风在WWJ形式的一些你。我刚开始并设置了一切在NetBeans中,使最新的WWJ与JOGL和共同运行在那里。
我基本的演示code测试它。

我的目的是显示WWJ画布上的图形,将定期更新,并会以这种方式进行动画。这将是一个数据集的2D图形,这将在后台计算和WWJ PROGRAMM具有读取和显示它。

你有我如何能做到这一点的一些技巧和EASY的例子/教程?

您好,我能插入的JFreeChart图表,但我一直没能更新图表然而,你能帮帮我吗?

 包屏保;进口gov.nasa.worldwind.BasicModel;
进口gov.nasa.worldwind.avlist.AVKey;
进口gov.nasa.worldwind.awt.WorldWindowGLCanvas;
进口gov.nasa.worldwind.geom.Angle;
进口gov.nasa.worldwind.geom.Position;
进口gov.nasa.worldwind.layers.RenderableLayer;
进口gov.nasa.worldwind.render.Offset;
进口gov.nasa.worldwind.render.ScreenImage;
进口gov.nasa.worldwind.render.Size;
进口gov.nasa.worldwind.view.firstperson.BasicFlyView;
进口gov.nasa.worldwind.view.firstperson.FlyToFlyViewAnimator;进口java.awt.Frame中;
进口java.awt.event.KeyEvent中;
进口的java.io.File;
进口java.io.IOException异常;
进口的java.util.ArrayList;
进口的java.util.List;
进口了java.util.Random;
进口java.util.Timer中;
进口java.util.TimerTask中;进口javax.imageio.ImageIO中;///
进口org.jfree.chart.ChartFactory;
进口org.jfree.chart.ChartFrame;
进口org.jfree.chart.JFreeChart;
进口org.jfree.data.general.DefaultPieDataset;进口java.awt.image.BufferedImage中;公共类FullScreenTest {    公共静态双重考验= 0;    / **
     *动画视图
     * /
    公共静态BasicFlyView图。    / **
     *屏幕保护程序的入口点,应在窗口模式下运行
     *具有取决于标志交互或全屏模式
     * http://boinc.berkeley.edu/trac/wiki/ScreensaverEnhancements
     * @参数ARGS
     * /
    公共静态无效的主要(字串[] args){            鉴于=新BasicFlyView();
        帧一帧=新的帧(WorldwindFull);
        最后WorldWindowGLCanvas worldWindowGLCanvas =新WorldWindowGLCanvas();
        worldWindowGLCanvas.setModel(新BasicModel());
        worldWindowGLCanvas.setView(视图);        worldWindowGLCanvas.addKeyListener(新java.awt.event.KeyListener(){
            公共无效的keyTyped(KeyEvent的E){
            }            公共无效调用keyReleased(KeyEvent的E){
            }            公共无效键pressed(KeyEvent的E){
                如果(e.getKey code()== KeyEvent.VK_ESCAPE){
                    System.exit(0);
                }
            }
        });        RenderableLayer creditsLayer =新RenderableLayer();
        creditsLayer.setName(积分);
        尝试{
            creditsLayer.addRenderables(createCredits());
        }赶上(IOException异常ioEx){            ioEx.printStackTrace();
        }
        worldWindowGLCanvas.getModel()getLayers()加(creditsLayer)。                ////
                RenderableLayer chartsLayer =新RenderableLayer();
        chartsLayer.setName(图表);
        尝试{
            chartsLayer.addRenderables(createCharts());
        }赶上(IOException异常ioEx){            ioEx.printStackTrace();
        }
        worldWindowGLCanvas.getModel()getLayers()加(chartsLayer)。        frame.add(worldWindowGLCanvas);
        frame.setSize(640,480);
        frame.setUndecorated(真);
        INT大小= frame.getExtendedState();
        大小| = Frame.MAXIMIZED_BOTH;
        frame.setExtendedState(大小);        frame.setVisible(真);
        worldWindowGLCanvas.requestFocus();        setUpTimer();
    }    / **
     *静态方法来产生所有涉及学分
     *组织
     * @返回
     *引发IOException
     * /
    公共静态列表< ScreenImage> createCredits()抛出IOException异常
    {
        清单< ScreenImage> allCredits =新的ArrayList< ScreenImage>();
        ScreenImage creditWWC =新ScreenImage();
        creditWWC.setImageSource(ImageIO.read(
                新的文件(SRC /图像/ worldwindcentral.gif)));
        // TODO:更灵活了code布局政策
        creditWWC.setScreenOffset(新偏移(0.10,0.90,AVKey.FRACTION,AVKey.FRACTION));
        creditWWC.setSize(新尺寸(Size.MAINTAIN_ASPECT_RATIO,0.05,
                AVKey.FRACTION,Size.MAINTAIN_ASPECT_RATIO,0.05,
                AVKey.FRACTION));                ScreenImage creditRKN =新ScreenImage();
        creditRKN.setImageSource(ImageIO.read(
                新的文件(SRC /图像/ logo_selfnet1.png)));
        // TODO:更灵活了code布局政策
        creditRKN.setScreenOffset(新偏移(0.50,0.90,AVKey.FRACTION,AVKey.FRACTION));
        creditRKN.setSize(新尺寸(Size.MAINTAIN_ASPECT_RATIO,0.05,
                AVKey.FRACTION,Size.MAINTAIN_ASPECT_RATIO,0.05,
                AVKey.FRACTION));        allCredits.add(creditWWC);
                allCredits.add(creditRKN);
        返回allCredits;
    }        公共静态列表< ScreenImage> createCharts()抛出IOException异常
    {            //创建一个数据集...
DefaultPieDataset数据=新DefaultPieDataset();
dataset.setValue(1类,43.2试验);
dataset.setValue(类别2,27.9 +测试);
dataset.setValue(第三类,79.5);
//创建一个图表...
JFreeChart的图表= ChartFactory.createPieChart(
样品饼图
数据集,
真的,//传奇?
真的,//提示?
假//网址吗?
);
//chart.createBufferedImage(100,100);
//创建和显示框...// ChartFrame帧1 =新ChartFrame(第一,图表);
//frame1.pack();
//frame1.setVisible(true);
//frame1.createImage(100,100);最终BufferedImage的图像= chart.createBufferedImage(400,300);        清单< ScreenImage> allCharts =新的ArrayList< ScreenImage>();
        ScreenImage chart1 =新ScreenImage();
        chart1.setImageSource(图片);
        // TODO:更灵活了code布局政策
        chart1.setScreenOffset(新偏移量(0.17,0.60,AVKey.FRACTION,AVKey.FRACTION));
        chart1.setSize(新尺寸(Size.MAINTAIN_ASPECT_RATIO,0.05,
                AVKey.FRACTION,Size.MAINTAIN_ASPECT_RATIO,0.05,
                AVKey.FRACTION));        allCharts.add(chart1);
        返回allCharts;
    }    / **
     *地球仪自动旋转动画
     * @参数POS
     * /
    公共静态无效moveToLocation(位置POS){
        如果(POS == NULL){
            返回;
        }
        双重提升= view.getGlobe()。getElevation(pos.getLatitude()
                pos.getLongitude());
        FlyToFlyViewAnimator动画= FlyToFlyViewAnimator。
                createFlyToFlyViewAnimator(查看,view.getEyePosition()
                        新的位置(pos.latitude,pos.longitude,海拔),
                        view.getHeading(),view.getHeading(),view.getPitch(),
                        view.getPitch(),view.getEyePosition()。getElevation(),
                        。view.getEyePosition()getElevation(),10000,0);
        view.addAnimator(动画);
        animator.start();
        view.firePropertyChange(AVKey.VIEW,空,视图);
    }    / **
     *便利定时器设置为定期旋转地球
     * /
    公共静态无效setUpTimer()
    {
        INT延迟= 5000; // 5秒的延迟。
        INT周期= 10000; //重复每秒。
        定时器定时器=新的Timer();        timer.scheduleAtFixedRate(新的TimerTask(){
                公共无效的run(){
                    位置POS =新的位置(Angle.fromDegrees(
                            180 *新的随机()nextFloat() - 90.0)
                                                Angle.fromDegrees(
                            360 *新的随机()nextFloat() - 180.0),
                                                0.0);
                    moveToLocation(POS)                            随机RN =新的随机();
INT N = 10 - 0 + 1;
INT I = rn.nextInt()%N;
FullScreenTest.test = 0 + I;
的System.out.println(FullScreenTest.test);                }
            },延迟期);
    }
}


解决方案

所以,你增加了一个叫做creditsLayer一个渲染层,显示图像。一个简单的(也许有点粗)的方式来更新图像处置层( creditsLayer.dispose()),并与另一个图像后<$重新添加C $ C> worldWindowGLCanvas.redraw()。由于屏幕保护程序将不会过于频繁地更新,这可能是可以接受的。或者你可以有你有和启用/禁用它们,因为你需要和重绘帆布每个图像不同的层次。 HTH

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

解决方案

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

这篇关于在WorldWindJava画布2D图形动画?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆