Картографиране на различни цветове към точки в равнина в Java3D

Опитвам се да напиша 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.

   }
  }


 }
}

person Hari Desikachary    schedule 29.12.2011    source източник


Отговори (2)


Картографиране на текстури: http://webdocs.cs.ualberta.ca/~anup/Courses/604/NOTES/J3Dtexture.pdf

person alphazero    schedule 29.12.2011
comment
След като прочетох за картографирането на текстури, изглежда, че не решава напълно проблема ми. Картографирането на текстури изисква предварително да създам изображенията на текстурите, които искам, и след това да ги заредя в Java3D, за да ги приложа към обекти Appearance. - person Hari Desikachary; 30.12.2011
comment
Работя при предположението, че 2D масивът, който се предава на конструктора, ще съдържа различни стойности за време и честота всеки път, така че моите амплитуди ще бъдат различни и по този начин изходът на спектрограмата, който искам да покажа (както във връзката, която публикувах), ще различават. Следователно в идеалния случай бих искал да мога да генерирам изображението на текстурата, когато приложението се изпълнява. Предполагам, че мога да заобиколя това, като създам файла с текстурата предварително въз основа на каквито и стойности на времевата честота да получа и след това да го приложа към QuadArray, но в идеалния случай бих искал да избегна това. - person Hari Desikachary; 30.12.2011
comment
Защо не използвате TextureLoader(BufferedImage bImage, String format, int флагове)? И да, създайте изображението на текстурата на повикване. Но сериозно, гледайки отговора на XYBlockRenderer на @trashgod, бих си помислил, че това е практичният начин, освен ако използването на Java3D не е изискване. - person alphazero; 30.12.2011

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

person trashgod    schedule 29.12.2011