mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-05 20:03:52 +00:00
pass scale to each and every operation of ImageTransformer to avoid confusion about its internal state
This commit is contained in:
1 parent
1f799dd70e
commit
6a5921717b
3 files changed
+52
-50
No files matched your search
+19
-14
@@ -16,7 +16,7 @@ import com.google.gwt.user.client.ui.Image;
|
||||
* @author Axel Uhl (d043530)
|
||||
*
|
||||
*/
|
||||
public class ImageTransformator {
|
||||
public class ImageTransformer {
|
||||
private final String untransformedImageURL;
|
||||
private final Canvas canvas;
|
||||
private final int imageWidth;
|
||||
@@ -25,16 +25,18 @@ public class ImageTransformator {
|
||||
private int canvasWidth;
|
||||
private int canvasHeight;
|
||||
|
||||
private double currentScale;
|
||||
|
||||
private ImageElement imageElement;
|
||||
|
||||
private Context2d context;
|
||||
|
||||
public ImageTransformator(ImageResource untransformedImage) {
|
||||
public ImageTransformer(ImageResource untransformedImage) {
|
||||
this.untransformedImageURL = untransformedImage.getSafeUri().asString();
|
||||
canvas = Canvas.createIfSupported();
|
||||
imageWidth = untransformedImage.getWidth();
|
||||
imageHeight = untransformedImage.getHeight();
|
||||
calculateCanvasSize(1.0);
|
||||
scale(1.0);
|
||||
final Image image = new Image(untransformedImageURL.toString());
|
||||
imageElement = (ImageElement) image.getElement().cast();
|
||||
if (imageElement == null) {
|
||||
@@ -47,18 +49,21 @@ public class ImageTransformator {
|
||||
}
|
||||
}
|
||||
|
||||
private void calculateCanvasSize(double scaleFactor)
|
||||
{
|
||||
canvasWidth = (int) Math.round(imageWidth * scaleFactor);
|
||||
canvasHeight = (int) Math.round(imageHeight * scaleFactor);
|
||||
canvasRadius = (int) Math.sqrt(canvasWidth*canvasWidth/4 + canvasHeight*canvasHeight/4);
|
||||
canvas.setSize(""+2*canvasRadius+"px", ""+2*canvasRadius+"px");
|
||||
canvas.setCoordinateSpaceWidth(2*canvasRadius);
|
||||
canvas.setCoordinateSpaceHeight(2*canvasRadius);
|
||||
context = canvas.getContext2d();
|
||||
private void scale(double scaleFactor) {
|
||||
if (scaleFactor != currentScale) {
|
||||
canvasWidth = (int) Math.round(imageWidth * scaleFactor);
|
||||
canvasHeight = (int) Math.round(imageHeight * scaleFactor);
|
||||
canvasRadius = (int) Math.sqrt(canvasWidth * canvasWidth / 4 + canvasHeight * canvasHeight / 4);
|
||||
canvas.setSize("" + 2 * canvasRadius + "px", "" + 2 * canvasRadius + "px");
|
||||
canvas.setCoordinateSpaceWidth(2 * canvasRadius);
|
||||
canvas.setCoordinateSpaceHeight(2 * canvasRadius);
|
||||
context = canvas.getContext2d();
|
||||
currentScale = scaleFactor;
|
||||
}
|
||||
}
|
||||
|
||||
public Point getAnchor() {
|
||||
public Point getAnchor(double scaleFactor) {
|
||||
scale(scaleFactor);
|
||||
return Point.newInstance(canvasRadius, canvasRadius);
|
||||
}
|
||||
|
||||
@@ -74,8 +79,8 @@ public class ImageTransformator {
|
||||
String result = getUntransformedImageURL();
|
||||
if (canvas != null) {
|
||||
if (imageElement != null) {
|
||||
scale(scaleFactor);
|
||||
double angleInRadians = angleInDegrees/180.*Math.PI;
|
||||
calculateCanvasSize(scaleFactor);
|
||||
context.clearRect(0, 0, 2*canvasRadius, 2*canvasRadius);
|
||||
context.save();
|
||||
context.translate(canvasRadius, canvasRadius);
|
||||
+3
-2
@@ -540,8 +540,9 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener,
|
||||
} else {
|
||||
usedExistingMarker = true;
|
||||
// check if anchors match; re-use marker with setImage only if anchors match
|
||||
Point newAnchor = imageResources.getBoatImageTransformator(lastPos,
|
||||
selectedMapCompetitors.contains(competitorDAO)).getAnchor();
|
||||
ImageTransformer transformer = imageResources.getBoatImageTransformer(lastPos,
|
||||
selectedMapCompetitors.contains(competitorDAO));
|
||||
Point newAnchor = transformer.getAnchor(imageResources.getRealBoatSizeScaleFactor());
|
||||
Point oldAnchor = boatMarker.getIcon().getIconAnchor();
|
||||
if (oldAnchor.getX() == newAnchor.getX() && oldAnchor.getY() == newAnchor.getY()) {
|
||||
boatMarker.setLatLng(LatLng.newInstance(lastPos.position.latDeg,
|
||||
|
||||
+30
-34
@@ -17,42 +17,42 @@ public class RaceMapResources {
|
||||
/**
|
||||
* Two sails on downwind leg, wind from port (sails on starboard); no highlighting
|
||||
*/
|
||||
protected ImageTransformator boatIconDownwindPortRotator;
|
||||
protected ImageTransformer boatIconDownwindPortRotator;
|
||||
|
||||
/**
|
||||
* Two sails on downwind leg, wind from port (sails on starboard); with highlighting
|
||||
*/
|
||||
protected ImageTransformator boatIconHighlightedDownwindPortRotator;
|
||||
protected ImageTransformer boatIconHighlightedDownwindPortRotator;
|
||||
|
||||
/**
|
||||
* Two sails on downwind leg, wind from starboard (sails on port); no highlighting
|
||||
*/
|
||||
protected ImageTransformator boatIconDownwindStarboardRotator;
|
||||
protected ImageTransformer boatIconDownwindStarboardRotator;
|
||||
|
||||
/**
|
||||
* Two sails on downwind leg, wind from starboard (sails on port); with highlighting
|
||||
*/
|
||||
protected ImageTransformator boatIconHighlightedDownwindStarboardRotator;
|
||||
protected ImageTransformer boatIconHighlightedDownwindStarboardRotator;
|
||||
|
||||
/**
|
||||
* One sail, wind from port (sails on starboard); no highlighting
|
||||
*/
|
||||
protected ImageTransformator boatIconPortRotator;
|
||||
protected ImageTransformer boatIconPortRotator;
|
||||
|
||||
/**
|
||||
* One sail, wind from port (sails on starboard); with highlighting
|
||||
*/
|
||||
protected ImageTransformator boatIconHighlightedPortRotator;
|
||||
protected ImageTransformer boatIconHighlightedPortRotator;
|
||||
|
||||
/**
|
||||
* One sail, wind from starboard (sails on port); no highlighting
|
||||
*/
|
||||
protected ImageTransformator boatIconStarboardRotator;
|
||||
protected ImageTransformer boatIconStarboardRotator;
|
||||
|
||||
/**
|
||||
* One sail, wind from starboard (sails on port); with highlighting
|
||||
*/
|
||||
protected ImageTransformator boatIconHighlightedStarboardRotator;
|
||||
protected ImageTransformer boatIconHighlightedStarboardRotator;
|
||||
|
||||
protected Icon buoyIcon;
|
||||
protected Icon tackToStarboardIcon;
|
||||
@@ -75,15 +75,15 @@ public class RaceMapResources {
|
||||
{
|
||||
this.map = map;
|
||||
|
||||
boatIconDownwindPortRotator = new ImageTransformator(resources.lowlightedBoatIconDW_Port());
|
||||
boatIconHighlightedDownwindPortRotator = new ImageTransformator(resources.highlightedBoatIconDW_Port());
|
||||
boatIconDownwindStarboardRotator = new ImageTransformator(resources.lowlightedBoatIconDW_Starboard());
|
||||
boatIconHighlightedDownwindStarboardRotator = new ImageTransformator(resources
|
||||
boatIconDownwindPortRotator = new ImageTransformer(resources.lowlightedBoatIconDW_Port());
|
||||
boatIconHighlightedDownwindPortRotator = new ImageTransformer(resources.highlightedBoatIconDW_Port());
|
||||
boatIconDownwindStarboardRotator = new ImageTransformer(resources.lowlightedBoatIconDW_Starboard());
|
||||
boatIconHighlightedDownwindStarboardRotator = new ImageTransformer(resources
|
||||
.highlightedBoatIconDW_Starboard());
|
||||
boatIconPortRotator = new ImageTransformator(resources.lowlightedBoatIcon_Port());
|
||||
boatIconHighlightedPortRotator = new ImageTransformator(resources.highlightedBoatIcon_Port());
|
||||
boatIconStarboardRotator = new ImageTransformator(resources.lowlightedBoatIcon_Starboard());
|
||||
boatIconHighlightedStarboardRotator = new ImageTransformator(resources.highlightedBoatIcon_Starboard());
|
||||
boatIconPortRotator = new ImageTransformer(resources.lowlightedBoatIcon_Port());
|
||||
boatIconHighlightedPortRotator = new ImageTransformer(resources.highlightedBoatIcon_Port());
|
||||
boatIconStarboardRotator = new ImageTransformer(resources.lowlightedBoatIcon_Starboard());
|
||||
boatIconHighlightedStarboardRotator = new ImageTransformer(resources.highlightedBoatIcon_Starboard());
|
||||
buoyIcon = Icon.newInstance(resources.buoyIcon().getSafeUri().asString());
|
||||
buoyIcon.setIconAnchor(Point.newInstance(4, 4));
|
||||
tackToStarboardIcon = Icon
|
||||
@@ -127,7 +127,7 @@ public class RaceMapResources {
|
||||
penaltyCircleToPortIcon.setIconAnchor(Point.newInstance(10, 33));
|
||||
}
|
||||
|
||||
public ImageTransformator getBoatImageTransformator(GPSFixDAO boatFix, boolean highlighted) {
|
||||
public ImageTransformer getBoatImageTransformer(GPSFixDAO boatFix, boolean highlighted) {
|
||||
if (boatFix.tack == Tack.PORT) {
|
||||
if (LegType.DOWNWIND == boatFix.legType) {
|
||||
if (highlighted) {
|
||||
@@ -160,45 +160,41 @@ public class RaceMapResources {
|
||||
}
|
||||
|
||||
public String getBoatImageURL(GPSFixDAO boatFix, boolean highlighted) {
|
||||
return getBoatImageURL(getBoatImageTransformator(boatFix, highlighted), boatFix);
|
||||
return getBoatImageURL(getBoatImageTransformer(boatFix, highlighted), boatFix);
|
||||
}
|
||||
|
||||
public String getBoatImageURL(ImageTransformator boatImageTransformator, GPSFixDAO boatFix) {
|
||||
public String getBoatImageURL(ImageTransformer boatImageTransformer, GPSFixDAO boatFix) {
|
||||
double realBoatSizeScaleFactor = getRealBoatSizeScaleFactor();
|
||||
return boatImageTransformer.getTransformedImageURL(boatFix.speedWithBearing.bearingInDegrees, realBoatSizeScaleFactor);
|
||||
}
|
||||
|
||||
public double getRealBoatSizeScaleFactor() {
|
||||
// the possible zoom level range is 0 to 21 (zoom level 0 would show the whole world)
|
||||
int zoomLevel = map.getZoomLevel();
|
||||
double minScaleFactor = 0.33;
|
||||
double realBoatSizeScaleFactor = minScaleFactor;
|
||||
double boatLengthInMeter = 5.0;
|
||||
|
||||
if(zoomLevel > 5) {
|
||||
int boatSizeXInPixel = 41;
|
||||
// int boatSizeYInPixel = 21;
|
||||
|
||||
LatLngBounds bounds = map.getBounds();
|
||||
LatLng upperRight = bounds.getNorthEast();
|
||||
LatLng bottomLeft = bounds.getSouthWest();
|
||||
LatLng upperLeft = LatLng.newInstance(upperRight.getLatitude(), bottomLeft.getLongitude());
|
||||
|
||||
double distXInMeters = upperLeft.distanceFrom(upperRight);
|
||||
// double distYInMeters = upperLeft.distanceFrom(bottomLeft);
|
||||
|
||||
int widthInPixel = map.getSize().getWidth();
|
||||
// int heightInPixel = map.getSize().getHeight();
|
||||
|
||||
double realBoatSizeInPixel = (widthInPixel * boatLengthInMeter) / distXInMeters;
|
||||
realBoatSizeScaleFactor = realBoatSizeInPixel / (double) boatSizeXInPixel;
|
||||
|
||||
if(realBoatSizeScaleFactor < minScaleFactor)
|
||||
if(realBoatSizeScaleFactor < minScaleFactor) {
|
||||
realBoatSizeScaleFactor = minScaleFactor;
|
||||
}
|
||||
}
|
||||
|
||||
return boatImageTransformator.getTransformedImageURL(boatFix.speedWithBearing.bearingInDegrees, realBoatSizeScaleFactor);
|
||||
return realBoatSizeScaleFactor;
|
||||
}
|
||||
|
||||
public Icon getBoatImageIcon(GPSFixDAO boatFix, boolean highlighted) {
|
||||
ImageTransformator boatImageTransformator = getBoatImageTransformator(boatFix, highlighted);
|
||||
Icon icon = Icon.newInstance(getBoatImageURL(boatImageTransformator, boatFix));
|
||||
icon.setIconAnchor(boatImageTransformator.getAnchor());
|
||||
ImageTransformer boatImageTransformer = getBoatImageTransformer(boatFix, highlighted);
|
||||
Icon icon = Icon.newInstance(getBoatImageURL(boatImageTransformer, boatFix));
|
||||
icon.setIconAnchor(boatImageTransformer.getAnchor(getRealBoatSizeScaleFactor()));
|
||||
return icon;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user