summaryrefslogtreecommitdiff
path: root/CSMath
diff options
context:
space:
mode:
Diffstat (limited to 'CSMath')
-rw-r--r--CSMath/src/bezier/BezierPanel.java8
-rw-r--r--CSMath/src/bezier/geom/Bezier.java4
-rw-r--r--CSMath/src/bezier/geom/transform/TDHCombination.java (renamed from CSMath/src/bezier/transforms/TDHCombination.java)2
-rw-r--r--CSMath/src/bezier/geom/transform/TDHIdentity.java (renamed from CSMath/src/bezier/transforms/TDHIdentity.java)2
-rw-r--r--CSMath/src/bezier/geom/transform/TDHLineReflection.java (renamed from CSMath/src/bezier/transforms/TDHLineReflection.java)2
-rw-r--r--CSMath/src/bezier/geom/transform/TDHMatrixTransform.java (renamed from CSMath/src/bezier/transforms/TDHMatrixTransform.java)2
-rw-r--r--CSMath/src/bezier/geom/transform/TDHPointRotation.java (renamed from CSMath/src/bezier/transforms/TDHPointRotation.java)2
-rw-r--r--CSMath/src/bezier/geom/transform/TDHRotation.java (renamed from CSMath/src/bezier/transforms/TDHRotation.java)2
-rw-r--r--CSMath/src/bezier/geom/transform/TDHScale.java (renamed from CSMath/src/bezier/transforms/TDHScale.java)2
-rw-r--r--CSMath/src/bezier/geom/transform/TDHShear.java (renamed from CSMath/src/bezier/transforms/TDHShear.java)2
-rw-r--r--CSMath/src/bezier/geom/transform/TDHTransform.java (renamed from CSMath/src/bezier/transforms/TDHTransform.java)2
-rw-r--r--CSMath/src/bezier/geom/transform/TDHTransformType.java (renamed from CSMath/src/bezier/transforms/TDHTransformType.java)2
-rw-r--r--CSMath/src/bezier/geom/transform/TDHTranslate.java (renamed from CSMath/src/bezier/transforms/TDHTranslate.java)2
-rw-r--r--CSMath/src/bezier/geom/transform/TDHXAxisReflection.java (renamed from CSMath/src/bezier/transforms/TDHXAxisReflection.java)2
-rw-r--r--CSMath/src/bezier/geom/transform/TDHYAxisReflection.java (renamed from CSMath/src/bezier/transforms/TDHYAxisReflection.java)2
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHCombination.java64
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHIdentity.java21
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHLineReflection.java68
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHMatrixTransform.java32
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHPointRotation.java67
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHRotation.java57
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHScale.java124
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHShear.java59
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHTransform.java54
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHTransformType.java42
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHTranslate.java89
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHXAxisReflection.java20
-rw-r--r--CSMath/src/bezier/transforms/geom/TDHYAxisReflection.java20
-rw-r--r--CSMath/src/bisection/DualExpr.java11
29 files changed, 741 insertions, 25 deletions
diff --git a/CSMath/src/bezier/BezierPanel.java b/CSMath/src/bezier/BezierPanel.java
index dfde4c8..529612a 100644
--- a/CSMath/src/bezier/BezierPanel.java
+++ b/CSMath/src/bezier/BezierPanel.java
@@ -12,10 +12,10 @@ import javax.swing.border.BevelBorder;
import bezier.geom.Bezier;
import bezier.geom.TDHPoint;
import bezier.geom.TDPoint;
-import bezier.transforms.TDHCombination;
-import bezier.transforms.TDHTransform;
-import bezier.transforms.TDHTranslate;
-import bezier.transforms.TDHXAxisReflection;
+import bezier.geom.transform.TDHCombination;
+import bezier.geom.transform.TDHTransform;
+import bezier.geom.transform.TDHTranslate;
+import bezier.geom.transform.TDHXAxisReflection;
/*
* Panel that graphs a set of bezier curves.
diff --git a/CSMath/src/bezier/geom/Bezier.java b/CSMath/src/bezier/geom/Bezier.java
index 46f1476..dbc6a12 100644
--- a/CSMath/src/bezier/geom/Bezier.java
+++ b/CSMath/src/bezier/geom/Bezier.java
@@ -3,8 +3,8 @@ package bezier.geom;
import java.util.ArrayList;
import java.util.List;
-import bezier.transforms.TDHIdentity;
-import bezier.transforms.TDHTransform;
+import bezier.geom.transform.TDHIdentity;
+import bezier.geom.transform.TDHTransform;
/**
* Represents a bezier curve.
diff --git a/CSMath/src/bezier/transforms/TDHCombination.java b/CSMath/src/bezier/geom/transform/TDHCombination.java
index 83b3858..27d71e7 100644
--- a/CSMath/src/bezier/transforms/TDHCombination.java
+++ b/CSMath/src/bezier/geom/transform/TDHCombination.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
import java.util.ArrayList;
import java.util.List;
diff --git a/CSMath/src/bezier/transforms/TDHIdentity.java b/CSMath/src/bezier/geom/transform/TDHIdentity.java
index d1b55d0..b1b61e6 100644
--- a/CSMath/src/bezier/transforms/TDHIdentity.java
+++ b/CSMath/src/bezier/geom/transform/TDHIdentity.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
import bezier.geom.TDHPoint;
diff --git a/CSMath/src/bezier/transforms/TDHLineReflection.java b/CSMath/src/bezier/geom/transform/TDHLineReflection.java
index db50fd5..0158d60 100644
--- a/CSMath/src/bezier/transforms/TDHLineReflection.java
+++ b/CSMath/src/bezier/geom/transform/TDHLineReflection.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
import bezier.geom.TDHPoint;
diff --git a/CSMath/src/bezier/transforms/TDHMatrixTransform.java b/CSMath/src/bezier/geom/transform/TDHMatrixTransform.java
index 6cfc3cc..5014d1f 100644
--- a/CSMath/src/bezier/transforms/TDHMatrixTransform.java
+++ b/CSMath/src/bezier/geom/transform/TDHMatrixTransform.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
import bezier.geom.Matrix;
import bezier.geom.TDHPoint;
diff --git a/CSMath/src/bezier/transforms/TDHPointRotation.java b/CSMath/src/bezier/geom/transform/TDHPointRotation.java
index 5b8736c..a207612 100644
--- a/CSMath/src/bezier/transforms/TDHPointRotation.java
+++ b/CSMath/src/bezier/geom/transform/TDHPointRotation.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
import bezier.geom.TDHPoint;
diff --git a/CSMath/src/bezier/transforms/TDHRotation.java b/CSMath/src/bezier/geom/transform/TDHRotation.java
index 64a6c2c..a8c4cd6 100644
--- a/CSMath/src/bezier/transforms/TDHRotation.java
+++ b/CSMath/src/bezier/geom/transform/TDHRotation.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
import bezier.geom.TDHPoint;
diff --git a/CSMath/src/bezier/transforms/TDHScale.java b/CSMath/src/bezier/geom/transform/TDHScale.java
index 5cfd300..83c7a63 100644
--- a/CSMath/src/bezier/transforms/TDHScale.java
+++ b/CSMath/src/bezier/geom/transform/TDHScale.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
import bezier.geom.TDHPoint;
diff --git a/CSMath/src/bezier/transforms/TDHShear.java b/CSMath/src/bezier/geom/transform/TDHShear.java
index 7dbb4c5..f099e74 100644
--- a/CSMath/src/bezier/transforms/TDHShear.java
+++ b/CSMath/src/bezier/geom/transform/TDHShear.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
import bezier.geom.TDHPoint;
diff --git a/CSMath/src/bezier/transforms/TDHTransform.java b/CSMath/src/bezier/geom/transform/TDHTransform.java
index 3b8c52e..cd35caf 100644
--- a/CSMath/src/bezier/transforms/TDHTransform.java
+++ b/CSMath/src/bezier/geom/transform/TDHTransform.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
import bezier.geom.TDHPoint;
diff --git a/CSMath/src/bezier/transforms/TDHTransformType.java b/CSMath/src/bezier/geom/transform/TDHTransformType.java
index e64c13d..6ffa67d 100644
--- a/CSMath/src/bezier/transforms/TDHTransformType.java
+++ b/CSMath/src/bezier/geom/transform/TDHTransformType.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
/**
* Types of transform to apply to TDHPoints.
diff --git a/CSMath/src/bezier/transforms/TDHTranslate.java b/CSMath/src/bezier/geom/transform/TDHTranslate.java
index 3d2afe9..1114c5e 100644
--- a/CSMath/src/bezier/transforms/TDHTranslate.java
+++ b/CSMath/src/bezier/geom/transform/TDHTranslate.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
import bezier.geom.TDHPoint;
diff --git a/CSMath/src/bezier/transforms/TDHXAxisReflection.java b/CSMath/src/bezier/geom/transform/TDHXAxisReflection.java
index 1969b9c..21af1a8 100644
--- a/CSMath/src/bezier/transforms/TDHXAxisReflection.java
+++ b/CSMath/src/bezier/geom/transform/TDHXAxisReflection.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
import bezier.geom.TDHPoint;
diff --git a/CSMath/src/bezier/transforms/TDHYAxisReflection.java b/CSMath/src/bezier/geom/transform/TDHYAxisReflection.java
index eb462ba..c4ada7f 100644
--- a/CSMath/src/bezier/transforms/TDHYAxisReflection.java
+++ b/CSMath/src/bezier/geom/transform/TDHYAxisReflection.java
@@ -1,4 +1,4 @@
-package bezier.transforms;
+package bezier.geom.transform;
import bezier.geom.TDHPoint;
diff --git a/CSMath/src/bezier/transforms/geom/TDHCombination.java b/CSMath/src/bezier/transforms/geom/TDHCombination.java
new file mode 100644
index 0000000..22a0b40
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHCombination.java
@@ -0,0 +1,64 @@
+package bezier.transforms.geom;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import bezier.geom.TDHPoint;
+
+public class TDHCombination implements TDHTransform {
+ public final List<TDHTransform> forms;
+
+ @Override
+ public TDHTransformType type() {
+ return TDHTransformType.COMBINATION;
+ }
+
+ public TDHCombination(TDHTransform... forms) {
+ this.forms = new ArrayList<>(forms.length);
+
+ for (TDHTransform form : forms) {
+ this.forms.add(form);
+ }
+ }
+
+ @Override
+ public TDHPoint transform(TDHPoint punkt) {
+ TDHPoint ret = punkt;
+
+ for (TDHTransform form : forms) {
+ ret = form.transform(ret);
+ }
+
+ return ret;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((forms == null) ? 0 : forms.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TDHCombination other = (TDHCombination) obj;
+ if (forms == null) {
+ if (other.forms != null)
+ return false;
+ } else if (!forms.equals(other.forms))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "TDHCombination [forms=" + forms + "]";
+ }
+} \ No newline at end of file
diff --git a/CSMath/src/bezier/transforms/geom/TDHIdentity.java b/CSMath/src/bezier/transforms/geom/TDHIdentity.java
new file mode 100644
index 0000000..f24d1c9
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHIdentity.java
@@ -0,0 +1,21 @@
+package bezier.transforms.geom;
+
+import bezier.geom.TDHPoint;
+
+/**
+ * A transform that does nothing.
+ *
+ * @author bjculkin
+ *
+ */
+public class TDHIdentity implements TDHTransform {
+ @Override
+ public TDHPoint transform(TDHPoint punkt) {
+ return punkt;
+ }
+
+ @Override
+ public String toString() {
+ return "TDHIdentity []";
+ }
+} \ No newline at end of file
diff --git a/CSMath/src/bezier/transforms/geom/TDHLineReflection.java b/CSMath/src/bezier/transforms/geom/TDHLineReflection.java
new file mode 100644
index 0000000..cf1e8c2
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHLineReflection.java
@@ -0,0 +1,68 @@
+package bezier.transforms.geom;
+
+import bezier.geom.TDHPoint;
+
+public class TDHLineReflection implements TDHTransform {
+ public final double a;
+ public final double b;
+ public final double c;
+
+ public TDHLineReflection(double a, double b, double c) {
+ this.a = a;
+ this.b = b;
+ this.c = c;
+ }
+
+ @Override
+ public TDHTransformType type() {
+ return TDHTransformType.REFLECTION;
+ }
+
+ @Override
+ public TDHPoint transform(TDHPoint punkt) {
+ double com = (a * a - b * b);
+
+ double x = (punkt.x * com) - (2 * a * b * punkt.y) - (2 * a * c * punkt.z);
+ double y = (-2 * a * b * punkt.x) + (punkt.y * com) - (2 * b * c * punkt.z);
+ double z = (punkt.z * com);
+
+ return new TDHPoint(x, y, z);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ long temp;
+ temp = Double.doubleToLongBits(a);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(b);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(c);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TDHLineReflection other = (TDHLineReflection) obj;
+ if (Double.doubleToLongBits(a) != Double.doubleToLongBits(other.a))
+ return false;
+ if (Double.doubleToLongBits(b) != Double.doubleToLongBits(other.b))
+ return false;
+ if (Double.doubleToLongBits(c) != Double.doubleToLongBits(other.c))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "TDHLineReflection [a=" + a + ", b=" + b + ", c=" + c + "]";
+ }
+} \ No newline at end of file
diff --git a/CSMath/src/bezier/transforms/geom/TDHMatrixTransform.java b/CSMath/src/bezier/transforms/geom/TDHMatrixTransform.java
new file mode 100644
index 0000000..ace590d
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHMatrixTransform.java
@@ -0,0 +1,32 @@
+package bezier.transforms.geom;
+
+import bezier.geom.Matrix;
+import bezier.geom.TDHPoint;
+
+public class TDHMatrixTransform implements TDHTransform {
+ public final Matrix mat;
+
+ public TDHMatrixTransform(Matrix mat) {
+ this.mat = mat;
+ }
+
+ public TDHMatrixTransform(double[][] mat) {
+ this.mat = new Matrix(mat);
+ }
+
+ @Override
+ public TDHTransformType type() {
+ return TDHTransformType.MATRIX;
+ }
+
+ @Override
+ public TDHPoint transform(TDHPoint punkt) {
+ double[] mult = mat.scalarMultiply(new double[] { punkt.x, punkt.y, punkt.z });
+
+ return new TDHPoint(mult[0], mult[1], mult[2]);
+ }
+
+ public TDHTransform then(TDHMatrixTransform trans) {
+ return new TDHMatrixTransform(mat.multiply(trans.mat));
+ }
+} \ No newline at end of file
diff --git a/CSMath/src/bezier/transforms/geom/TDHPointRotation.java b/CSMath/src/bezier/transforms/geom/TDHPointRotation.java
new file mode 100644
index 0000000..bc3c716
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHPointRotation.java
@@ -0,0 +1,67 @@
+package bezier.transforms.geom;
+
+import bezier.geom.TDHPoint;
+
+public class TDHPointRotation extends TDHRotation {
+ public final double x0;
+ public final double y0;
+
+ public TDHPointRotation(double theta, double x0, double y0) {
+ super(theta);
+
+ this.x0 = x0;
+ this.y0 = y0;
+ }
+
+ @Override
+ public TDHTransformType type() {
+ return TDHTransformType.ROTATION;
+ }
+
+ @Override
+ public TDHPoint transform(TDHPoint punkt) {
+ double x1 = (punkt.x * Math.cos(theta)) - (punkt.y * Math.sin(theta));
+ double y1 = (punkt.x * Math.sin(theta)) - (punkt.y * Math.cos(theta));
+
+ double x2 = (-x0 * Math.cos(theta)) + (y0 * Math.sin(theta)) + x0;
+ double y2 = (-x0 * Math.sin(theta)) - (y0 * Math.cos(theta)) + y0;
+
+ double x = x1 + (punkt.z * x2);
+ double y = y1 + (punkt.z * y2);
+
+ return new TDHPoint(x, y, punkt.z);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ long temp;
+ temp = Double.doubleToLongBits(x0);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(y0);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!super.equals(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TDHPointRotation other = (TDHPointRotation) obj;
+ if (Double.doubleToLongBits(x0) != Double.doubleToLongBits(other.x0))
+ return false;
+ if (Double.doubleToLongBits(y0) != Double.doubleToLongBits(other.y0))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "TDHPointRotation [x0=" + x0 + ", y0=" + y0 + "]";
+ }
+} \ No newline at end of file
diff --git a/CSMath/src/bezier/transforms/geom/TDHRotation.java b/CSMath/src/bezier/transforms/geom/TDHRotation.java
new file mode 100644
index 0000000..8870b53
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHRotation.java
@@ -0,0 +1,57 @@
+package bezier.transforms.geom;
+
+import bezier.geom.TDHPoint;
+
+public class TDHRotation implements TDHTransform {
+ public final double theta;
+
+ public TDHRotation(double theta) {
+ this.theta = theta;
+ }
+
+ @Override
+ public TDHPoint transform(TDHPoint punkt) {
+ double x = (punkt.x * Math.cos(theta)) - (punkt.y * Math.sin(theta));
+ double y = (punkt.x * Math.sin(theta)) - (punkt.y * Math.cos(theta));
+
+ return new TDHPoint(x, y, punkt.z);
+ }
+
+ public double[][] matrix() {
+ return new double[][] { new double[] { Math.cos(theta), Math.sin(theta), 0 },
+ new double[] { -Math.sin(theta), Math.cos(theta), 0 }, new double[] { 0, 0, 1 } };
+ }
+
+ public TDHTransform invert() {
+ return new TDHRotation(-theta);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ long temp;
+ temp = Double.doubleToLongBits(theta);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TDHRotation other = (TDHRotation) obj;
+ if (Double.doubleToLongBits(theta) != Double.doubleToLongBits(other.theta))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "TDHRotation [theta=" + theta + "]";
+ }
+} \ No newline at end of file
diff --git a/CSMath/src/bezier/transforms/geom/TDHScale.java b/CSMath/src/bezier/transforms/geom/TDHScale.java
new file mode 100644
index 0000000..a6db9a9
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHScale.java
@@ -0,0 +1,124 @@
+package bezier.transforms.geom;
+
+import bezier.geom.TDHPoint;
+
+/**
+ * Transform that does coordinate scaling.
+ *
+ * @author bjculkin
+ *
+ */
+public class TDHScale implements TDHTransform {
+ /**
+ * Amount to scale x by.
+ */
+ public final double sx;
+ /**
+ * Amount to scale y by.
+ */
+ public final double sy;
+ /**
+ * Amount to scale the homogeneous coordinate by.
+ */
+ public final double sz;
+
+ /**
+ * Create a new scaling that scales each coordinate by an equal amount
+ *
+ * @param factor
+ * The amount to scale the coordinates by.
+ */
+ public TDHScale(double factor) {
+ this(factor, factor);
+ }
+
+ /**
+ * Create a new scaling that scales each coordinate separately.
+ *
+ * @param sx
+ * The amount to scale x by.
+ * @param sy
+ * The amount to scale y by.
+ */
+ public TDHScale(double sx, double sy) {
+ this(sx, sy, 1);
+ }
+
+ /**
+ * Create a new scaling that scales each coordinate separately.
+ *
+ * Includes the homogeneous coordinate.
+ *
+ * @param sx
+ * The amount to scale x by.
+ * @param sy
+ * The amount to scale y by.
+ * @param sz
+ * The amount to scale the homogeneous coordinate by.
+ */
+ public TDHScale(double sx, double sy, double sz) {
+ this.sx = sx;
+ this.sy = sy;
+ this.sz = sz;
+ }
+
+ @Override
+ public TDHTransformType type() {
+ return TDHTransformType.SCALE;
+ }
+
+ @Override
+ public TDHPoint transform(TDHPoint punkt) {
+ double x = punkt.x * sx;
+ double y = punkt.y * sy;
+ double z = punkt.z * sz;
+
+ return new TDHPoint(x, y, z);
+ }
+
+ @Override
+ public double[][] matrix() {
+ return new double[][] { new double[] { sx, 0, 0 }, new double[] { 0, sy, 0 }, new double[] { 0, 0, sz } };
+ }
+
+ public TDHTransform invert() {
+ return new TDHScale(1 / sx, 1 / sy, 1 / sy);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ long temp;
+ temp = Double.doubleToLongBits(sx);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(sy);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(sz);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TDHScale other = (TDHScale) obj;
+ if (Double.doubleToLongBits(sx) != Double.doubleToLongBits(other.sx))
+ return false;
+ if (Double.doubleToLongBits(sy) != Double.doubleToLongBits(other.sy))
+ return false;
+ if (Double.doubleToLongBits(sz) != Double.doubleToLongBits(other.sz))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "TDHScale [sx=" + sx + ", sy=" + sy + ", sz=" + sz + "]";
+ }
+} \ No newline at end of file
diff --git a/CSMath/src/bezier/transforms/geom/TDHShear.java b/CSMath/src/bezier/transforms/geom/TDHShear.java
new file mode 100644
index 0000000..c0c72ca
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHShear.java
@@ -0,0 +1,59 @@
+package bezier.transforms.geom;
+
+import bezier.geom.TDHPoint;
+
+public class TDHShear implements TDHTransform {
+ public final double shx;
+ public final double shy;
+
+ @Override
+ public TDHTransformType type() {
+ return TDHTransformType.SHEAR;
+ }
+
+ public TDHShear(double shx, double shy) {
+ this.shx = shx;
+ this.shy = shy;
+ }
+
+ @Override
+ public TDHPoint transform(TDHPoint punkt) {
+ double x = punkt.x + (punkt.y * shx);
+ double y = punkt.y + (punkt.x * shy);
+
+ return new TDHPoint(x, y, punkt.z);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ long temp;
+ temp = Double.doubleToLongBits(shx);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(shy);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TDHShear other = (TDHShear) obj;
+ if (Double.doubleToLongBits(shx) != Double.doubleToLongBits(other.shx))
+ return false;
+ if (Double.doubleToLongBits(shy) != Double.doubleToLongBits(other.shy))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "TDHShear [shx=" + shx + ", shy=" + shy + "]";
+ }
+} \ No newline at end of file
diff --git a/CSMath/src/bezier/transforms/geom/TDHTransform.java b/CSMath/src/bezier/transforms/geom/TDHTransform.java
new file mode 100644
index 0000000..20afc53
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHTransform.java
@@ -0,0 +1,54 @@
+package bezier.transforms.geom;
+
+import bezier.geom.TDHPoint;
+
+/**
+ * Transformation applicable to TDHPoints.
+ *
+ * @author bjculkin
+ *
+ */
+@FunctionalInterface
+public interface TDHTransform {
+ /**
+ * Get the type of this transform.
+ *
+ * Unknown transformations are assumed to be identity transforms.
+ *
+ * @return The type of this transform.
+ */
+ default TDHTransformType type() {
+ return TDHTransformType.IDENTITY;
+ }
+
+ /**
+ * Get the matrix representation of the transform.
+ *
+ * Unknown transformations are assumed to be identity transforms.
+ *
+ * @return The matrix representation of the transform.
+ */
+ default double[][] matrix() {
+ return new double[][] { new double[] { 1, 0, 0 }, new double[] { 0, 1, 0 }, new double[] { 0, 0, 1 } };
+ }
+
+ /**
+ * Get the inverse of the transform.
+ *
+ * Unknown transformations are assumed to be identity transforms.
+ *
+ * @return The inverse the transform.
+ */
+ default TDHTransform invert() {
+ return new TDHIdentity();
+ }
+
+ /**
+ * Apply the transform to a point.
+ *
+ * @param punkt
+ * The point to transform.
+ * @return A transformed version of the point.
+ */
+ TDHPoint transform(TDHPoint punkt);
+} \ No newline at end of file
diff --git a/CSMath/src/bezier/transforms/geom/TDHTransformType.java b/CSMath/src/bezier/transforms/geom/TDHTransformType.java
new file mode 100644
index 0000000..909afdc
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHTransformType.java
@@ -0,0 +1,42 @@
+package bezier.transforms.geom;
+
+/**
+ * Types of transform to apply to TDHPoints.
+ *
+ * @author bjculkin
+ *
+ */
+public enum TDHTransformType {
+ /**
+ * Coordinate translation.
+ */
+ TRANSLATE,
+ /**
+ * Do nothing transform.
+ */
+ IDENTITY,
+ /**
+ * Coordinate scaling.
+ */
+ SCALE,
+ /**
+ * Coordinate rotation.
+ */
+ ROTATION,
+ /**
+ * Coordinate reflection.
+ */
+ REFLECTION,
+ /**
+ * Coordinate shearing.
+ */
+ SHEAR,
+ /**
+ * Multiple transformations.
+ */
+ COMBINATION,
+ /**
+ * Arbitrary matrix transformation.
+ */
+ MATRIX
+} \ No newline at end of file
diff --git a/CSMath/src/bezier/transforms/geom/TDHTranslate.java b/CSMath/src/bezier/transforms/geom/TDHTranslate.java
new file mode 100644
index 0000000..905711f
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHTranslate.java
@@ -0,0 +1,89 @@
+package bezier.transforms.geom;
+
+import bezier.geom.TDHPoint;
+
+/**
+ * A transform that does coordinate translation.
+ *
+ * @author bjculkin
+ *
+ */
+public class TDHTranslate implements TDHTransform {
+ /**
+ * The amount to translate the x-coordinate by.
+ */
+ public final double h;
+ /**
+ * The amount to translate the y-coordinate by.
+ */
+ public final double k;
+
+ /**
+ * Create a new translation transform.
+ *
+ * @param h
+ * The amount to translate x by.
+ * @param k
+ * The amount to translate y by.
+ */
+ public TDHTranslate(double h, double k) {
+ this.h = h;
+ this.k = k;
+ }
+
+ @Override
+ public TDHTransformType type() {
+ return TDHTransformType.TRANSLATE;
+ }
+
+ @Override
+ public TDHPoint transform(TDHPoint punkt) {
+ double x = punkt.x + (punkt.z * h);
+ double y = punkt.y + (punkt.z * k);
+
+ return new TDHPoint(x, y, punkt.z);
+ }
+
+ @Override
+ public double[][] matrix() {
+ return new double[][] { new double[] { 1, 0, 0 }, new double[] { 0, 1, 0 }, new double[] { h, k, 1 } };
+ }
+
+ @Override
+ public TDHTransform invert() {
+ return new TDHTranslate(-h, -k);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ long temp;
+ temp = Double.doubleToLongBits(h);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(k);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TDHTranslate other = (TDHTranslate) obj;
+ if (Double.doubleToLongBits(h) != Double.doubleToLongBits(other.h))
+ return false;
+ if (Double.doubleToLongBits(k) != Double.doubleToLongBits(other.k))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "TDHTranslate [h=" + h + ", k=" + k + "]";
+ }
+} \ No newline at end of file
diff --git a/CSMath/src/bezier/transforms/geom/TDHXAxisReflection.java b/CSMath/src/bezier/transforms/geom/TDHXAxisReflection.java
new file mode 100644
index 0000000..4b4bffe
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHXAxisReflection.java
@@ -0,0 +1,20 @@
+package bezier.transforms.geom;
+
+import bezier.geom.TDHPoint;
+
+public class TDHXAxisReflection implements TDHTransform {
+ @Override
+ public TDHTransformType type() {
+ return TDHTransformType.REFLECTION;
+ }
+
+ @Override
+ public TDHPoint transform(TDHPoint punkt) {
+ return new TDHPoint(punkt.x, -punkt.y, punkt.z);
+ }
+
+ @Override
+ public String toString() {
+ return "TDHXAxisReflection []";
+ }
+} \ No newline at end of file
diff --git a/CSMath/src/bezier/transforms/geom/TDHYAxisReflection.java b/CSMath/src/bezier/transforms/geom/TDHYAxisReflection.java
new file mode 100644
index 0000000..39e9f18
--- /dev/null
+++ b/CSMath/src/bezier/transforms/geom/TDHYAxisReflection.java
@@ -0,0 +1,20 @@
+package bezier.transforms.geom;
+
+import bezier.geom.TDHPoint;
+
+public class TDHYAxisReflection implements TDHTransform {
+ @Override
+ public TDHTransformType type() {
+ return TDHTransformType.REFLECTION;
+ }
+
+ @Override
+ public TDHPoint transform(TDHPoint punkt) {
+ return new TDHPoint(-punkt.x, punkt.y, punkt.z);
+ }
+
+ @Override
+ public String toString() {
+ return "TDHYAxisReflection []";
+ }
+} \ No newline at end of file
diff --git a/CSMath/src/bisection/DualExpr.java b/CSMath/src/bisection/DualExpr.java
index 4ff5187..0c76840 100644
--- a/CSMath/src/bisection/DualExpr.java
+++ b/CSMath/src/bisection/DualExpr.java
@@ -69,11 +69,11 @@ public class DualExpr {
/**
* The left (or first) part of the expression.
*/
- public DualExpr left;
+ public DualExpr left;
/**
* The right (or second) part of the expression.
*/
- public DualExpr right;
+ public DualExpr right;
/**
* The power to use, for power operations.
@@ -107,14 +107,13 @@ public class DualExpr {
}
/**
- * Create a new binary dual number.
- *
- * @param type
+ * Create a new math expression.
+ *
* The type of operation to perform.
* @param left
* The left operand
* @param right
- * The right operand
+ * The right operand
*/
public DualExpr(DualExpr.ExprType type, DualExpr left, DualExpr right) {
this.type = type;