package edu.stanford.rsl.conrad.geometry.shapes.simple;
import java.util.ArrayList;
import org.junit.Assert;
import org.junit.Test;
import edu.stanford.rsl.conrad.geometry.AbstractShape;
import edu.stanford.rsl.conrad.geometry.Rotations;
import edu.stanford.rsl.conrad.geometry.shapes.compound.CompoundShape;
import edu.stanford.rsl.conrad.geometry.transforms.ScaleRotate;
import edu.stanford.rsl.conrad.geometry.transforms.Translation;
import edu.stanford.rsl.conrad.numerics.SimpleVector;
public class GeometryTests {
@Test
public void testBoxIntersectionSimple(){
Box box = new Box(1,1,1);
StraightLine line = new StraightLine(new PointND (-10, 0.5 ,0.5), new SimpleVector(1, 0, 0));
ArrayList<PointND> intersections = box.intersect(line);
PointND in = new PointND(0.0, 0.5, 0.5);
PointND out = new PointND(1.0, 0.5, 0.5);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10, 0.75 ,0.5), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0.0, 0.75, 0.5);
out = new PointND(1.0, 0.75, 0.5);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10, 0.25 ,0.5), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0.0, 0.25, 0.5);
out = new PointND(1.0, 0.25, 0.5);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
}
@Test
public void testBoxIntersection90DegreeRotation(){
Box box = new Box(1,1,1);
ScaleRotate r = new ScaleRotate(Rotations.createBasicZRotationMatrix(Math.PI/2));
box.applyTransform(r);
StraightLine line = new StraightLine(new PointND (-10, 0.5 ,0.5), new SimpleVector(1, 0, 0));
ArrayList<PointND> intersections = box.intersect(line);
PointND in = new PointND(0.0, 0.5, 0.5);
PointND out = new PointND(-1.0, 0.5, 0.5);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10, 0.75 ,0.5), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0.0, 0.75, 0.5);
out = new PointND(-1.0, 0.75, 0.5);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10, 0.25 ,0.5), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0.0, 0.25, 0.5);
out = new PointND(-1.0, 0.25, 0.5);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
}
@Test
public void testBoxIntersection90DegreeRotationAndShift(){
Box box = new Box(1,1,1);
Translation t = new Translation(new SimpleVector(-0.5,-0.5,-0.5));
box.applyTransform(t);
ScaleRotate r = new ScaleRotate(Rotations.createBasicZRotationMatrix(Math.PI/2));
box.applyTransform(r);
StraightLine line = new StraightLine(new PointND (-10, 0.0 ,0.0), new SimpleVector(1, 0, 0));
ArrayList<PointND> intersections = box.intersect(line);
PointND in = new PointND(0.5, 0.0, 0.0);
PointND out = new PointND(-0.5, 0.0, 0.0);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10, -0.25 ,0.5), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0.5, -0.25, 0.5);
out = new PointND(-.50, -0.25, 0.5);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10, 0.25 ,0.5), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0.5, 0.25, 0.5);
out = new PointND(-.50, 0.25, 0.5);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
}
@Test
public void testBoxIntersectionAndShift(){
Box box = new Box(1,1,1);
Translation t = new Translation(new SimpleVector(-0.5,-0.5,-0.5));
box.applyTransform(t);
for (int i = 0; i < 200; i++){
double y = i/10.0;
StraightLine line = new StraightLine(new PointND (-10, y ,0.0), new SimpleVector(1, 0, 0));
ArrayList<PointND> intersections = box.intersect(line);
PointND in = new PointND(0.5, y, 0.0);
PointND out = new PointND(-0.5, y, 0.0);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10, -0.25 +y,0.5), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0.5, -0.25+y, 0.5);
out = new PointND(-.50, -0.25+y, 0.5);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10, 0.25+y ,0.5), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0.5, 0.25+y, 0.5);
out = new PointND(-.50, 0.25+y, 0.5);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
t = new Translation(new SimpleVector(0,0.1,0));
box.applyTransform(t);
}
}
@Test
public void testBoxIntersectionRotationAndShift(){
Box box = new Box(1,1,1);
Translation t = new Translation(new SimpleVector(-0.5,-0.5,-0.5));
box.applyTransform(t);
ScaleRotate r = new ScaleRotate(Rotations.createBasicZRotationMatrix(Math.PI/2));
box.applyTransform(r);
for (int i = 0; i < 200; i++){
double y = -i/10.0;
box.applyTransform(r);
t = new Translation(new SimpleVector(0,y,0));
box.applyTransform(t);
StraightLine line = new StraightLine(new PointND (-10, y ,0.0), new SimpleVector(1, 0, 0));
ArrayList<PointND> intersections = box.intersect(line);
PointND in = new PointND(0.5, y, 0.0);
PointND out = new PointND(-0.5, y, 0.0);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10, -0.25 +y,0.5), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0.5, -0.25+y, 0.5);
out = new PointND(-.50, -0.25+y, 0.5);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10, 0.25+y ,0.5), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0.5, 0.25+y, 0.5);
out = new PointND(-.50, 0.25+y, 0.5);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
t = new Translation(new SimpleVector(0,-y,0));
box.applyTransform(t);
}
}
@Test
public void testBoxIntersectionRotationAndShiftXYZ(){
Box box = new Box(1,1,1);
Translation t = new Translation(new SimpleVector(-0.5,-0.5,-0.5));
box.applyTransform(t);
ScaleRotate r = new ScaleRotate(Rotations.createBasicZRotationMatrix(Math.PI/2));
box.applyTransform(r);
for (int i = 0; i < 200; i++){
double x = (Math.random() - 0.5)*50;
double y = (Math.random() - 0.5)*50;
double z = (Math.random() - 0.5)*50;
box.applyTransform(r);
t = new Translation(new SimpleVector(x,y,z));
box.applyTransform(t);
StraightLine line = new StraightLine(new PointND (-10+x, y ,z), new SimpleVector(1, 0, 0));
ArrayList<PointND> intersections = box.intersect(line);
PointND in = new PointND(0.5+x, y, z);
PointND out = new PointND(-0.5+x, y, z);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10+x, -0.25 +y,0.5+z), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0.5+x, -0.25+y, 0.5+z);
out = new PointND(-.5+x, -0.25+y, 0.5+z);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10+x, 0.25+y ,0.5+z), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0.5+x, 0.25+y, 0.5+z);
out = new PointND(-.5+x, 0.25+y, 0.5+z);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
t = new Translation(new SimpleVector(-x,-y,-z));
box.applyTransform(t);
}
}
@Test
public void testBoxIntersection45DegreeRotationAndShift(){
Box box = new Box(1,1,1);
Translation t = new Translation(new SimpleVector(-0.5,-0.5,-0.5));
box.applyTransform(t);
ScaleRotate r = new ScaleRotate(Rotations.createBasicZRotationMatrix(Math.PI/4));
box.applyTransform(r);
StraightLine line = new StraightLine(new PointND (-10, 0.0 ,0.0), new SimpleVector(1, 0, 0));
ArrayList<PointND> intersections = box.intersect(line);
PointND in = new PointND(Math.sqrt(2)/2, 0.0, 0.0);
PointND out = new PointND(-Math.sqrt(2)/2, 0.0, 0.0);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
line = new StraightLine(new PointND (-10, -Math.sqrt(2)/2 ,0.0), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0, -Math.sqrt(2)/2, 0.0);
Assert.assertTrue(intersections.contains(in));
line = new StraightLine(new PointND (-10, Math.sqrt(2)/2 ,0.0), new SimpleVector(1, 0, 0));
intersections = box.intersect(line);
in = new PointND(0, Math.sqrt(2)/2, 0.0);
Assert.assertTrue(intersections.contains(in));
}
@Test
public void testCompoundShapeIntersection(){
AbstractShape linepair = generateLP(0.5);
StraightLine line = new StraightLine(new PointND (-10, 0.0 ,0.0), new SimpleVector(1, 0, 0));
ArrayList<PointND> intersections = linepair.intersect(line);
PointND in = new PointND(-2.25, 0.0, 0.0);
PointND out = new PointND(2.25, 0.0, 0.0);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
}
@Test
public void testCompoundShapeIntersection90DegreeRotation(){
AbstractShape linepair = generateLP(0.5);
ScaleRotate r = new ScaleRotate(Rotations.createBasicZRotationMatrix(Math.PI/2));
linepair.applyTransform(r);
StraightLine line = new StraightLine(new PointND (0, -10.0 ,0.0), new SimpleVector(0, 1, 0));
ArrayList<PointND> intersections = linepair.intersect(line);
PointND in = new PointND(0.0,2.25, 0.0);
PointND out = new PointND(0.0, -2.25, 0.0);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
}
public CompoundShape generateLP(double gapSize){
int blocks = 5;
if (gapSize >= 1) blocks = 4;
if (gapSize >= 2.5) blocks = 3;
if (gapSize >= 5) blocks = 2;
double width = blocks * gapSize + (blocks-1) * gapSize;
double height = 5;
double centerX = width / 2;
double centerY = height / 2;
CompoundShape lp = new CompoundShape();
for (int i = 0; i < blocks; i++){
Box block = new Box(gapSize, height, height);
block.applyTransform(new Translation((-centerX)+(i*(2*gapSize)), -centerY, -centerY));
lp.add(block);
}
return lp;
}
@Test
public void testCompoundShapeIntersection45DegreeRotation(){
AbstractShape linepair = generateLP(0.5);
ScaleRotate r = new ScaleRotate(Rotations.createBasicZRotationMatrix(Math.PI/4));
linepair.applyTransform(r);
StraightLine line = new StraightLine(new PointND (-10, -10.0 ,0.0), new SimpleVector(1, 1, 0));
ArrayList<PointND> intersections = linepair.intersect(line);
PointND in = new PointND(2.25 * (Math.sqrt(2)/2),2.25 * (Math.sqrt(2)/2), 0.0);
PointND out = new PointND(-2.25 * (Math.sqrt(2)/2), -2.25 * (Math.sqrt(2)/2), 0.0);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
}
@Test
public void testCompoundShapeIntersection45DegreeRotationAndShift(){
AbstractShape linepair = generateLP(0.5);
ScaleRotate r = new ScaleRotate(Rotations.createBasicZRotationMatrix(Math.PI/4));
linepair.applyTransform(r);
Translation t = new Translation(new SimpleVector(0.0,0.0, 50));
linepair.applyTransform(t);
StraightLine line = new StraightLine(new PointND (-10, -10.0 ,50), new SimpleVector(1, 1, 0));
ArrayList<PointND> intersections = linepair.intersect(line);
PointND in = new PointND(2.25 * (Math.sqrt(2)/2),2.25 * (Math.sqrt(2)/2), 50.0);
PointND out = new PointND(-2.25 * (Math.sqrt(2)/2), -2.25 * (Math.sqrt(2)/2), 50.0);
Assert.assertTrue(intersections.contains(in));
Assert.assertTrue(intersections.contains(out));
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier, Rotimi X Ojo
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/