Отображение разных цветов на точки на плоскости в Java3D - PullRequest
1 голос
/ 29 декабря 2011

Я пытаюсь написать приложение 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.

   }
  }


 }
}

Ответы [ 2 ]

2 голосов
/ 29 декабря 2011
1 голос
/ 29 декабря 2011

Вы также можете посмотреть на JFreeChart, который включает XYBlockRenderer. Произвольные цветовые палитры могут быть построены с использованием подходящих PaintScale, обозначенных здесь и здесь .

...