在Java3D中将不同颜色映射到平面上的点

时间:2011-12-29 06:04:11

标签: java java-3d

我正在尝试编写一个Java3D应用程序,它模拟您在光谱图上看到的内容,例如:http://en.wikipedia.org/wiki/File:Spectrogram-19thC.png。我现在面临的主要困难是如何以与谱图相同的方式确定如何在平面上实际显示振幅值:使用不同的颜色为频谱图上的每个时间 - 频率坐标((x,y)点)指定不同的强度

这是我的代码的当前版本。我的构造函数将包含时频坐标的二维数组作为参数。我创建了一个代表频谱图的平面,并设置了一些在实际显示幅度值时使用的循环。我知道如何计算2D平面上每个点的幅度值,并想知道如何为颜色分配幅度值范围(尽管我还没有编码这些)。

我的主要问题是在飞机上显示这些颜色。虽然Java3D允许用户为整个对象指定颜色(使用Appearance,ColoringAttributes和Color3f类),但我没有看到任何将不同颜色映射到对象上不同点的示例,这正是我想要做的。我希望能够控制构成平面的每个像素的颜色,这样我就可以根据我为该点计算的振幅值,对每个像素进行不同的着色,而不是将其完全变为蓝色,红色等。

有没有人知道Java3D中是否可以这样做?如果是这样,我们将非常感谢有关如何完成该工作或与资源相关的建议。我是Java3D的新手,所以任何建议都会很棒。

我应该补充一点,我在Java3D中做这件事的动机是最终使用2D平面生成时空时间频率图(即堆叠2D频谱图以创建3D图像)。

import java.util.*;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;

import javax.vecmath.*;
import javax.media.j3d.*;

import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.applet.*;
import com.sun.j3d.utils.behaviors.vp.*;

public class DrawTimeFrequencyGraph extends Applet {

public DrawTimeFrequencyGraph (float [][] timeFrequencyArray) {

/* Create the Canvas3D and BranchGroup objects needed for the scene graph */

setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();

Canvas3D canvas3D = new Canvas3D(config);
add("Center", canvas3D);

BranchGroup scene = new BranchGroup();

/* Create a 2D plane to represent the graph
* Note: The (x, y, z) coordinates are currently hardcoded, but should be set up
* to reflect the min and max frequency and time values in the 2D array */

QuadArray timeFrequencyGraph = new QuadArray(4, GeometryArray.COORDINATES);
timeFrequencyGraph.setCoordinate(0, new Point3f(-10f, 0f, 0f));
timeFrequencyGraph.setCoordinate(1, new Point3f(0f, 0f, 0f));
timeFrequencyGraph.setCoordinate(2, new Point3f(0f, 3f, 0f));
timeFrequencyGraph.setCoordinate(3, new Point3f(-10f, 3f, 0f));

/* Set up the appearance of the plane i.e. graph values on it using various colors */

for(int i = 0; i <  timeFrequencyArray.length; i++){
  for(int j = 0; j < timeFrequencyArray[i].length; j++){


   /* TO DO: Calculate amplitude values, map them to colors and figure out how to
    * map the colors to points on the plane that has been created.

   }
  }


 }
}

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

您还可以查看JFreeChart,其中包含XYBlockRenderer。任意调色板可以使用合适的PaintScale构建,引用herehere