/*
TestMathUtils.java
(c) 2012 Edward Swartz
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v10.html
*/
package ejs.base.internal.test;
import static org.junit.Assert.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import org.junit.Test;
import ejs.base.utils.MathUtils;
/**
* @author ejs
*
*/
public class TestMathUtils {
@Test
public void testRotatePointsCentered() {
Point2D.Double ans;
ans = MathUtils.rotatePoint(0, 0, 10, 40, 0);
assertEquals(10., ans.x, 0.01);
assertEquals(40., ans.y, 0.01);
// rotate "_" counter-clockwise quarter turn -- should point up (screen-wise)
ans = MathUtils.rotatePoint(0, 0, 40, 0, Math.PI / 2);
assertEquals(0., ans.x, 0.01);
assertEquals(40., ans.y, 0.01);
ans = MathUtils.rotatePoint(0, 0, 40, 0, Math.PI);
assertEquals(-40., ans.x, 0.01);
assertEquals(0., ans.y, 0.01);
ans = MathUtils.rotatePoint(0, 0, 40, 0, Math.PI * 3 / 2);
assertEquals(0., ans.x, 0.01);
assertEquals(-40., ans.y, 0.01);
// turn "/" clockwise one-eighth turn; should be on X axis
ans = MathUtils.rotatePoint(0, 0, Math.sqrt(2), Math.sqrt(2), -Math.PI / 4);
assertEquals(2., ans.x, 0.01);
assertEquals(0., ans.y, 0.01);
}
@Test
public void testRotatePointsOffCenter() {
Point2D.Double ans;
ans = MathUtils.rotatePoint(100, 100, 10, 40, 0);
assertEquals(110., ans.x, 0.01);
assertEquals(140., ans.y, 0.01);
// rotate "_" counter-clockwise quarter turn -- should point up (screen-wise)
// given this center, we can assume the bounds is e.g [-50 to 35] x [-5 to 5],
// so after rotating,
ans = MathUtils.rotatePoint(-5, -5, 40, 0, Math.PI / 2);
assertEquals(-5., ans.x, 0.01);
assertEquals(35., ans.y, 0.01);
// turn "/" clockwise one-eighth turn; should be on X axis
ans = MathUtils.rotatePoint(100, 100, Math.sqrt(2), Math.sqrt(2), -Math.PI / 4);
assertEquals(102., ans.x, 0.01);
assertEquals(100., ans.y, 0.01);
}
@Test
public void testRotateRects() {
Rectangle2D ans;
// no rot
ans = MathUtils.rotateRectangle(
new Rectangle2D.Double(40, 75, 100, 10),
new Point2D.Double(0, 5),
0);
assertEquals(40., ans.getX(), 0.01);
assertEquals(75., ans.getY(), 0.01);
assertEquals(100., ans.getWidth(), 0.01);
assertEquals(10., ans.getHeight(), 0.01);
// rotate 90 degrees left
ans = MathUtils.rotateRectangle(
new Rectangle2D.Double(45, 70, 100, 10),
new Point2D.Double(0, 5),
Math.PI / 2);
assertEquals(40., ans.getX(), 0.01);
assertEquals(75. - 100., ans.getY(), 0.01);
assertEquals(10., ans.getWidth(), 0.01);
assertEquals(100., ans.getHeight(), 0.01);
// rotate 180 degrees
ans = MathUtils.rotateRectangle(
new Rectangle2D.Double(45, 70, 100, 10),
new Point2D.Double(0, 5),
Math.PI);
assertEquals(45 - 100., ans.getX(), 0.01);
assertEquals(70., ans.getY(), 0.01);
assertEquals(100., ans.getWidth(), 0.01);
assertEquals(10., ans.getHeight(), 0.01);
}
@Test
public void testEllipseCircumference() {
// a circle
assertEquals(Math.PI * 10 * 2, MathUtils.ellipseCircumference(10, 10), 0.01);
// degenerate ellipse, a line of length 20, going forward and backward
assertEquals(40, MathUtils.ellipseCircumference(10, 0), 0.1);
}
}