Reduce repeated argument scaling and add vector scaling to shapes

pull/35/head
James Ball 2020-10-28 17:05:15 +00:00
rodzic af70109e4f
commit 6c1a09fb3e
6 zmienionych plików z 36 dodań i 11 usunięć

Wyświetl plik

@ -205,13 +205,17 @@ public class SvgParser extends FileParser {
return shapes; return shapes;
} }
private Vector2 scaledArguments(float arg1, float arg2) {
return new Vector2(arg1 / width, arg2 / height);
}
// Parses moveto commands (M and m commands) // Parses moveto commands (M and m commands)
private List<? extends Shape> parseMoveTo(List<Float> args, boolean isAbsolute) { private List<? extends Shape> parseMoveTo(List<Float> args, boolean isAbsolute) {
if (args.size() % 2 != 0 || args.size() < 2) { if (args.size() % 2 != 0 || args.size() < 2) {
throw new IllegalArgumentException("SVG moveto command has incorrect number of arguments."); throw new IllegalArgumentException("SVG moveto command has incorrect number of arguments.");
} }
Vector2 vec = new Vector2(args.get(0) / width, args.get(1) / height); Vector2 vec = scaledArguments(args.get(0), args.get(1));
if (isAbsolute) { if (isAbsolute) {
currPoint = vec; currPoint = vec;
@ -259,9 +263,9 @@ public class SvgParser extends FileParser {
Vector2 newPoint; Vector2 newPoint;
if (expectedArgs == 1) { if (expectedArgs == 1) {
newPoint = new Vector2(args.get(i) / width, args.get(i) / height); newPoint = scaledArguments(args.get(i), args.get(i));
} else { } else {
newPoint = new Vector2(args.get(i) / width, args.get(i + 1) / height); newPoint = scaledArguments(args.get(i), args.get(i + 1));
} }
if (isHorizontal && !isVertical) { if (isHorizontal && !isVertical) {
@ -312,15 +316,14 @@ public class SvgParser extends FileParser {
: prevQuadraticControlPoint.reflectRelativeToVector(currPoint); : prevQuadraticControlPoint.reflectRelativeToVector(currPoint);
} }
} else { } else {
controlPoint1 = new Vector2(args.get(i) / width, args.get(i + 1) / height); controlPoint1 = scaledArguments(args.get(i), args.get(i + 1));
} }
if (isCubic) { if (isCubic) {
controlPoint2 = new Vector2(args.get(i + 2) / width, args.get(i + 3) / height); controlPoint2 = scaledArguments(args.get(i + 2), args.get(i + 3));
} }
Vector2 newPoint = new Vector2(args.get(i + expectedArgs - 2) / width, Vector2 newPoint = scaledArguments(args.get(i + expectedArgs - 2), args.get(i + expectedArgs - 1));
args.get(i + expectedArgs - 1) / height);
if (!isAbsolute) { if (!isAbsolute) {
controlPoint1 = currPoint.translate(controlPoint1); controlPoint1 = currPoint.translate(controlPoint1);

Wyświetl plik

@ -52,22 +52,27 @@ public class CubicBezierCurve extends Shape {
} }
@Override @Override
public Shape rotate(double theta) { public CubicBezierCurve rotate(double theta) {
return this; return this;
} }
@Override @Override
public Shape scale(double factor) { public CubicBezierCurve scale(double factor) {
return new CubicBezierCurve(p0, p1, p2, p3, weight, factor, translation); return new CubicBezierCurve(p0, p1, p2, p3, weight, factor, translation);
} }
@Override @Override
public Shape translate(Vector2 vector) { public CubicBezierCurve scale(Vector2 vector) {
return new CubicBezierCurve(p0.scale(vector), p1.scale(vector), p2.scale(vector), p3.scale(vector), weight, translation);
}
@Override
public CubicBezierCurve translate(Vector2 vector) {
return new CubicBezierCurve(p0, p1, p2, p3, weight, factor, translation.translate(vector)); return new CubicBezierCurve(p0, p1, p2, p3, weight, factor, translation.translate(vector));
} }
@Override @Override
public Shape setWeight(double weight) { public CubicBezierCurve setWeight(double weight) {
return new CubicBezierCurve(p0, p1, p2, p3, weight, factor, translation); return new CubicBezierCurve(p0, p1, p2, p3, weight, factor, translation);
} }
} }

Wyświetl plik

@ -53,6 +53,11 @@ public final class Ellipse extends Shape {
return new Ellipse(a * factor, b * factor, weight, rotation, position.scale(factor)); return new Ellipse(a * factor, b * factor, weight, rotation, position.scale(factor));
} }
@Override
public Ellipse scale(Vector2 vector) {
return new Ellipse(a * vector.getX(), b * vector.getY(), weight, rotation, position.scale(vector));
}
@Override @Override
public Ellipse translate(Vector2 vector) { public Ellipse translate(Vector2 vector) {
return new Ellipse(a, b, weight, rotation, position.translate(vector)); return new Ellipse(a, b, weight, rotation, position.translate(vector));

Wyświetl plik

@ -46,6 +46,11 @@ public final class Line extends Shape {
return new Line(a.scale(factor), b.scale(factor), weight); return new Line(a.scale(factor), b.scale(factor), weight);
} }
@Override
public Line scale(Vector2 vector) {
return new Line(a.scale(vector), b.scale(vector), weight);
}
public Line copy() { public Line copy() {
return new Line(a.copy(), b.copy(), weight); return new Line(a.copy(), b.copy(), weight);
} }

Wyświetl plik

@ -15,6 +15,8 @@ public abstract class Shape {
public abstract Shape scale(double factor); public abstract Shape scale(double factor);
public abstract Shape scale(Vector2 vector);
public abstract Shape translate(Vector2 vector); public abstract Shape translate(Vector2 vector);
public abstract Shape setWeight(double weight); public abstract Shape setWeight(double weight);

Wyświetl plik

@ -76,6 +76,11 @@ public final class Vector2 extends Shape {
return new Vector2(getX() * factor, getY() * factor); return new Vector2(getX() * factor, getY() * factor);
} }
@Override
public Vector2 scale(Vector2 vector) {
return new Vector2(getX() * vector.getX(), getY() * vector.getY());
}
@Override @Override
public Vector2 translate(Vector2 vector) { public Vector2 translate(Vector2 vector) {
return new Vector2(getX() + vector.getX(), getY() + vector.getY()); return new Vector2(getX() + vector.getX(), getY() + vector.getY());