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