/*
* Geotoolkit.org - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2012, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotoolkit.image.relief;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import org.geotoolkit.image.iterator.PixelIterator;
import org.geotoolkit.image.iterator.PixelIteratorFactory;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
/**
* Test suite for {@link ReliefShadow} class.
*
* @author RĂ©mi Marechal (Geomatys).
*/
public class ReliefShadowTest extends org.geotoolkit.test.TestBase {
/**
* Source image.
*/
private final BufferedImage sourceImage;
/**
* Source image iterator.
*/
private final PixelIterator srcIter;
/**
* source Digital Elevation Model.
*/
private final BufferedImage mnt;
/**
* source Digital Elevation Model iterator.
*/
private final PixelIterator mntIter;
public ReliefShadowTest() {
sourceImage = new BufferedImage(5, 5, BufferedImage.TYPE_BYTE_GRAY);
srcIter = PixelIteratorFactory.createDefaultWriteableIterator(sourceImage, sourceImage);
mnt = new BufferedImage(5, 5, BufferedImage.TYPE_BYTE_GRAY);
mntIter = PixelIteratorFactory.createDefaultWriteableIterator(mnt, mnt);
}
@Test
public void angle0Test() {
initTest(2,2,128);
final ReliefShadow rf = new ReliefShadow(0, 45, 0);
final RenderedImage result = rf.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResult = PixelIteratorFactory.createRowMajorIterator(result);
for (int y = 0; y<5; y++) {
for (int x = 0; x < 5; x++) {
pixResult.moveTo(x, y, 0);
String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value ";
final int pixValue = pixResult.getSample();
if (x == 2 && y > 2) {
assertTrue(message+0+" found : "+pixValue, pixResult.getSample() == 0);
} else {
assertTrue(message+255+" found : "+pixValue, pixResult.getSample() == 255);
}
}
}
final ReliefShadow rfInvert = new ReliefShadow(-360, 45, 0);
final RenderedImage resultInvert = rfInvert.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResultinvert = PixelIteratorFactory.createRowMajorIterator(resultInvert);
pixResult.rewind();
while (pixResultinvert.next()) {
pixResult.next();
final int resultValue = pixResult.getSample();
final int resultInvertValue = pixResultinvert.getSample();
final String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value : "+resultValue+" found : "+resultInvertValue;
assertTrue(message, resultValue == resultInvertValue);
}
}
@Test
public void angle45Test() {
initTest(2,2,128);
final ReliefShadow rf = new ReliefShadow(45, 45, 0);
final RenderedImage result = rf.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResult = PixelIteratorFactory.createRowMajorIterator(result);
for (int y = 0; y<5; y++) {
for (int x = 0; x < 5; x++) {
pixResult.moveTo(x, y, 0);
String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value ";
final int pixValue = pixResult.getSample();
if (x==y && x>2 && y>2) {
assertTrue(message+0+" found : "+pixValue, pixResult.getSample() == 0);
} else {
assertTrue(message+255+" found : "+pixValue, pixResult.getSample() == 255);
}
}
}
final ReliefShadow rfInvert = new ReliefShadow(-315, 45, 0);
final RenderedImage resultInvert = rfInvert.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResultinvert = PixelIteratorFactory.createRowMajorIterator(resultInvert);
pixResult.rewind();
while (pixResultinvert.next()) {
pixResult.next();
final int resultValue = pixResult.getSample();
final int resultInvertValue = pixResultinvert.getSample();
final String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value : "+resultValue+" found : "+resultInvertValue;
assertTrue(message, resultValue == resultInvertValue);
}
}
@Test
public void angle90Test() {
initTest(2,2,128);
final ReliefShadow rf = new ReliefShadow(90, 45, 0);
final RenderedImage result = rf.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResult = PixelIteratorFactory.createRowMajorIterator(result);
for (int y = 0; y < 5; y++) {
for (int x = 0; x < 5; x++) {
pixResult.moveTo(x, y, 0);
String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value ";
final int pixValue = pixResult.getSample();
if (x > 2 && y == 2) {
assertTrue(message+0+" found : "+pixValue, pixResult.getSample() == 0);
} else {
assertTrue(message+255+" found : "+pixValue, pixResult.getSample() == 255);
}
}
}
final ReliefShadow rfInvert = new ReliefShadow(-270, 45, 0);
final RenderedImage resultInvert = rfInvert.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResultinvert = PixelIteratorFactory.createRowMajorIterator(resultInvert);
pixResult.rewind();
while (pixResultinvert.next()) {
pixResult.next();
final int resultValue = pixResult.getSample();
final int resultInvertValue = pixResultinvert.getSample();
final String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value : "+resultValue+" found : "+resultInvertValue;
assertTrue(message, resultValue == resultInvertValue);
}
}
@Test
public void angle135Test() {
initTest(2,2,128);
final ReliefShadow rf = new ReliefShadow(135, 45, 0);
final RenderedImage result = rf.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResult = PixelIteratorFactory.createRowMajorIterator(result);
for (int y = 0; y < 5; y++) {
for (int x = 0; x < 5; x++) {
pixResult.moveTo(x, y, 0);
String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value ";
final int pixValue = pixResult.getSample();
if (x > 2 && y < 2 && (5-x-1) == y) {
assertTrue(message+0+" found : "+pixValue, pixResult.getSample() == 0);
} else {
assertTrue(message+255+" found : "+pixValue, pixResult.getSample() == 255);
}
}
}
final ReliefShadow rfInvert = new ReliefShadow(-225, 45, 0);
final RenderedImage resultInvert = rfInvert.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResultinvert = PixelIteratorFactory.createRowMajorIterator(resultInvert);
pixResult.rewind();
while (pixResultinvert.next()) {
pixResult.next();
final int resultValue = pixResult.getSample();
final int resultInvertValue = pixResultinvert.getSample();
final String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value : "+resultValue+" found : "+resultInvertValue;
assertTrue(message, resultValue == resultInvertValue);
}
}
@Test
public void angle180Test() {
initTest(2,2,128);
final ReliefShadow rf = new ReliefShadow(180, 45, 0);
final RenderedImage result = rf.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResult = PixelIteratorFactory.createRowMajorIterator(result);
for (int y = 0; y < 5; y++) {
for (int x = 0; x < 5; x++) {
pixResult.moveTo(x, y, 0);
String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value ";
final int pixValue = pixResult.getSample();
if (x == 2 && y < 2) {
assertTrue(message+0+" found : "+pixValue, pixResult.getSample() == 0);
} else {
assertTrue(message+255+" found : "+pixValue, pixResult.getSample() == 255);
}
}
}
final ReliefShadow rfInvert = new ReliefShadow(-180, 45, 0);
final RenderedImage resultInvert = rfInvert.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResultinvert = PixelIteratorFactory.createRowMajorIterator(resultInvert);
pixResult.rewind();
while (pixResultinvert.next()) {
pixResult.next();
final int resultValue = pixResult.getSample();
final int resultInvertValue = pixResultinvert.getSample();
final String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value : "+resultValue+" found : "+resultInvertValue;
assertTrue(message, resultValue == resultInvertValue);
}
}
@Test
public void angle225Test() {
initTest(2,2,128);
final ReliefShadow rf = new ReliefShadow(225, 45, 0);
final RenderedImage result = rf.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResult = PixelIteratorFactory.createRowMajorIterator(result);
for (int y = 0; y < 5; y++) {
for (int x = 0; x < 5; x++) {
pixResult.moveTo(x, y, 0);
final String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value ";
final int pixValue = pixResult.getSample();
if (x < 2 && y < 2 && x == y) {
assertTrue(message+0+" found : "+pixValue, pixResult.getSample() == 0);
} else {
assertTrue(message+255+" found : "+pixValue, pixResult.getSample() == 255);
}
}
}
final ReliefShadow rfInvert = new ReliefShadow(-135, 45, 0);
final RenderedImage resultInvert = rfInvert.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResultinvert = PixelIteratorFactory.createRowMajorIterator(resultInvert);
pixResult.rewind();
while (pixResultinvert.next()) {
pixResult.next();
final int resultValue = pixResult.getSample();
final int resultInvertValue = pixResultinvert.getSample();
final String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value : "+resultValue+" found : "+resultInvertValue;
assertTrue(message, resultValue == resultInvertValue);
}
}
@Test
public void angle270Test() {
initTest(2,2,128);
final ReliefShadow rf = new ReliefShadow(270, 45, 0);
final RenderedImage result = rf.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResult = PixelIteratorFactory.createRowMajorIterator(result);
for (int y = 0; y < 5; y++) {
for (int x = 0; x < 5; x++) {
pixResult.moveTo(x, y, 0);
String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value ";
final int pixValue = pixResult.getSample();
if (x < 2 && y == 2 ) {
assertTrue(message+0+" found : "+pixValue, pixResult.getSample() == 0);
} else {
assertTrue(message+255+" found : "+pixValue, pixResult.getSample() == 255);
}
}
}
final ReliefShadow rfInvert = new ReliefShadow(-90, 45, 0);
final RenderedImage resultInvert = rfInvert.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResultinvert = PixelIteratorFactory.createRowMajorIterator(resultInvert);
pixResult.rewind();
while (pixResultinvert.next()) {
pixResult.next();
final int resultValue = pixResult.getSample();
final int resultInvertValue = pixResultinvert.getSample();
final String message = "at ("+pixResult.getX()+", "+pixResult.getY()
+") position, expected value : "+resultValue+" found : "+resultInvertValue;
assertTrue(message, resultValue == resultInvertValue);
}
}
@Test
public void angle315Test() {
initTest(2,2,128);
final ReliefShadow rf = new ReliefShadow(315, 45, 0);
final RenderedImage result = rf.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResult = PixelIteratorFactory.createRowMajorIterator(result);
for (int y = 0; y < 5; y++) {
for (int x = 0; x < 5; x++) {
pixResult.moveTo(x, y, 0);
String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value ";
final int pixValue = pixResult.getSample();
if (x < 2 && y > 2 && 5-y-1 == x) {
assertTrue(message+0+" found : "+pixValue, pixResult.getSample() == 0);
} else {
assertTrue(message+255+" found : "+pixValue, pixResult.getSample() == 255);
}
}
}
final ReliefShadow rfInvert = new ReliefShadow(-45, 45, 0);
final RenderedImage resultInvert = rfInvert.getRelief(sourceImage, mnt, 1);
final PixelIterator pixResultinvert = PixelIteratorFactory.createRowMajorIterator(resultInvert);
pixResult.rewind();
while (pixResultinvert.next()) {
pixResult.next();
final int resultValue = pixResult.getSample();
final int resultInvertValue = pixResultinvert.getSample();
final String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value : "+resultValue+" found : "+resultInvertValue;
assertTrue(message, resultValue == resultInvertValue);
}
}
@Test
public void altitudeTest() {
initTest(2, 2, 2);
ReliefShadow rf = new ReliefShadow(45, 45, 0);
RenderedImage result = rf.getRelief(sourceImage, mnt, 1);
PixelIterator pixResult = PixelIteratorFactory.createRowMajorIterator(result);
for (int y = 0; y < 5; y++) {
for (int x = 0; x < 5; x++) {
pixResult.moveTo(x, y, 0);
String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value ";
final int pixValue = pixResult.getSample();
if (x == 3 && y == 3 ) {
assertTrue(message+0+" found : "+pixValue, pixResult.getSample() == 0);
} else {
assertTrue(message+255+" found : "+pixValue, pixResult.getSample() == 255);
}
}
}
initTest(2, 2, 3);
rf = new ReliefShadow(45, 45, 0);
result = rf.getRelief(sourceImage, mnt, 1);
pixResult = PixelIteratorFactory.createRowMajorIterator(result);
for (int y = 0; y < 5; y++) {
for (int x = 0; x < 5; x++) {
pixResult.moveTo(x, y, 0);
String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value ";
final int pixValue = pixResult.getSample();
if ((x == 3 && y == 3) || (x == 4 && y == 4)) {
assertTrue(message+0+" found : "+pixValue, pixResult.getSample() == 0);
} else {
assertTrue(message+255+" found : "+pixValue, pixResult.getSample() == 255);
}
}
}
initTest(2, 2, 2);
rf = new ReliefShadow(45, 22.5, 0);
result = rf.getRelief(sourceImage, mnt, 1);
pixResult = PixelIteratorFactory.createRowMajorIterator(result);
for (int y = 0; y < 5; y++) {
for (int x = 0; x < 5; x++) {
pixResult.moveTo(x, y, 0);
String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value ";
final int pixValue = pixResult.getSample();
if ((x == 3 && y == 3) || (x == 4 && y == 4)) {
assertTrue(message+0+" found : "+pixValue, pixResult.getSample() == 0);
} else {
assertTrue(message+255+" found : "+pixValue, pixResult.getSample() == 255);
}
}
}
}
@Test
public void twoPikesTest() {
initTest(0, 2, 1, 2, 2, 1);
ReliefShadow rf = new ReliefShadow(90, 22.5, 0);
RenderedImage result = rf.getRelief(sourceImage, mnt, 1);
PixelIterator pixResult = PixelIteratorFactory.createRowMajorIterator(result);
for (int y = 0; y < 5; y++) {
for (int x = 0; x < 5; x++) {
pixResult.moveTo(x, y, 0);
String message = "at ("+pixResult.getX()+", "+pixResult.getY()+") position, expected value ";
final int pixValue = pixResult.getSample();
if (y == 2 && (x == 1 || x == 3 || x == 4)) {
assertTrue(message+0+" found : "+pixValue, pixResult.getSample() == 0);
} else {
assertTrue(message+255+" found : "+pixValue, pixResult.getSample() == 255);
}
}
}
}
/**
* Create two appropriates images to this test suite.
*
* @param coordinates pikes coordinates in DEM.
*/
private void initTest(int ...coordinates) {
// fill src images with white color
srcIter.rewind();
while (srcIter.next()) {
srcIter.setSample(255);
}
// fill mnt at 0 altitude
mntIter.rewind();
while (mntIter.next()) {
mntIter.setSample(0);
}
for (int p = 0; p < coordinates.length; p += 3) {
mntIter.moveTo(coordinates[p], coordinates[p+1], 0);
mntIter.setSample(coordinates[p+2]);
}
}
}