From 8160440f2b0340d07d048b6130de4548e45110aa Mon Sep 17 00:00:00 2001 From: Nidhi Sawhney Date: Mon, 26 Nov 2012 17:36:06 +0100 Subject: [PATCH] Windlines now start and end at the edge. --- .../gwt/ui/server/SimulatorServiceImpl.java | 81 ++++++++++++------- .../sailing/gwt/ui/shared/PositionDTO.java | 7 +- .../ui/simulator/WindFieldCanvasOverlay.java | 4 + .../ui/simulator/WindLineCanvasOverlay.java | 10 ++- ...ailingServer (Proxy, Jetty on 8889).launch | 2 +- 5 files changed, 71 insertions(+), 33 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SimulatorServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SimulatorServiceImpl.java index cb0f6820a48..4ba486bca1a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SimulatorServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SimulatorServiceImpl.java @@ -335,10 +335,10 @@ public class SimulatorServiceImpl extends RemoteServiceServlet implements Simula return windFieldDTO; } - private void getWindLinesFromStartLine(final WindFieldGenerator wf, final WindFieldDTO windFieldDTO, final TimePoint startTime, + private void getWindLinesFromStartLine(final WindFieldGenerator wf, WindFieldDTO windFieldDTO, final TimePoint startTime, final TimePoint endTime, final TimePoint timeStep) { - final Position[][] positionGrid = wf.getPositionGrid(); + Position[][] positionGrid = wf.getPositionGrid(); WindLinesDTO windLinesDTO = windFieldDTO.getWindLinesDTO(); if (windLinesDTO == null) { windLinesDTO = new WindLinesDTO(); @@ -346,23 +346,36 @@ public class SimulatorServiceImpl extends RemoteServiceServlet implements Simula } if (positionGrid != null && positionGrid.length > 0 && positionGrid[0].length > 2) { for (int j = 1; j < positionGrid[0].length - 1; ++j) { - // for (int j = 0; j < positionGrid[0].length; ++j) { + TimePoint t = startTime; - final PositionDTO startPosition = new PositionDTO(positionGrid[0][j].getLatDeg(), - positionGrid[0][j].getLngDeg()); + Position seed = positionGrid[0][j]; + PositionDTO startPosition = new PositionDTO(seed.getLatDeg(), + seed.getLngDeg()); while (t.compareTo(endTime) <= 0) { - final TimedPosition tp = new TimedPositionImpl(t, positionGrid[0][j]); - final Path p = wf.getLine(tp, false /*forward*/); - if (p != null) { - final List positions = new ArrayList(); - for (final TimedPositionWithSpeed pathPoint : p.getPathPoints()) { - final Position position = pathPoint.getPosition(); - final PositionDTO positionDTO = new PositionDTO(position.getLatDeg(), position.getLngDeg()); + + TimedPosition tp = new TimedPositionImpl(t, seed); + List positions = new ArrayList(); + // Get the wind "before" the seed to cover the grid + Path p = wf.getLine(tp, true /*forward*/); + if (p != null) { + for (TimedPositionWithSpeed pathPoint : p.getPathPoints()) { + Position position = pathPoint.getPosition(); + if (!position.equals(seed)) { //Seed is added in the next loop + PositionDTO positionDTO = new PositionDTO(position.getLatDeg(), position.getLngDeg()); + positions.add(positionDTO); + } + } + } + //Get the wind "after" the seed + p = wf.getLine(tp, false /*forward*/); + if (p != null) { + for (TimedPositionWithSpeed pathPoint : p.getPathPoints()) { + Position position = pathPoint.getPosition(); + PositionDTO positionDTO = new PositionDTO(position.getLatDeg(), position.getLngDeg()); positions.add(positionDTO); } - - windLinesDTO.addWindLine(startPosition, tp.getTimePoint().asMillis(), positions); } + windLinesDTO.addWindLine(startPosition, tp.getTimePoint().asMillis(), positions); t = new MillisecondsTimePoint(t.asMillis() + timeStep.asMillis()); } } @@ -372,35 +385,47 @@ public class SimulatorServiceImpl extends RemoteServiceServlet implements Simula //logger.info("Added : " + windFieldDTO.getWindLinesDTO().getWindLinesMap().size() + " wind lines"); } - private void getWindLinesFromEndLine(final WindFieldGenerator wf, final WindFieldDTO windFieldDTO, final TimePoint startTime, + private void getWindLinesFromEndLine(final WindFieldGenerator wf, WindFieldDTO windFieldDTO, final TimePoint startTime, final TimePoint endTime, final TimePoint timeStep) { - final Position[][] positionGrid = wf.getPositionGrid(); + Position[][] positionGrid = wf.getPositionGrid(); WindLinesDTO windLinesDTO = windFieldDTO.getWindLinesDTO(); if (windLinesDTO == null) { windLinesDTO = new WindLinesDTO(); windFieldDTO.setWindLinesDTO(windLinesDTO); } if (positionGrid != null && positionGrid.length > 1 && positionGrid[0].length > 2) { - final int lastRowIndex = positionGrid.length - 1; + int lastRowIndex = positionGrid.length - 1; for (int j = 1; j < positionGrid[lastRowIndex].length - 1; ++j) { TimePoint t = startTime; - final PositionDTO startPosition = new PositionDTO(positionGrid[lastRowIndex][j].getLatDeg(), - positionGrid[lastRowIndex][j].getLngDeg()); + Position seed = positionGrid[lastRowIndex][j]; + PositionDTO startPosition = new PositionDTO(seed.getLatDeg(), + seed.getLngDeg()); while (t.compareTo(endTime) <= 0) { - final TimedPosition tp = new TimedPositionImpl(t, positionGrid[lastRowIndex][j]); - final Path p = wf.getLine(tp, true /*forward*/); - if (p != null) { - final List positions = new ArrayList(); - for (final TimedPositionWithSpeed pathPoint : p.getPathPoints()) { - final Position position = pathPoint.getPosition(); - final PositionDTO positionDTO = new PositionDTO(position.getLatDeg(), position.getLngDeg()); + TimedPosition tp = new TimedPositionImpl(t, seed); + List positions = new ArrayList(); + //Get the wind before the seed + Path p = wf.getLine(tp, false /*forward*/); + if (p != null) { + for (TimedPositionWithSpeed pathPoint : p.getPathPoints()) { + Position position = pathPoint.getPosition(); + if (!position.equals(seed)) { // seed will be added later in the next loop + PositionDTO positionDTO = new PositionDTO(position.getLatDeg(), position.getLngDeg()); + positions.add(positionDTO); + } + } + + } + p = wf.getLine(tp, true /*forward*/); + if (p != null) { + for (TimedPositionWithSpeed pathPoint : p.getPathPoints()) { + Position position = pathPoint.getPosition(); + PositionDTO positionDTO = new PositionDTO(position.getLatDeg(), position.getLngDeg()); positions.add(positionDTO); } - - windLinesDTO.addWindLine(startPosition, tp.getTimePoint().asMillis(), positions); } + windLinesDTO.addWindLine(startPosition, tp.getTimePoint().asMillis(), positions); t = new MillisecondsTimePoint(t.asMillis() + timeStep.asMillis()); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/PositionDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/PositionDTO.java index 556ab948d8d..ac2fa0b8926 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/PositionDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/PositionDTO.java @@ -42,8 +42,11 @@ public class PositionDTO implements IsSerializable { if (o == null) { return false; } else { - return o instanceof PositionDTO && this.latDeg == ((PositionDTO) o).latDeg - && this.lngDeg == ((PositionDTO) o).lngDeg; + if (o instanceof PositionDTO) { + PositionDTO other = (PositionDTO) o; + return Math.abs(this.latDeg-other.latDeg) <= 1e-5 && Math.abs(this.lngDeg-other.lngDeg) <= 1e-5; + } + return false; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/WindFieldCanvasOverlay.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/WindFieldCanvasOverlay.java index 18156242446..cd38efd0cd6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/WindFieldCanvasOverlay.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/WindFieldCanvasOverlay.java @@ -11,6 +11,7 @@ import java.util.SortedMap; import java.util.TreeMap; import java.util.logging.Logger; +import com.google.gwt.canvas.dom.client.Context2d; import com.google.gwt.maps.client.MapWidget; import com.google.gwt.maps.client.geom.LatLng; import com.google.gwt.maps.client.geom.Point; @@ -161,6 +162,9 @@ public class WindFieldCanvasOverlay extends FullCanvasOverlay implements TimeLis protected void drawWindField(final List windDTOList) { clear(); + Context2d context2d = canvas.getContext2d(); + context2d.setGlobalAlpha(0.4); + if (windDTOList != null && windDTOList.size() > 0) { Iterator windDTOIter = windDTOList.iterator(); int index = 0; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/WindLineCanvasOverlay.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/WindLineCanvasOverlay.java index d8a99d9ae94..d7a3ef85666 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/WindLineCanvasOverlay.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/WindLineCanvasOverlay.java @@ -172,12 +172,18 @@ public class WindLineCanvasOverlay extends FullCanvasOverlay implements TimeList while (positionDTOIter.hasNext()) { PositionDTO positionDTO = positionDTOIter.next(); if (prevPositionDTO != null) { - if (checkPointInGrid(prevPositionDTO) && checkPointInGrid(positionDTO) ) { + boolean previousPointInGrid = checkPointInGrid(prevPositionDTO); + boolean currentPointInGrid = checkPointInGrid(positionDTO); + if (previousPointInGrid && currentPointInGrid) { drawLine(prevPositionDTO, positionDTO); } else { PositionDTO pointOnBoundary = getPointOnBoundary(prevPositionDTO, positionDTO); if (pointOnBoundary != null) { - drawLine(prevPositionDTO, pointOnBoundary); + if (previousPointInGrid) { + drawLine(prevPositionDTO, pointOnBoundary); + } else if (currentPointInGrid) { + drawLine(pointOnBoundary, positionDTO); + } } } } diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch index cb40a86b677..1f6298a0236 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch @@ -25,6 +25,6 @@ - +