Опитвам се да напиша Java3D приложение, което емулира това, което бихте видели на спектрограма като тази: http://en.wikipedia.org/wiki/File:Spectrogram-19thC.png. Основната ми трудност в момента е да измисля как всъщност да покажа стойностите на амплитудата в равнината по същия начин, както го прави спектрограмата: използвайки различни цветове за обозначаване на различни интензитети за всяка координата време-честота ((x, y) точка) на спектрограмата .
Ето текущата версия на моя код. Моят конструктор приема като аргумент 2D масив, съдържащ координати време-честота. Създавам равнина, представяща спектрограмата, и настройвам някои for цикли, които да се използват при действително показване на стойностите на амплитудата. Наясно съм как да изчислявам стойностите на амплитудата за всяка точка на 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.
}
}
}
}