From c845be7976a319f23de6e87f9045bfa4b0596ace Mon Sep 17 00:00:00 2001 From: hneemann Date: Sun, 18 Mar 2018 23:34:28 +0100 Subject: [PATCH] uses double dispatch for vector transformation --- .../digital/draw/graphics/Polygon.java | 2 +- .../digital/draw/graphics/Transform.java | 19 +++---------------- .../draw/graphics/TransformRotate.java | 2 +- .../draw/graphics/TransformTranslate.java | 2 +- .../neemann/digital/draw/graphics/Vector.java | 4 ++-- .../digital/draw/graphics/VectorFloat.java | 4 ++-- .../draw/graphics/VectorInterface.java | 8 ++++++-- 7 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/main/java/de/neemann/digital/draw/graphics/Polygon.java b/src/main/java/de/neemann/digital/draw/graphics/Polygon.java index fceccfe16..46bf0fd25 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/Polygon.java +++ b/src/main/java/de/neemann/digital/draw/graphics/Polygon.java @@ -200,7 +200,7 @@ public class Polygon implements Iterable { public Polygon transform(Transform transform) { Polygon p = new Polygon(closed); for (VectorInterface v : points) - p.add(transform.transform(v)); + p.add(v.transform(transform)); p.isBezierStart.addAll(isBezierStart); return p; } diff --git a/src/main/java/de/neemann/digital/draw/graphics/Transform.java b/src/main/java/de/neemann/digital/draw/graphics/Transform.java index 7164e0a3c..80ebf2990 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/Transform.java +++ b/src/main/java/de/neemann/digital/draw/graphics/Transform.java @@ -8,7 +8,7 @@ package de.neemann.digital.draw.graphics; /** * A simple transformation to a given vector */ -public abstract class Transform { +public interface Transform { /** * Transforms an integer vector @@ -16,7 +16,7 @@ public abstract class Transform { * @param v the vector to transform * @return the transformed vector */ - public abstract Vector transform(Vector v); + Vector transform(Vector v); /** * Transforms an float vector @@ -24,19 +24,6 @@ public abstract class Transform { * @param v the vector to transform * @return the transformed vector */ - public abstract VectorFloat transform(VectorFloat v); - - /** - * Transforms an vector interface - * - * @param v the vector to transform - * @return the transformed vector - */ - public VectorInterface transform(VectorInterface v) { - if (v instanceof Vector) - return transform((Vector) v); - else - return transform(v.getVectorFloat()); - } + VectorFloat transform(VectorFloat v); } diff --git a/src/main/java/de/neemann/digital/draw/graphics/TransformRotate.java b/src/main/java/de/neemann/digital/draw/graphics/TransformRotate.java index 9631cc44a..0a43cbf41 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/TransformRotate.java +++ b/src/main/java/de/neemann/digital/draw/graphics/TransformRotate.java @@ -8,7 +8,7 @@ package de.neemann.digital.draw.graphics; /** * Implements a rotation and translation. */ -public class TransformRotate extends Transform { +public class TransformRotate implements Transform { private final int sin; private final int cos; diff --git a/src/main/java/de/neemann/digital/draw/graphics/TransformTranslate.java b/src/main/java/de/neemann/digital/draw/graphics/TransformTranslate.java index bbeb61a31..68b4f3953 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/TransformTranslate.java +++ b/src/main/java/de/neemann/digital/draw/graphics/TransformTranslate.java @@ -8,7 +8,7 @@ package de.neemann.digital.draw.graphics; /** * A translation */ -public class TransformTranslate extends Transform { +public class TransformTranslate implements Transform { private final VectorInterface trans; /** diff --git a/src/main/java/de/neemann/digital/draw/graphics/Vector.java b/src/main/java/de/neemann/digital/draw/graphics/Vector.java index 7392b07e8..9c76303ad 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/Vector.java +++ b/src/main/java/de/neemann/digital/draw/graphics/Vector.java @@ -245,7 +245,7 @@ public class Vector implements VectorInterface { } @Override - public VectorFloat getVectorFloat() { - return new VectorFloat(x, y); + public VectorInterface transform(Transform tr) { + return tr.transform(this); } } diff --git a/src/main/java/de/neemann/digital/draw/graphics/VectorFloat.java b/src/main/java/de/neemann/digital/draw/graphics/VectorFloat.java index c5835af8d..8eb47ff66 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/VectorFloat.java +++ b/src/main/java/de/neemann/digital/draw/graphics/VectorFloat.java @@ -47,8 +47,8 @@ public class VectorFloat implements VectorInterface { } @Override - public VectorFloat getVectorFloat() { - return this; + public VectorInterface transform(Transform tr) { + return tr.transform(this); } /** diff --git a/src/main/java/de/neemann/digital/draw/graphics/VectorInterface.java b/src/main/java/de/neemann/digital/draw/graphics/VectorInterface.java index 3203caca3..86c31cbc0 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/VectorInterface.java +++ b/src/main/java/de/neemann/digital/draw/graphics/VectorInterface.java @@ -31,7 +31,11 @@ public interface VectorInterface { float getYFloat(); /** - * @return this vector as a {@link VectorFloat} instance + * Transforms the vector with the given transformation. + * + * @param tr the transformation to use + * @return the transformed vector */ - VectorFloat getVectorFloat(); + VectorInterface transform(Transform tr); + }