package org.pepsoft.worldpainter.heightMaps; import org.pepsoft.util.IconUtils; import org.pepsoft.util.MathUtils; import javax.swing.*; /** * Created by pepijn on 28-3-16. */ public class BandedHeightMap extends AbstractHeightMap { public float getSegment1EndHeight() { return segment1EndHeight; } public void setSegment1EndHeight(float segment1EndHeight) { this.segment1EndHeight = segment1EndHeight; recalculate(); } public int getSegment1Length() { return segment1Length; } public void setSegment1Length(int segment1Length) { this.segment1Length = segment1Length; recalculate(); } public int getSegment2Length() { return segment2Length; } public void setSegment2Length(int segment2Length) { this.segment2Length = segment2Length; recalculate(); } public float getSegment2EndHeight() { return segment2EndHeight; } public void setSegment2EndHeight(float segment2EndHeight) { this.segment2EndHeight = segment2EndHeight; recalculate(); } public boolean isSmooth() { return smooth; } public void setSmooth(boolean smooth) { this.smooth = smooth; } // HeightMap @Override public float getHeight(float x0, float y0) { final float d = MathUtils.mod(x0, totalLength); if (d < segment1Length) { if (smooth) { return (float) (segment2EndHeight + (0.5 - Math.cos(d * Math.PI / segment1Length) / 2) * segment1EndDelta); } else { return segment2EndHeight + d / segment1Length * segment1EndDelta; } } else { if (smooth) { return (float) (segment1EndHeight + (0.5 - Math.cos((d - segment1Length) * Math.PI / segment2Length) / 2) * segment2EndDelta); } else { return segment1EndHeight + (d - segment1Length) / segment2Length * segment2EndDelta; } } } @Override public Icon getIcon() { return ICON_BANDED_HEIGHTMAP; } @Override public float[] getRange() { return RANGE; } private void recalculate() { totalLength = segment1Length + segment2Length; segment1EndDelta = segment1EndHeight - segment2EndHeight; segment2EndDelta = segment2EndHeight - segment1EndHeight; } private int segment1Length = 100, segment2Length = 100, totalLength = 200; private float segment1EndHeight = 1f, segment2EndHeight, segment1EndDelta = 1f, segment2EndDelta; private boolean smooth; private static final long serialVersionUID = 1L; private static final Icon ICON_BANDED_HEIGHTMAP = IconUtils.loadScaledIcon("org/pepsoft/worldpainter/icons/sawtooth.png"); private static final float[] RANGE = {0.0f, 1.0f}; }