/** * Calculates a transformation matrix onto the ray. * * @param matrix the {@link TransformMatrix2D} that gets calculated into this ray. * @return the transformed ray. */ public Ray2D transform(TransformMatrix2D matrix) { Point2D startNew = matrix.multiply(start); Vector2D directionNew = startNew.vec(matrix.multiply(start.add(direction))); return(new Ray2D(startNew, directionNew)); }
public void testTransform() { Assert.AreEqual(((Circle2D)testCircle.transform(TransformMatrix2D.UNITY_MATRIX)).getCenter().getX(), testCircle.getCenter().getX(), 0.000005d); Assert.AreEqual(((Circle2D)testCircle.transform(TransformMatrix2D.UNITY_MATRIX)).getCenter().getY(), testCircle.getCenter().getY(), 0.000005d); Assert.AreEqual(((Circle2D)testCircle.transform(TransformMatrix2D.UNITY_MATRIX)).getRadius(), testCircle.getRadius(), 0.000005d); Assert.AreEqual(((Circle2D)testCircle.transform(TransformMatrix2D.translate(4.0d, 5.0d))).getCenter().getX(), 16.0d, 0.000005d); Assert.AreEqual(((Circle2D)testCircle.transform(TransformMatrix2D.translate(4.0d, 5.0d))).getCenter().getY(), 19.0d, 0.000005d); Assert.AreEqual(((Ellipse2D)testCircle.transform(TransformMatrix2D.scale(2.0d, 0D))).getHorizontalLength(), 20.0d, 0.000005d); Assert.AreEqual(((Ellipse2D)testCircle.transform(TransformMatrix2D.scale(0, 0.5d))).getVerticalLength(), 5.0d, 0.000005d); }
public void testTransform() { Assert.AreEqual(((Rect2D)testRect.transform(TransformMatrix2D.UNITY_MATRIX)).getUpperLeft().getX(), testRect.getUpperLeft().getX(), 0.000005d); Assert.AreEqual(((Rect2D)testRect.transform(TransformMatrix2D.UNITY_MATRIX)).getUpperLeft().getY(), testRect.getUpperLeft().getY(), 0.000005d); Assert.AreEqual(((Rect2D)testRect.transform(TransformMatrix2D.UNITY_MATRIX)).getLowerRight().getX(), testRect.getLowerRight().getX(), 0.000005d); Assert.AreEqual(((Rect2D)testRect.transform(TransformMatrix2D.UNITY_MATRIX)).getLowerRight().getY(), testRect.getLowerRight().getY(), 0.000005d); Assert.AreEqual(((Rect2D)testRect.transform(TransformMatrix2D.translate(3.0d, 5.0d))).getUpperLeft().getX(), 6.0d, 0.000005d); Assert.AreEqual(((Rect2D)testRect.transform(TransformMatrix2D.translate(3.0d, 5.0d))).getUpperLeft().getY(), 13.0d, 0.000005d); Assert.AreEqual(((Rect2D)testRect.transform(TransformMatrix2D.translate(3.0d, 5.0d))).getLowerRight().getX(), 8.0d, 0.000005d); Assert.AreEqual(((Rect2D)testRect.transform(TransformMatrix2D.translate(3.0d, 5.0d))).getLowerRight().getY(), 9.0d, 0.000005d); Assert.AreEqual(((Rect2D)testRect.transform(TransformMatrix2D.scale(2.0d, 4.0d))).getUpperLeft().getX(), 6.0d, 0.000005d); Assert.AreEqual(((Rect2D)testRect.transform(TransformMatrix2D.scale(2.0d, 4.0d))).getUpperLeft().getY(), 32.0d, 0.000005d); Assert.AreEqual(((Rect2D)testRect.transform(TransformMatrix2D.scale(2.0d, 4.0d))).getLowerRight().getX(), 10.0d, 0.000005d); Assert.AreEqual(((Rect2D)testRect.transform(TransformMatrix2D.scale(2.0d, 4.0d))).getLowerRight().getY(), 16.0d, 0.000005d); }
public void testRayCast() { // static tests Assert.AreEqual(double.PositiveInfinity, testEllipse.rayCast(new Ray2D(0.0d, 0.0d, 0.0d, 2.0d)), 0.000005d); Assert.AreEqual(2.0d, testEllipse.rayCast(new Ray2D(0.0d, 14.0d, 12.0d, 14.0d)), 0.000005d); // serial tests Ellipse2D randomEllipse; Point2D randomPointOnEllipse; Point2D randomPoint; double currentXRadius; double currentYRadius; double xvalue; double yvalue; double randomAngle; int sector; int counter = 1000; do { randomEllipse = new Ellipse2D(new Point2D(Util.generateRandomDoubleBetween(-500.0d, 500.0d), Util.generateRandomDoubleBetween(-500.0d, 500.0d)), Util.generateRandomDoubleBetween(0.0d, 200.0d), Util.generateRandomDoubleBetween(0.0d, 200.0d)); currentXRadius = randomEllipse.getHorizontalLength(); currentYRadius = randomEllipse.getVerticalLength(); xvalue = Util.generateRandomDoubleBetween(0.0d, currentXRadius); yvalue = (currentYRadius * System.Math.Sqrt(currentXRadius * currentXRadius - xvalue * xvalue)) / currentXRadius; sector = Util.randomNumberBetween(1, 4); switch (sector) { case 2: { yvalue = -yvalue; randomPoint = new Point2D(Util.generateRandomDoubleBetween(randomEllipse.getCenter().getX() + xvalue, 1000.0d), Util.generateRandomDoubleBetween(-1000.0d, randomEllipse.getCenter().getY() + yvalue)); break; } case 3: { xvalue = -xvalue; yvalue = -yvalue; randomPoint = new Point2D(Util.generateRandomDoubleBetween(-1000.0d, randomEllipse.getCenter().getX() + xvalue), Util.generateRandomDoubleBetween(-1000.0d, randomEllipse.getCenter().getY() + yvalue)); break; } case 4: { xvalue = -xvalue; randomPoint = new Point2D(Util.generateRandomDoubleBetween(-1000.0d, randomEllipse.getCenter().getX() + xvalue), Util.generateRandomDoubleBetween(randomEllipse.getCenter().getY() + yvalue, 1000.0d)); break; } default: { randomPoint = new Point2D(Util.generateRandomDoubleBetween(randomEllipse.getCenter().getX() + xvalue, 1000.0d), Util.generateRandomDoubleBetween(randomEllipse.getCenter().getY() + yvalue, 1000.0d)); break; } } randomPointOnEllipse = new Point2D(randomEllipse.getCenter().getX() + xvalue, randomEllipse.getCenter().getY() + yvalue); randomAngle = Util.generateRandomDoubleBetween(-System.Math.PI / 2, System.Math.PI / 2); randomEllipse = (Ellipse2D)(randomEllipse.transform(TransformMatrix2D.rotate(randomAngle))); randomPoint = TransformMatrix2D.rotate(randomAngle).multiply(randomPoint); randomPointOnEllipse = TransformMatrix2D.rotate(randomAngle).multiply(randomPointOnEllipse); // System.Console.Writef("RayCast No. %d: Ellipse at (%.2f,%.2f), radii: (%.2f,%.2f). Rotation angle: %.2f, original angle: %.2f, point on ellipse: (%.2f,%.2f), outside point: (%.2f,%.2f), distance: %.2f.\n", 1000-counter, randomEllipse.getCenter().getX(), randomEllipse.getCenter().getY(), randomEllipse.getHorizontalLength(), randomEllipse.getVerticalLength(), randomEllipse.getAngle(), randomAngle, randomPointOnEllipse.getX(), randomPointOnEllipse.getY(), randomPoint.getX(), randomPoint.getY(), randomPoint.distance(randomPointOnEllipse)); Assert.AreEqual(randomPoint.distance(randomPointOnEllipse), randomEllipse.rayCast(new Ray2D(randomPoint, randomPoint.vec(randomPointOnEllipse))), 0.000005d); counter -= 1; } while (counter > 0); }