extend slider for individual number of steps and floating point stepsize, e.g. 0.1; add arrow on PathCanvasOverlay for water current

This commit is contained in:
Christopher Ronnewinkel (D036654) committed 2013-01-11 19:23:01 +01:00
1 parent edea89901e
commit ef65da4c2a
14 files changed
+139 -36

No files matched your search

@@ -452,6 +452,9 @@ public class SimulatorServiceImpl extends RemoteServiceServlet implements Simula
if (isShowLines && seedLines == 'b') {
this.getWindLinesFromEndLine(wf, windFieldDTO, startTime, endTime, timeStep);
}
windFieldDTO.curBearing = wf.getWindParameters().curBearing;
windFieldDTO.curSpeed = wf.getWindParameters().curSpeed;
return windFieldDTO;
}
@@ -6,6 +6,9 @@ import com.google.gwt.user.client.rpc.IsSerializable;
public class WindFieldDTO implements IsSerializable {
public double curSpeed;
public double curBearing;
private List<SimulatorWindDTO> matrix;
private WindLinesDTO windLinesDTO;
@@ -20,6 +20,8 @@ public interface WindPatternSetting<SettingsType> extends Named {
public SettingsType getDefault();
public int getSteps();
public List<SettingsType> getValues();
public void setValue(Double value);
@@ -43,47 +43,51 @@ public class WindPatternDisplayManagerImpl implements WindPatternDisplayManager
private void addBlastParameters(WindPatternDisplay display) {
WindPatternSetting<Double> windSpeedSetting = new WindPatternSettingSliderBar("baseWindSpeed",
"Base Speed (kn)", 2, 22, 12);
"Base Speed (kn)", 2, 22, 12,10);
display.addSetting(windSpeedSetting);
WindPatternSetting<Double> blastProbability = new WindPatternSettingSliderBar("blastProbability",
"Probability (%)", 0, 50, 25);
"Probability (%)", 0, 50, 25,10);
display.addSetting(blastProbability);
WindPatternSetting<Double> maxBlastSize = new WindPatternSettingSliderBar("maxBlastSize", "Gust Size", 1, 10,
1);
1,10);
display.addSetting(maxBlastSize);
WindPatternSetting<Double> blastWindSpeed = new WindPatternSettingSliderBar("blastWindSpeed",
"Average Speed (%)", 0, 200, 120);
"Average Speed (%)", 0, 200, 120,10);
display.addSetting(blastWindSpeed);
WindPatternSetting<Double> blastWindSpeedVar = new WindPatternSettingSliderBar("blastWindSpeedVar",
"Speed Variance (%)", 1e-4, 100, 10);
"Speed Variance (%)", 1e-4, 100, 10,10);
display.addSetting(blastWindSpeedVar);
}
private void addOscillationParameters(WindPatternDisplay display) {
WindPatternSetting<Double> windSpeedSetting = new WindPatternSettingSliderBar("baseWindSpeed",
"Base Speed (kn)", 2, 22, 12);
"Base Speed (kn)", 2, 22, 12,10);
display.addSetting(windSpeedSetting);
WindPatternSetting<Double> baseWindBearing = new WindPatternSettingSliderBar("baseWindBearing",
"Average Direction (Degrees)", -20, 20, 0);
"Average Direction (Degrees)", -20, 20, 0,10);
display.addSetting(baseWindBearing);
WindPatternSetting<Double> leftWindSpeed = new WindPatternSettingSliderBar("leftWindSpeed",
"Speed Left Side (%)", 0, 200, 100);
"Speed Left Side (%)", 0, 200, 100,10);
display.addSetting(leftWindSpeed);
WindPatternSetting<Double> middleWindSpeed = new WindPatternSettingSliderBar("middleWindSpeed",
"Speed Middle (%)", 0, 200, 100);
"Speed Middle (%)", 0, 200, 100,10);
display.addSetting(middleWindSpeed);
WindPatternSetting<Double> rightWindSpeed = new WindPatternSettingSliderBar("rightWindSpeed",
"Speed Right Side (%)", 0, 200, 100);
"Speed Right Side (%)", 0, 200, 100,10);
display.addSetting(rightWindSpeed);
WindPatternSetting<Double> frequency = new WindPatternSettingSliderBar("frequency",
"Frequency (per hr)", 0, 20, 6);
"Frequency (per hr)", 0, 20, 6,10);
display.addSetting(frequency);
WindPatternSetting<Double> amplitude = new WindPatternSettingSliderBar("amplitude",
"Amplitude (Degrees)", -30, 30, 0);
"Amplitude (Degrees)", -30, 30, 0, 10);
display.addSetting(amplitude);
WindPatternSetting<Double> curSpeed = new WindPatternSettingSliderBar("curSpeed",
"Current Speed (kn)", 0, 2, 0, 10);
display.addSetting(curSpeed);
WindPatternSetting<Double> curBearing = new WindPatternSettingSliderBar("curBearing",
"Current Bearing (Degrees)", 0, 360, 180, 36);
display.addSetting(curBearing);
}
}
@@ -56,6 +56,12 @@ public class WindPatternSettingListBox implements WindPatternSetting<String>, Is
return null;
}
@Override
public int getSteps() {
// TODO Auto-generated method stub
return 0;
}
@Override
public List<String> getValues() {
return values;
@@ -20,6 +20,7 @@ public class WindPatternSettingSliderBar implements WindPatternSetting<Double>,
private double min;
private double max;
private double defaultValue;
private int steps;
/**
* Required for serialization
@@ -28,13 +29,14 @@ public class WindPatternSettingSliderBar implements WindPatternSetting<Double>,
}
public WindPatternSettingSliderBar(String name, String displayName, double min, double max, double defaultValue) {
public WindPatternSettingSliderBar(String name, String displayName, double min, double max, double defaultValue, int steps) {
this.name = name;
this.displayName = displayName;
this.min = min;
this.max = max;
this.defaultValue = defaultValue;
this.currentValue = defaultValue;
this.steps = steps;
}
@Override
@@ -64,6 +66,11 @@ public class WindPatternSettingSliderBar implements WindPatternSetting<Double>,
return defaultValue;
}
@Override
public int getSteps() {
return steps;
}
@Override
public String getName() {
return name;
@@ -5,6 +5,7 @@ import java.util.Iterator;
import java.util.List;
import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.canvas.dom.client.TextMetrics;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.i18n.client.TimeZone;
@@ -40,10 +41,16 @@ public class PathCanvasOverlay extends WindFieldCanvasOverlay implements Named {
private LatLng endPoint;
private boolean totalTimeIsGiven = false;
private long totalTimeMilliseconds = 0;
private double curSpeed;
private double curBearing;
protected String name;
public String pathColor = "Green";
public String textFont = "normal 10pt UbuntuRegular";
/**
* Whether or not to display the wind directions for the points on the optimal path.
*/
@@ -87,6 +94,11 @@ public class PathCanvasOverlay extends WindFieldCanvasOverlay implements Named {
this.endPoint = endPoint;
}
public void setCurrent(double curSpeed, double curBearing) {
this.curSpeed = curSpeed;
this.curBearing = curBearing;
}
/*
@Override
protected void drawWindField() {
@@ -98,6 +110,34 @@ public class PathCanvasOverlay extends WindFieldCanvasOverlay implements Named {
@Override
protected void drawWindField(final List<SimulatorWindDTO> windDTOList) {
//
// TODO: draw current arrow
//
DegreeBearingImpl curBear = new DegreeBearingImpl(this.curBearing);
Context2d context2d = canvas.getContext2d();
if (this.curSpeed >= 0.0) {
//drawScaledArrow(windDTO, dbi.getRadians(), index, true);
double cFactor = 12.0;
double cWidth = Math.max(1., 1. + (cFactor * PathPolyline.knotsToMetersPerSecond(this.curSpeed) / 3.0));
double cLength = Math.max(10., 10. + (cFactor * 2. * PathPolyline.knotsToMetersPerSecond(this.curSpeed)));
int cX = 100;
int cY = 150;
if (this.curSpeed > 0.0) {
drawArrowPx(cX, cY, curBear.getRadians(), cLength, cWidth, true, "Green");
}
context2d.setFont(textFont);
context2d.setFillStyle(textColor);
TextMetrics txtmet;
String cText = "Current: " + SimulatorMainPanel.formatSliderValue(curSpeed) + "kn";
txtmet = context2d.measureText(cText);
final double timewidth = txtmet.getWidth();
context2d.fillText(cText, cX-(timewidth/2.0), cY-25);
}
final WindFieldGenParamsDTO windParams = new WindFieldGenParamsDTO();
final int numPoints = windDTOList.size();
@@ -125,7 +165,7 @@ public class PathCanvasOverlay extends WindFieldCanvasOverlay implements Named {
if (windDTOList != null && windDTOList.size() > 0) {
final Context2d context2d = canvas.getContext2d();
//final Context2d context2d = canvas.getContext2d();
context2d.setGlobalAlpha(0.8);
Iterator<SimulatorWindDTO> windDTOIter = windDTOList.iterator();
@@ -20,6 +20,7 @@ import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
@@ -119,7 +120,7 @@ public class SimulatorMainPanel extends SplitLayoutPanel {
@Override
public void onValueChange(final ValueChangeEvent<Double> arg0) {
sliderBar.setTitle(String.valueOf(Math.round(sliderBar.getCurrentValue())));
sliderBar.setTitle(SimulatorMainPanel.formatSliderValue(sliderBar.getCurrentValue()));
logger.info("Slider value : " + arg0.getValue());
setting.setValue(arg0.getValue());
if (autoUpdate) {
@@ -184,6 +185,10 @@ public class SimulatorMainPanel extends SplitLayoutPanel {
}
public static String formatSliderValue(double value) {
return NumberFormat.getFormat("0.0").format(value);
}
public SimulatorMainPanel(final SimulatorServiceAsync svc, final StringMessages stringMessages, final ErrorReporter errorReporter,
final int xRes, final int yRes, final boolean autoUpdate, final char mode, final boolean showGrid, final boolean showLines, final char seedLines, final boolean showArrows, final boolean showStreamlets) {
@@ -388,8 +393,9 @@ public class SimulatorMainPanel extends SplitLayoutPanel {
sliderBar.getElement().getStyle().setProperty("width", "216px");
sliderBar.setStepSize(Math.round((maxValue - minValue) / 10.), false);
sliderBar.setNumTicks(10);
//sliderBar.setStepSize(Math.round((maxValue - minValue) / 10.), false);
sliderBar.setStepSize(((maxValue - minValue) / ((double)s.getSteps()) ), false);
sliderBar.setNumTicks(s.getSteps());
sliderBar.setNumTickLabels(1);
sliderBar.setEnabled(true);
@@ -401,11 +407,13 @@ public class SimulatorMainPanel extends SplitLayoutPanel {
@Override
public String formatLabel(final SliderBar slider, final Double value, final Double previousValue) {
return String.valueOf(Math.round(value));
//return String.valueOf((value));
}
});
sliderBar.setCurrentValue(defaultValue);
sliderBar.setTitle(String.valueOf(Math.round(sliderBar.getCurrentValue())));
//sliderBar.setTitle(String.valueOf(Math.round(sliderBar.getCurrentValue())));
sliderBar.setTitle(SimulatorMainPanel.formatSliderValue(sliderBar.getCurrentValue()));
vp.add(sliderBar);
parentPanel.add(vp);
@@ -148,6 +148,11 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ
mapw.addOverlay(replayPathCanvasOverlay);
replayPathCanvasOverlay.setWindField(pathWindDTO);
replayPathCanvasOverlay.setRaceCourse(raceCourseCanvasOverlay.startPoint, raceCourseCanvasOverlay.endPoint);
if (index == 0) {
replayPathCanvasOverlay.setCurrent(result.getWindField().curSpeed,result.getWindField().curBearing);
} else {
replayPathCanvasOverlay.setCurrent(-1.0,0.0);
}
replayPathCanvasOverlay.redraw(true);
legendCanvasOverlay.setPathOverlays(replayPathCanvasOverlays);
@@ -190,19 +190,24 @@ public class WindFieldCanvasOverlay extends FullCanvasOverlay implements TimeLis
final LatLng positionLatLng = LatLng.newInstance(position.latDeg, position.lngDeg);
final Point canvasPositionInPx = getMap().convertLatLngToDivPixel(positionLatLng);
final int x = canvasPositionInPx.getX() - this.getWidgetPosLeft();
final int y = canvasPositionInPx.getY() - this.getWidgetPosTop();
windFieldPoints.put(new ToolTip(x, y), windDTO);
drawArrowPx(x, y, angle, length, weight, drawHead, arrowColor);
}
protected void drawArrowPx(int x, int y, double angle, double length, double weight, boolean drawHead, String color) {
final double dx = length * Math.sin(angle);
final double dy = -length * Math.cos(angle);
final double x1 = x + dx / 2;
final double y1 = y + dy / 2;
drawLine(x - dx / 2, y - dy / 2, x1, y1, weight, arrowColor);
drawLine(x - dx / 2, y - dy / 2, x1, y1, weight, color);
final double theta = Math.atan2(-dy, dx);
@@ -210,14 +215,14 @@ public class WindFieldCanvasOverlay extends FullCanvasOverlay implements TimeLis
logger.finer("headlength: "+hLength+", arrowlength: "+length);
if (drawHead) {
drawHead(x1, y1, theta, hLength, weight);
drawHead(x1, y1, theta, hLength, weight, color);
}
//String text = "P" + index;// + NumberFormat.getFormat("0.00").format(windDTO.trueWindBearingDeg) + "°";
//drawPointWithText(x, y, text);
//drawPoint(x, y);
}
protected void drawHead(final double x, final double y, final double theta, final double headLength, final double weight) {
protected void drawHead(final double x, final double y, final double theta, final double headLength, final double weight, String color) {
double t = theta + (Math.PI / 4);
if (t > Math.PI) {
@@ -236,8 +241,8 @@ public class WindFieldCanvasOverlay extends FullCanvasOverlay implements TimeLis
final double y2 = (y + Math.sin(t2) * headLength);
final double x2o = (x + Math.cos(t2) * weight/2);
final double y2o = (y - Math.sin(t2) * weight/2);
drawLine(x1o, y1o, x1, y1, weight, arrowHeadColor);
drawLine(x2o, y2o, x2, y2, weight, arrowHeadColor);
drawLine(x1o, y1o, x1, y1, weight, color);
drawLine(x2o, y2o, x2, y2, weight, color);
}
@@ -151,7 +151,7 @@ public class PathGeneratorDynProgForward extends PathGeneratorBase {
// grid
// steps
// Formula: sgridh ~ xscale*sgridv/tan(beatangle*pi/180)
int spatialGridsizeHorizontal = 21*5; //(41-1)*5; //(int) Math.round(2 *
int spatialGridsizeHorizontal = 23*6; //(41-1)*5; //(int) Math.round(2 *
// simulationParameters.getProperty("Djikstra.gridh[int]").intValue()); // number
// of
// horizontal
@@ -149,7 +149,7 @@ public class PolarDiagramBase implements PolarDiagram {
NavigableMap<Double,Object> wcurSpeedMap = new TreeMap<Double,Object>();
for(double wcurSpeed=0.0; wcurSpeed<=2.0; wcurSpeed+=0.1) {
for(double wcurSpeed=0.0; wcurSpeed<=2.2; wcurSpeed+=0.1) {
NavigableMap<Double,Object> wcurBearMap = new TreeMap<Double,Object>();
@@ -264,13 +264,12 @@ public class PolarDiagramBase implements PolarDiagram {
@Override
public void setCurrent(SpeedWithBearing newCurrent) {
if ((newCurrent == null)&&(extTable == null)) {
extTable = this.extendSpeedMap();
}
current = newCurrent;
current = newCurrent;
}
@@ -332,7 +331,12 @@ public class PolarDiagramBase implements PolarDiagram {
@Override
public SpeedWithBearing getSpeedAtBearingOverGround(Bearing bearing) {
if (current == null) {
// TODO: check this new initialization, maybe keep previous current and reset current at end
/*if (extTable == null) {
extTable = this.extendSpeedMap();
}*/
if ((current == null)||(current.getKnots() == 0.0)) {
return getSpeedAtBearingRaw(bearing);
@@ -21,8 +21,10 @@ import java.util.logging.Logger;
import org.osgi.framework.FrameworkUtil;
import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl;
import com.sap.sailing.domain.base.impl.MeterDistance;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.simulator.Boundary;
import com.sap.sailing.simulator.Path;
import com.sap.sailing.simulator.PathGenerator;
@@ -126,9 +128,9 @@ public class SailingSimulatorImpl implements SailingSimulator {
logger.info("base wind: "+this.simulationParameters.getBoatPolarDiagram().getWind().getKnots()+" kn, "+((wf.getWindParameters().baseWindBearing)%360.0)+"°");
// set water current
// TODO: nicer initialize of polar diagram interpolate table
//this.simulationParameters.getBoatPolarDiagram().setCurrent(null); // initialize
//this.simulationParameters.getBoatPolarDiagram().setCurrent(new KnotSpeedWithBearingImpl(1.0,new DegreeBearingImpl((wf.getWindParameters().baseWindBearing+90.0)%360.0)));
this.simulationParameters.getBoatPolarDiagram().setCurrent(null); // initialize
//this.simulationParameters.getBoatPolarDiagram().setCurrent(new KnotSpeedWithBearingImpl(0.0,new DegreeBearingImpl((wf.getWindParameters().baseWindBearing+90.0)%360.0)));
this.simulationParameters.getBoatPolarDiagram().setCurrent(new KnotSpeedWithBearingImpl(wf.getWindParameters().curSpeed, new DegreeBearingImpl(wf.getWindParameters().curBearing)));
//this.simulationParameters.getBoatPolarDiagram().setCurrent(new KnotSpeedWithBearingImpl(2.0,new DegreeBearingImpl((270.0)%360.0)));
if (this.simulationParameters.getBoatPolarDiagram().getCurrent() != null) {
logger.info("water current: "+this.simulationParameters.getBoatPolarDiagram().getCurrent().getKnots()+" kn, "+this.simulationParameters.getBoatPolarDiagram().getCurrent().getBearing().getDegrees()+"°");
@@ -19,6 +19,17 @@ public class WindControlParameters implements Serializable {
* Value range 0 to 360 degrees
*/
public Double baseWindBearing;
/**
* Base wind speed in knots
* Value range 0 to 30
*/
public Double curSpeed;
/**
* Base average wind direction in degrees
* Value range 0 to 360 degrees
*/
public Double curBearing;
/**
* Oscillation parameter frequency
@@ -106,6 +117,9 @@ public class WindControlParameters implements Serializable {
baseWindSpeed = 12.0;
curSpeed = 0.0;
curBearing = 0.0;
baseWindBearing = 0.0;
frequency = 0.0; //30.0;
amplitude = 15.0;