/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.graphene;
import org.diirt.util.stats.Range;
import java.awt.image.BufferedImage;
import java.util.Random;
import org.junit.Test;
import org.diirt.util.array.*;
import org.diirt.util.stats.Ranges;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
/**
*
* @author asbarber, jkfeng, sjdallst
*/
public class IntensityGraph2DRendererTest extends BaseGraphTest<IntensityGraph2DRendererUpdate, IntensityGraph2DRenderer> {
public IntensityGraph2DRendererTest() {
super("intensityGraph2D");
}
@Override
public IntensityGraph2DRenderer createRenderer() {
return new IntensityGraph2DRenderer(300, 200);
}
@Override
public BufferedImage draw(IntensityGraph2DRenderer renderer) {
double listOfData[] = new double[10 * 10];
for (int i = 0; i < (10 * 10); i++) {
listOfData[i] = i;
}
ArrayDouble dataList = new ArrayDouble(listOfData);
Cell2DDataset data = Cell2DDatasets.linearRange(dataList, Ranges.range(0, 10), 10, Ranges.range(0, 10), 10);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.draw(graphBuffer, data);
return graphBuffer.getImage();
}
private static Cell2DDataset randomDataset() {
Random rand = new Random(1);
int nSamples = 1000 * 1000;
double[] waveform = new double[nSamples];
for (int i = 0; i < nSamples; i++) {
waveform[i] = rand.nextGaussian();
}
ArrayDouble data = new ArrayDouble(waveform);
Cell2DDataset datum = Cell2DDatasets.linearRange(data, Ranges.range(0, 1000), 1000, Ranges.range(0, 1000), 1000);
return datum;
}
private Cell2DDataset randomXYDataset() {
double listOfData[] = new double[640 * 480];
Random rand = new Random(0);
for (int i = 0; i < (640 * 480); i++) {
listOfData[i] = rand.nextDouble();
}
ArrayDouble dataList = new ArrayDouble(listOfData);
Cell2DDataset data = Cell2DDatasets.linearRange(dataList, Ranges.range(0, 640), 640, Ranges.range(0, 480), 480);
return data;
}
public static Cell2DDataset rectangleDataset() {
double listOfData[] = new double[10 * 10];
for (int i = 0; i < (10 * 10); i++) {
listOfData[i] = i;
}
ArrayDouble dataList = new ArrayDouble(listOfData);
Cell2DDataset data = Cell2DDatasets.linearRange(dataList, Ranges.range(0, 10), 10, Ranges.range(0, 10), 10);
return data;
}
private Cell2DDataset rectangleSolidDataset() {
double listOfData[] = new double[640 * 10];
for (int i = 0; i < (640 * 10); i++) {
listOfData[i] = 1;
}
ArrayDouble dataList = new ArrayDouble(listOfData);
Cell2DDataset data = Cell2DDatasets.linearRange(dataList, Ranges.range(0, 640), 640, Ranges.range(0, 10), 10);
return data;
}
private Cell2DDataset smallXDataset() {
double listOfData[] = new double[640 * 10];
for (int i = 0; i < (640 * 10); i++) {
listOfData[i] = i;
}
ArrayDouble dataList = new ArrayDouble(listOfData);
Cell2DDataset data = Cell2DDatasets.linearRange(dataList, Ranges.range(0, 640), 640, Ranges.range(0, 10), 10);
return data;
}
private Cell2DDataset smallXSolidDataset() {
double listOfData[] = new double[10 * 480];
for (int i = 0; i < (10 * 480); i++) {
listOfData[i] = 1;
}
ArrayDouble dataList = new ArrayDouble(listOfData);
Cell2DDataset data = Cell2DDatasets.linearRange(dataList, Ranges.range(0, 10), 10, Ranges.range(0, 480), 480);
return data;
}
private Cell2DDataset smallYDataset() {
double listOfData[] = new double[10 * 480];
for (int i = 0; i < (10 * 480); i++) {
listOfData[i] = i;
}
ArrayDouble dataList = new ArrayDouble(listOfData);
Cell2DDataset data = Cell2DDatasets.linearRange(dataList, Ranges.range(0, 10), 10, Ranges.range(0, 480), 480);
return data;
}
private Cell2DDataset smallYSolidDataset() {
double listOfData[] = new double[640 * 480];
for (int i = 0; i < (640 * 480); i++) {
listOfData[i] = 1;
}
ArrayDouble dataList = new ArrayDouble(listOfData);
Cell2DDataset data = Cell2DDatasets.linearRange(dataList, Ranges.range(0, 640), 640, Ranges.range(0, 480), 480);
return data;
}
private Cell2DDataset smallXAndYDataset() {
double listOfData[] = new double[640 * 480];
for (int i = 0; i < (640 * 480); i++) {
listOfData[i] = i;
}
ArrayDouble dataList = new ArrayDouble(listOfData);
Cell2DDataset data = Cell2DDatasets.linearRange(dataList, Ranges.range(0, 640), 640, Ranges.range(0, 480), 480);
return data;
}
private Cell2DDataset singlePixelDataset() {
double listOfData[] = new double[640 * 480];
for (int i = 0; i < (640 * 480); i++) {
if (i % 1240 == 0) {
listOfData[i] = 0;
} else {
listOfData[i] = 1;
}
}
ArrayDouble dataList = new ArrayDouble(listOfData);
Cell2DDataset data = Cell2DDatasets.linearRange(dataList, Ranges.range(0, 640), 640, Ranges.range(0, 480), 480);
return data;
}
private Cell2DDataset smallXSingleYValueDataset() {
double listOfData[] = new double[640 * 480];
for (int i = 0; i < (640 * 480); i++) {
listOfData[i] = 10000000;
}
ArrayDouble dataList = new ArrayDouble(listOfData);
Cell2DDataset data = Cell2DDatasets.linearRange(dataList, Ranges.range(0, 640), 640, Ranges.range(0, 480), 480);
return data;
}
private Cell2DDataset nonlinearBoundaries() {
Cell2DDataset data = Cell2DDatasets.datasetFrom(new Cell2DDatasets.Function2D() {
@Override
public double getValue(double x, double y) {
return x * y;
}
}, new ArrayDouble(0, 1, 2, 4, 9, 16, 25, 36, 49, 64, 81, 100), new ArrayDouble(0, 1, 2, 4, 9, 16, 25, 36, 49, 64, 81, 100));
return data;
}
private Cell2DDataset largeAndSmallCellsDataset() {
int size = 100;
double[] boundaries = new double[size];
boundaries[0] = 0;
for (int i = 1; i < boundaries.length; i++) {
boundaries[i] = 90.0 + i * 10.0 / size;
}
Cell2DDataset data = Cell2DDatasets.datasetFrom(new Cell2DDatasets.Function2D() {
@Override
public double getValue(double x, double y) {
return x * y;
}
}, new ArrayDouble(boundaries), new ArrayDouble(boundaries));
return data;
}
private Cell2DDataset ellipticParaboloid(int xPoints, Range xRange, int yPoints, Range yRange) {
return Cell2DDatasets.linearRange(new Cell2DDatasets.Function2D() {
@Override
public double getValue(double x, double y) {
return x*x + y*y;
}
}, xRange, xPoints, yRange, yPoints);
}
@Test
public void rectangles() throws Exception {
Cell2DDataset data = rectangleDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().colorMap(NumberColorMaps.GRAY));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.rectangles", graphBuffer.getImage());
}
@Test
public void rectanglesSolid() throws Exception {
Cell2DDataset data = rectangleSolidDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().colorMap(NumberColorMaps.GRAY));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.rectanglesSolid", graphBuffer.getImage());
}
@Test
public void smallX() throws Exception {
Cell2DDataset data = smallXDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().colorMap(NumberColorMaps.GRAY));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallX", graphBuffer.getImage());
}
@Test
public void smallXSolid() throws Exception {
Cell2DDataset data = smallXSolidDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().colorMap(NumberColorMaps.GRAY));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallXSolid", graphBuffer.getImage());
}
@Test
public void smallY() throws Exception {
Cell2DDataset data = smallYDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().colorMap(NumberColorMaps.GRAY));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallY", graphBuffer.getImage());
}
@Test
public void smallYSolid() throws Exception {
Cell2DDataset data = smallYSolidDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().colorMap(NumberColorMaps.GRAY));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallYSolid", graphBuffer.getImage());
}
@Test
public void smallXAndY() throws Exception {
Cell2DDataset data = smallXAndYDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().colorMap(NumberColorMaps.GRAY));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallXAndY", graphBuffer.getImage());
}
@Test
public void smallXAndYWithLegend() throws Exception {
Cell2DDataset data = randomXYDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().drawLegend(true).colorMap(NumberColorMaps.GRAY));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallXAndYWithLegend", graphBuffer.getImage());
}
@Test
public void smallXandYSinglePixels() throws Exception {
Cell2DDataset data = singlePixelDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().drawLegend(true).colorMap(NumberColorMaps.GRAY));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallXAndYSinglePixels", graphBuffer.getImage());
}
@Test
public void smallXAndYJet() throws Exception {
Cell2DDataset data = randomXYDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().drawLegend(true));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallXAndYJet", graphBuffer.getImage());
}
@Test
public void smallXAndYSingleValue() throws Exception {
Cell2DDataset data = smallXSingleYValueDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().drawLegend(true));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallXAndYSingleValue", graphBuffer.getImage());
}
@Test
public void largeAndSmallCells() throws Exception {
Cell2DDataset data = largeAndSmallCellsDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(100, 100);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.largeAndSmallCells", graphBuffer.getImage());
}
@Test
public void smallCellsZoomInAndOut() throws Exception {
Cell2DDataset data = ellipticParaboloid(200, Ranges.range(0, 100), 200, Ranges.range(0, 100));
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallCellsZoomInAndOut.1", graphBuffer.getImage());
renderer.update(renderer.newUpdate().xAxisRange(AxisRanges.fixed(20, 80))
.yAxisRange(AxisRanges.fixed(20, 80)));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallCellsZoomInAndOut.2", graphBuffer.getImage());
renderer.update(renderer.newUpdate().xAxisRange(AxisRanges.fixed(0, 100))
.yAxisRange(AxisRanges.fixed(0, 100)));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallCellsZoomInAndOut.1", graphBuffer.getImage());
renderer.update(renderer.newUpdate().xAxisRange(AxisRanges.fixed(-20, 120))
.yAxisRange(AxisRanges.fixed(-20, 120)));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallCellsZoomInAndOut.3", graphBuffer.getImage());
renderer.update(renderer.newUpdate().xAxisRange(AxisRanges.fixed(-20, 120))
.yAxisRange(AxisRanges.fixed(40, 60)));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallCellsZoomInAndOut.4", graphBuffer.getImage());
renderer.update(renderer.newUpdate().xAxisRange(AxisRanges.fixed(20, 40))
.yAxisRange(AxisRanges.fixed(-40, 120)));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.smallCellsZoomInAndOut.5", graphBuffer.getImage());
}
@Test
public void nonlinearBoundariesZoomInAndZoomOut() throws Exception {
Cell2DDataset data = nonlinearBoundaries();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().drawLegend(true));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.nonlinearBoundariesZoomInAndZoomOut.1", graphBuffer.getImage());
renderer.update(renderer.newUpdate()
.xAxisRange(AxisRanges.fixed(20, 80))
.yAxisRange(AxisRanges.fixed(20, 80)));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.nonlinearBoundariesZoomInAndZoomOut.2", graphBuffer.getImage());
renderer.update(renderer.newUpdate()
.xAxisRange(AxisRanges.fixed(-20, 120))
.yAxisRange(AxisRanges.fixed(-20, 120)));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.nonlinearBoundariesZoomInAndZoomOut.3", graphBuffer.getImage());
}
@Test
public void rightMarginWithLegend() throws Exception {
Cell2DDataset data = randomXYDataset();
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.update(renderer.newUpdate().drawLegend(true).rightMargin(20));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.rightMarginWithLegend", graphBuffer.getImage());
}
private Cell2DDataset createRandomDataset(int width, int height) {
double listOfData[] = new double[width * height];
Random rand = new Random(0);
for (int i = 0; i < (width * height); i++) {
listOfData[i] = rand.nextDouble();
}
ArrayDouble dataList = new ArrayDouble(listOfData);
return Cell2DDatasets.linearRange(dataList, Ranges.range(0, width), width, Ranges.range(0, height), height);
}
@Test
public void addRemoveLegend() throws Exception {
Cell2DDataset data = createRandomDataset(640, 480);
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.addRemoveLegend.1", graphBuffer.getImage());
renderer.update(renderer.newUpdate().drawLegend(true));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.addRemoveLegend.2", graphBuffer.getImage());
renderer.update(renderer.newUpdate().drawLegend(false));
renderer.draw(graphBuffer, data);
ImageAssert.compareImages("intensityGraph2D.addRemoveLegend.1", graphBuffer.getImage());
}
@Test
public void selectedRegion() throws Exception {
Cell2DDataset data = ellipticParaboloid(200, Ranges.range(0, 100), 200, Ranges.range(0, 100));
IntensityGraph2DRenderer renderer = new IntensityGraph2DRenderer(640, 480);
renderer.update(renderer.newUpdate().pixelSelectionRange(100, 200, 150, 250));
GraphBuffer graphBuffer = new GraphBuffer(renderer);
renderer.draw(graphBuffer, data);
assertThat(renderer.getXPixelSelectionRange().getMinimum(), equalTo(100.0));
assertThat(renderer.getXPixelSelectionRange().getMaximum(), equalTo(200.0));
assertThat(renderer.getYPixelSelectionRange().getMinimum(), equalTo(150.0));
assertThat(renderer.getYPixelSelectionRange().getMaximum(), equalTo(250.0));
assertThat(renderer.getXValueSelectionRange().getMinimum(), closeTo(12.5203, 0.0001));
assertThat(renderer.getXValueSelectionRange().getMaximum(), closeTo(28.9430, 0.0001));
assertThat(renderer.getYValueSelectionRange().getMinimum(), closeTo(45.9869, 0.0001));
assertThat(renderer.getYValueSelectionRange().getMaximum(), closeTo(67.8958, 0.0001));
assertThat(renderer.getXIndexSelectionRange().getMinimum(), equalTo(25.0));
assertThat(renderer.getXIndexSelectionRange().getMaximum(), equalTo(57.0));
assertThat(renderer.getYIndexSelectionRange().getMinimum(), equalTo(92.0));
assertThat(renderer.getYIndexSelectionRange().getMaximum(), equalTo(135.0));
ImageAssert.compareImages("intensityGraph2D.selectedRegion.1", graphBuffer.getImage());
}
}