package br.com.etyllica.util.math;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Assert;
import org.junit.Test;
import br.com.etyllica.core.linear.Triangle;
import br.com.etyllica.util.math.MathHelper;
import com.badlogic.gdx.math.Vector3;
public class MathHelperTest {
@Test
public void testNormal() {
Vector3 a = new Vector3(0,0,0);
Vector3 b = new Vector3(10,0,0);
Vector3 c = new Vector3(0,10,0);
Triangle triangle = new Triangle(a, b, c);
Vector3 normal = MathHelper.calculateNormal(triangle);
Assert.assertEquals(0, normal.x, 0.0001);
Assert.assertEquals(0, normal.y, 0.0001);
Assert.assertEquals(1, normal.z, 0.0001);
}
@Test
public void testOrderedInZList() {
Vector3 a = new Vector3(0,0,3);
Vector3 b = new Vector3(10,0,2);
Vector3 c = new Vector3(0,10,1);
List<Vector3> ordered = MathHelper.orderedInZ(a, b, c);
Assert.assertEquals(c, ordered.get(0));
Assert.assertEquals(b, ordered.get(1));
Assert.assertEquals(a, ordered.get(2));
}
@Test
public void testAreaTriangleInOrigin() {
Vector3 a = new Vector3(0,0,0);
Vector3 b = new Vector3(10,0,0);
Vector3 c = new Vector3(0,10,0);
Triangle triangle = new Triangle(a, b, c);
Assert.assertEquals(50, MathHelper.triangleArea(triangle), 0.00001);
}
/**
* Test based on explanation: https://www.youtube.com/watch?v=MnpaeFPyn1A
*/
@Test
public void testAreaTriangle() {
Vector3 a = new Vector3(-5,5,-5);
Vector3 b = new Vector3(1,-6,6);
Vector3 c = new Vector3(2,-3,4);
Triangle triangle = new Triangle(a, b, c);
Assert.assertEquals(19.3067f, MathHelper.triangleArea(triangle), 0.0001);
}
@Test
public void testTriangularPrismVolume() {
Vector3 a = new Vector3(-5,5,-5);
Vector3 b = new Vector3(1,-6,6);
Vector3 c = new Vector3(2,-3,4);
Triangle triangle = new Triangle(a, b, c);
float height = 10;
Assert.assertEquals(193.0673f, MathHelper.trianglularPrismVolume(triangle, height), 0.0001);
}
@Test
public void testVolumeUnderAlignedTriangle() {
Vector3 a = new Vector3(0,0,1);
Vector3 b = new Vector3(1,0,1);
Vector3 c = new Vector3(0,1,1);
Triangle triangle = new Triangle(a, b, c);
Vector3 d = new Vector3(1,1,1);
Triangle otherTriangle = new Triangle(b, d, c);
//0.5 = half of cube volume
Assert.assertEquals(0.5, MathHelper.volumeUnderTriangle(triangle), 0.001);
Assert.assertEquals(0.5, MathHelper.volumeUnderTriangle(otherTriangle), 0.001);
}
@Test
public void testVolumeUnderOriginTriangle() {
Vector3 a = new Vector3(0,0,0);
Vector3 b = new Vector3(1,0,0);
Vector3 c = new Vector3(0,1,0);
Triangle triangle = new Triangle(a, b, c);
Assert.assertEquals(0, MathHelper.volumeUnderTriangle(triangle), 0.001);
}
@Test
public void testVolumeUnderTriangle() {
Vector3 a = new Vector3(-5,5,-5);
Vector3 b = new Vector3(1,-6,6);
Vector3 c = new Vector3(2,-3,4);
Triangle triangle = new Triangle(a, b, c);
Assert.assertEquals(24.166f, MathHelper.volumeUnderTriangle(triangle), 0.001);
}
@Test
public void testVolumeUnderOtherTriangle() {
Vector3 a = new Vector3(57.352f, 78.256f, 16.55f);
Vector3 b = new Vector3(58.96f, 78.256f, 16.12f);
Vector3 c = new Vector3(58.96f, 79.864f, 21.98f);
Triangle triangle = new Triangle(a, b, c);
Assert.assertEquals(23.5468f, MathHelper.volumeUnderTriangle(triangle), 0.001);
}
@Test
public void testVolumeOfMesh() {
Vector3 a = new Vector3(0,0,1);
Vector3 b = new Vector3(1,0,1);
Vector3 c = new Vector3(0,-1,1);
Triangle triangle = new Triangle(a, c, b);
//Projection points
Vector3 pa = new Vector3(a.x,a.y,0);
Vector3 pb = new Vector3(b.x,b.y,0);
Vector3 pc = new Vector3(c.x,c.y,0);
Triangle t1 = new Triangle(a, b, pa);
Triangle t2 = new Triangle(b, pb, pa);
Triangle t3 = new Triangle(b, c, pb);
Triangle t4 = new Triangle(c, pc, pb);
Triangle t5 = new Triangle(c, a, pc);
Triangle t6 = new Triangle(a, pa, pc);
Triangle tp = new Triangle(pa, pb, pc);
Vector3 ntop = MathHelper.calculateNormal(triangle);
Vector3 nt1 = MathHelper.calculateNormal(t1);
Vector3 nt2 = MathHelper.calculateNormal(t2);
Vector3 nt3 = MathHelper.calculateNormal(t3);
Vector3 nt4 = MathHelper.calculateNormal(t4);
Vector3 nt5 = MathHelper.calculateNormal(t5);
Vector3 nt6 = MathHelper.calculateNormal(t6);
Vector3 np = MathHelper.calculateNormal(tp);
Assert.assertEquals(1, ntop.z, 0.001);
Assert.assertEquals(0, nt1.x, 0.001);
Assert.assertEquals(1, nt1.y, 0.001);
Assert.assertEquals(nt1.y, nt2.y, 0.0001);
Assert.assertEquals(0.707, nt3.x, 0.001);
Assert.assertEquals(-0.707, nt3.y, 0.001);
Assert.assertEquals(nt3, nt4);
Assert.assertEquals(-1, nt5.x, 0.001);
Assert.assertEquals(0, nt5.y, 0.001);
Assert.assertEquals(nt5.x, nt6.x, 0.001);
Assert.assertEquals(-1, np.z, 0.001);
Set<Triangle> triangles = new HashSet<Triangle>();
triangles.add(triangle);
triangles.add(t1);
triangles.add(t2);
triangles.add(t3);
triangles.add(t4);
triangles.add(t5);
triangles.add(t6);
triangles.add(tp);
Assert.assertEquals(0.5, MathHelper.volumeOfMesh(triangles), 0.001);
}
}