在WorldWindJava画布2D图形动画? [英] 2D graph animation on WorldWindJava canvas?
问题描述
也许还有利用美国宇航局的世界风在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屋!