Skip to content

Commit

Permalink
add demScaler interface
Browse files Browse the repository at this point in the history
  • Loading branch information
svencc committed Feb 27, 2024
1 parent 9406f2c commit 8be2afb
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 74 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import com.recom.commons.map.rasterizer.configuration.LayerOrder;
import com.recom.commons.map.rasterizer.configuration.MapLayerRenderer;
import com.recom.commons.map.rasterizer.mapdesignscheme.MapDesignScheme;
import com.recom.commons.map.rasterizer.scaler.DEMScaler;
import com.recom.commons.map.rasterizer.scaler.DEMScalerNearestNeighbor;
import com.recom.commons.model.DEMDescriptor;
import com.recom.commons.model.maprendererpipeline.MapComposerWorkPackage;
import com.recom.commons.model.maprendererpipeline.MapLayerRendererConfiguration;
Expand All @@ -23,12 +23,12 @@ public class BaseMapRasterizer implements MapLayerRenderer {
.layerOrder(LayerOrder.BASE_MAP)
.build();
@NonNull
private final DEMScaler demScaler;
private final DEMScalerNearestNeighbor demScaler;


public BaseMapRasterizer() {
// @TODO vermutlich hier raus; has to be used outside ...
demScaler = new DEMScaler();
demScaler = new DEMScalerNearestNeighbor();
}

@NonNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.recom.commons.map.rasterizer.configuration.LayerOrder;
import com.recom.commons.map.rasterizer.configuration.MapLayerRenderer;
import com.recom.commons.map.rasterizer.scaler.DEMScaler;
import com.recom.commons.map.rasterizer.scaler.DEMScalerNearestNeighbor;
import com.recom.commons.model.DEMDescriptor;
import com.recom.commons.model.maprendererpipeline.MapComposerWorkPackage;
import com.recom.commons.model.maprendererpipeline.MapLayerRendererConfiguration;
Expand All @@ -22,11 +22,11 @@ public class HeightMapRasterizer implements MapLayerRenderer {
.enabled(false)
.build();
@NonNull
private final DEMScaler demScaler;
private final DEMScalerNearestNeighbor demScaler;


public HeightMapRasterizer() {
demScaler = new DEMScaler();
demScaler = new DEMScalerNearestNeighbor();
}

@NonNull
Expand Down
Original file line number Diff line number Diff line change
@@ -1,77 +1,14 @@
package com.recom.commons.map.rasterizer.scaler;

import com.recom.commons.calculator.ARGBCalculator;
import com.recom.commons.model.DEMDescriptor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class DEMScaler {
public interface DEMScaler {

@NonNull
private final ARGBCalculator argbCalculator = new ARGBCalculator();


public int[] scaleMap(
int[] scaleMap(
@NonNull final DEMDescriptor DEMDescriptor,
final int scale,
final int[] originalDEM
) {
final int originalHeight = DEMDescriptor.getDem().length;
final int originalWidth = DEMDescriptor.getDem()[0].length;

if (Math.abs(scale) == 1 || scale == 0) {
return originalDEM;
} else if (scale > 1) {
final int scaledHeight = DEMDescriptor.getDem().length * scale;
final int scaledWidth = DEMDescriptor.getDem()[0].length * scale;

final int[] scaledMap = new int[scaledHeight * scaledWidth];
for (int x = 0; x < originalHeight; x++) {
for (int z = 0; z < originalWidth; z++) {
final int color = originalDEM[x + z * originalWidth];
for (int scaledPixelX = 0; scaledPixelX < scale; scaledPixelX++) {
for (int scaledPixelZ = 0; scaledPixelZ < scale; scaledPixelZ++) {
scaledMap[(x * scale + scaledPixelX) + (z * scale + scaledPixelZ) * scaledWidth] = color;
}
}
}
}

return scaledMap;
} else {
// Nearest Neighbour Downsampling: https://en.wikipedia.org/wiki/Image_scaling
final int absScale = Math.abs(scale);
final int scaledHeight = DEMDescriptor.getDem().length / absScale;
final int scaledWidth = DEMDescriptor.getDem()[0].length / absScale;

final int[] scaledMap = new int[scaledHeight * scaledWidth];
for (int x = 0; x < scaledHeight; x++) {
for (int z = 0; z < scaledWidth; z++) {
int alphaComponentSum = 0;
int redComponentSum = 0;
int greenComponentSum = 0;
int blueComponentSum = 0;
for (int scaledPixelX = 0; scaledPixelX < absScale; scaledPixelX++) {
for (int scaledPixelZ = 0; scaledPixelZ < absScale; scaledPixelZ++) {
alphaComponentSum += argbCalculator.getAlphaComponent(originalDEM[(x * absScale + scaledPixelX) + (z * absScale + scaledPixelZ) * originalWidth]);
redComponentSum += argbCalculator.getRedComponent(originalDEM[(x * absScale + scaledPixelX) + (z * absScale + scaledPixelZ) * originalWidth]);
greenComponentSum += argbCalculator.getGreenComponent(originalDEM[(x * absScale + scaledPixelX) + (z * absScale + scaledPixelZ) * originalWidth]);
blueComponentSum += argbCalculator.getBlueComponent(originalDEM[(x * absScale + scaledPixelX) + (z * absScale + scaledPixelZ) * originalWidth]);
}
}
final int scalePow = (int) Math.pow(absScale, 2);
alphaComponentSum /= scalePow;
redComponentSum /= scalePow;
greenComponentSum /= scalePow;
blueComponentSum /= scalePow;

scaledMap[x + z * scaledWidth] = argbCalculator.compose(alphaComponentSum, redComponentSum, greenComponentSum, blueComponentSum);
}
}

return scaledMap;
}
}
@NonNull final int[] originalDEM
);

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.recom.commons.map.rasterizer.scaler;

import com.recom.commons.calculator.ARGBCalculator;
import com.recom.commons.model.DEMDescriptor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class DEMScalerNearestNeighbor implements DEMScaler {

@NonNull
private final ARGBCalculator argbCalculator = new ARGBCalculator();


@NonNull
@Override
public int[] scaleMap(
@NonNull final DEMDescriptor DEMDescriptor,
final int scale,
final int[] originalDEM
) {
final int originalHeight = DEMDescriptor.getDem().length;
final int originalWidth = DEMDescriptor.getDem()[0].length;

if (Math.abs(scale) == 1 || scale == 0) {
return originalDEM;
} else if (scale > 1) {
final int scaledHeight = DEMDescriptor.getDem().length * scale;
final int scaledWidth = DEMDescriptor.getDem()[0].length * scale;

final int[] scaledMap = new int[scaledHeight * scaledWidth];
for (int x = 0; x < originalHeight; x++) {
for (int z = 0; z < originalWidth; z++) {
final int color = originalDEM[x + z * originalWidth];
for (int scaledPixelX = 0; scaledPixelX < scale; scaledPixelX++) {
for (int scaledPixelZ = 0; scaledPixelZ < scale; scaledPixelZ++) {
scaledMap[(x * scale + scaledPixelX) + (z * scale + scaledPixelZ) * scaledWidth] = color;
}
}
}
}

return scaledMap;
} else {
// Nearest Neighbour Downsampling: https://en.wikipedia.org/wiki/Image_scaling
final int absScale = Math.abs(scale);
final int scaledHeight = DEMDescriptor.getDem().length / absScale;
final int scaledWidth = DEMDescriptor.getDem()[0].length / absScale;

final int[] scaledMap = new int[scaledHeight * scaledWidth];
for (int x = 0; x < scaledHeight; x++) {
for (int z = 0; z < scaledWidth; z++) {
int alphaComponentSum = 0;
int redComponentSum = 0;
int greenComponentSum = 0;
int blueComponentSum = 0;
for (int scaledPixelX = 0; scaledPixelX < absScale; scaledPixelX++) {
for (int scaledPixelZ = 0; scaledPixelZ < absScale; scaledPixelZ++) {
alphaComponentSum += argbCalculator.getAlphaComponent(originalDEM[(x * absScale + scaledPixelX) + (z * absScale + scaledPixelZ) * originalWidth]);
redComponentSum += argbCalculator.getRedComponent(originalDEM[(x * absScale + scaledPixelX) + (z * absScale + scaledPixelZ) * originalWidth]);
greenComponentSum += argbCalculator.getGreenComponent(originalDEM[(x * absScale + scaledPixelX) + (z * absScale + scaledPixelZ) * originalWidth]);
blueComponentSum += argbCalculator.getBlueComponent(originalDEM[(x * absScale + scaledPixelX) + (z * absScale + scaledPixelZ) * originalWidth]);
}
}
final int scalePow = (int) Math.pow(absScale, 2);
alphaComponentSum /= scalePow;
redComponentSum /= scalePow;
greenComponentSum /= scalePow;
blueComponentSum /= scalePow;

scaledMap[x + z * scaledWidth] = argbCalculator.compose(alphaComponentSum, redComponentSum, greenComponentSum, blueComponentSum);
}
}

return scaledMap;
}
}

}

0 comments on commit 8be2afb

Please sign in to comment.