package physics2D; public class Vector2D implements Cloneable { protected double xComponent; protected double yComponent; protected double magnitude; protected double angle; public Vector2D(double magnitude, double angle) { this.magnitude = magnitude; this.angle = angle % (2 * Math.PI); xComponent = Math.sin(angle) * magnitude; yComponent = Math.cos(angle) * magnitude; } public Vector2D(double xComponent, double yComponent, boolean components) { this.xComponent = xComponent; this.yComponent = yComponent; magnitude = Math.sqrt(Math.pow(xComponent, 2) + Math.pow(yComponent, 2)); angle = Math.atan2(xComponent, yComponent); } public Vector2D() { this(0,0); } public double getMagnitude() { return magnitude; } public double getAngle() { return angle; } public double getXComponent() { return xComponent; } public double getYComponent() { return yComponent; } public Vector2D add(Vector2D v) { Vector2D n = (Vector2D) this.clone(); n.xComponent += v.xComponent; n.yComponent += v.yComponent; n.magnitude = Math.sqrt(Math.pow(n.xComponent, 2) + Math.pow(n.yComponent, 2)); n.angle = Math.atan2(n.xComponent, n.yComponent); return n; } public Vector2D subtract(Vector2D v) { return add(v.multiply(-1)); } public Vector2D multiply(double d) { Vector2D n = (Vector2D) this.clone(); n.xComponent *= d; n.yComponent *= d; n.magnitude *= d; if (d < 0) { magnitude *= -1; n.angle = (n.angle + Math.PI) % (2 * Math.PI); } return n; } public Vector2D divide(double d) { return multiply(1/d); } public Vector2D rotate(double d) { return new Vector2D(magnitude, angle + d); } protected Vector2D(double magnitude, double angle, double xComponent, double yComponent) { this.magnitude = magnitude; this.angle = angle; this.xComponent = xComponent; this.yComponent = yComponent; } public Object clone() { return new Vector2D(magnitude, angle, xComponent, yComponent); } }