use of aima.core.util.math.geom.shapes.Circle2D in project aima-java by aimacode.
the class SVGGroupParserTest method setUp.
@Before
public void setUp() {
testGroup = new ArrayList<IGeometric2D>();
testGroup.ensureCapacity(10);
testGroup.add(new Polyline2D(testVertices1, true));
testGroup.add(new Line2D(15.0d, 15.0d, 200.0d, 100.0d));
testGroup.add(new Ellipse2D(new Point2D(300.0d, 80.0d), 60.0d, 40.0d));
testGroup.add(new Circle2D(new Point2D(180.0d, 160.0d), 20.0d));
testGroup.add(new Rect2D(161.0d, 200.0d, 261.0d, 250.0d));
testGroup.add(new Polyline2D(testVertices2, true));
testGroup.add(new Line2D(0.0d, 0.0d, 700.0d, 0.0d));
testGroup.add(new Line2D(700.0d, 0.0d, 700.0d, 500.0d));
testGroup.add(new Line2D(700.0d, 500.0d, 0.0d, 500.0d));
testGroup.add(new Line2D(0.0d, 500.0d, 0.0d, 0.0d));
testParser = new SVGGroupParser();
}
use of aima.core.util.math.geom.shapes.Circle2D in project aima-java by aimacode.
the class SVGGroupParserTest method testParse.
@Test
public void testParse() {
IGeometric2D x;
IGeometric2D y;
Iterator<IGeometric2D> j;
try {
j = testParser.parse(this.getClass().getResourceAsStream(file), groupID).iterator();
Iterator<IGeometric2D> i = testGroup.iterator();
while (i.hasNext()) {
x = i.next();
y = j.next();
if (x instanceof Circle2D && y instanceof Circle2D) {
assertEquals("Circle: Center-X.", ((Circle2D) (y)).getCenter().getX(), ((Circle2D) (x)).getCenter().getX(), 0.000005d);
assertEquals("Circle: Center-Y.", ((Circle2D) (y)).getCenter().getY(), ((Circle2D) (x)).getCenter().getY(), 0.000005d);
assertEquals("Circle: Radius.", ((Circle2D) (y)).getRadius(), ((Circle2D) (x)).getRadius(), 0.000005d);
} else if (x instanceof Ellipse2D && y instanceof Ellipse2D) {
assertEquals("Ellipse: Center-X.", ((Ellipse2D) (y)).getCenter().getX(), ((Ellipse2D) (x)).getCenter().getX(), 0.000005d);
assertEquals("Ellipse: Center-Y.", ((Ellipse2D) (y)).getCenter().getY(), ((Ellipse2D) (x)).getCenter().getY(), 0.000005d);
assertEquals("Ellipse: Horizontal length.", ((Ellipse2D) (y)).getHorizontalLength(), ((Ellipse2D) (x)).getHorizontalLength(), 0.000005d);
assertEquals("Ellipse: Vertical length.", ((Ellipse2D) (y)).getVerticalLength(), ((Ellipse2D) (x)).getVerticalLength(), 0.000005d);
assertEquals("Ellipse: Rotation angle.", ((Ellipse2D) (y)).getAngle(), ((Ellipse2D) (x)).getAngle(), 0.000005d);
} else if (x instanceof Line2D && y instanceof Line2D) {
assertEquals("Line: Start-X.", ((Line2D) (y)).getStart().getX(), ((Line2D) (x)).getStart().getX(), 0.000005d);
assertEquals("Line: Start-Y.", ((Line2D) (y)).getStart().getY(), ((Line2D) (x)).getStart().getY(), 0.000005d);
assertEquals("Line: End-X.", ((Line2D) (y)).getEnd().getX(), ((Line2D) (x)).getEnd().getX(), 0.000005d);
assertEquals("Line: End-Y.", ((Line2D) (y)).getEnd().getY(), ((Line2D) (x)).getEnd().getY(), 0.000005d);
} else if (x instanceof Polyline2D && y instanceof Polyline2D) {
if (((Polyline2D) x).getVertexes().length != ((Polyline2D) x).getVertexes().length)
fail();
else {
for (int k = 0; k < ((Polyline2D) x).getVertexes().length; k++) {
assertEquals("Polygon: Vertex-X", ((Polyline2D) x).getVertexes()[k].getX(), ((Polyline2D) y).getVertexes()[k].getX(), 0.000005d);
assertEquals("Polygon: Vertex-Y", ((Polyline2D) x).getVertexes()[k].getY(), ((Polyline2D) y).getVertexes()[k].getY(), 0.000005d);
}
}
} else if (x instanceof Rect2D && y instanceof Rect2D) {
assertEquals("Line: UpperLeft-X.", ((Rect2D) (y)).getUpperLeft().getX(), ((Rect2D) (x)).getUpperLeft().getX(), 0.000005d);
assertEquals("Line: UpperLeft-Y.", ((Rect2D) (y)).getUpperLeft().getY(), ((Rect2D) (x)).getUpperLeft().getY(), 0.000005d);
assertEquals("Line: LowerRight-X.", ((Rect2D) (y)).getLowerRight().getX(), ((Rect2D) (x)).getLowerRight().getX(), 0.000005d);
assertEquals("Line: LowerRight-Y.", ((Rect2D) (y)).getLowerRight().getY(), ((Rect2D) (x)).getLowerRight().getY(), 0.000005d);
}
}
assertFalse("Both groups are the same length and contain only legal shapes.", i.hasNext() || j.hasNext());
} catch (XMLStreamException e) {
e.printStackTrace();
fail();
} catch (NullPointerException e) {
e.printStackTrace();
fail();
}
}
use of aima.core.util.math.geom.shapes.Circle2D in project aima-java by aimacode.
the class Circle2DTest method testRayCast.
@Test
public final void testRayCast() {
// static tests
assertEquals("Ray doesn't intersect.", Double.POSITIVE_INFINITY, testCircle.rayCast(new Ray2D(1.0d, 1.0d, 0.0d, 2.0d)), 0.000005d);
assertEquals("Ray intersects.", Math.sqrt(2), testCircle.rayCast(new Ray2D(11.0d, 3.0d, 12.0d, 4.0d)), 0.000005d);
// serial tests
Circle2D randomCircle;
Point2D randomPointOnCircle;
Point2D randomPoint;
double currentRadius;
double xvalue;
double yvalue;
int sector;
int counter = 1000;
do {
randomCircle = new Circle2D(new Point2D(Util.generateRandomDoubleBetween(-500.0d, 500.0d), Util.generateRandomDoubleBetween(-500.0d, 500.0d)), Util.generateRandomDoubleBetween(0.0d, 200.0d));
currentRadius = randomCircle.getRadius();
xvalue = Util.generateRandomDoubleBetween(0.0d, currentRadius);
yvalue = Math.sqrt(currentRadius * currentRadius - xvalue * xvalue);
sector = Util.randomNumberBetween(1, 4);
switch(sector) {
case 2:
{
yvalue = -yvalue;
randomPoint = new Point2D(Util.generateRandomDoubleBetween(randomCircle.getCenter().getX() + xvalue, 1000.0d), Util.generateRandomDoubleBetween(-1000.0d, randomCircle.getCenter().getY() + yvalue));
break;
}
case 3:
{
xvalue = -xvalue;
yvalue = -yvalue;
randomPoint = new Point2D(Util.generateRandomDoubleBetween(-1000.0d, randomCircle.getCenter().getX() + xvalue), Util.generateRandomDoubleBetween(-1000.0d, randomCircle.getCenter().getY() + yvalue));
break;
}
case 4:
{
xvalue = -xvalue;
randomPoint = new Point2D(Util.generateRandomDoubleBetween(-1000.0d, randomCircle.getCenter().getX() + xvalue), Util.generateRandomDoubleBetween(randomCircle.getCenter().getY() + yvalue, 1000.0d));
break;
}
default:
{
randomPoint = new Point2D(Util.generateRandomDoubleBetween(randomCircle.getCenter().getX() + xvalue, 1000.0d), Util.generateRandomDoubleBetween(randomCircle.getCenter().getY() + yvalue, 1000.0d));
break;
}
}
randomPointOnCircle = new Point2D(randomCircle.getCenter().getX() + xvalue, randomCircle.getCenter().getY() + yvalue);
// System.out.printf("Circle at (%.2f,%.2f), Radius %.2f. Point on Circle: (%.2f,%.2f). Outside Point: (%.2f,%.2f). Distance: %.2f.\n", randomCircle.getCenter().getX(), randomCircle.getCenter().getY(), randomCircle.getRadius(), randomPointOnCircle.getX(), randomPointOnCircle.getY(), randomPoint.getX(), randomPoint.getY(), randomPoint.distance(randomPointOnCircle));
assertEquals("Serial rayCast test for Circle2D.", randomPoint.distance(randomPointOnCircle), randomCircle.rayCast(new Ray2D(randomPoint, randomPoint.vec(randomPointOnCircle))), 0.000005d);
counter -= 1;
} while (counter > 0);
}
use of aima.core.util.math.geom.shapes.Circle2D in project aima-java by aimacode.
the class Circle2DTest method setUp.
@Before
public void setUp() {
center = new Point2D(12.0d, 14.0d);
testCircle = new Circle2D(center, 10.0d);
zeroPoint = new Point2D(0.0d, 0.0d);
}
use of aima.core.util.math.geom.shapes.Circle2D in project aima-java by aimacode.
the class SVGGroupParser method parseCircle.
/**
* Parses the current element as a circle. This circle is added to the {@code shapes} if it is rendered.
*/
private void parseCircle() {
String value = reader.getAttributeValue(null, CX_ATTRIBUTE);
final double cx = parseNumber(value);
value = reader.getAttributeValue(null, CY_ATTRIBUTE);
final double cy = parseNumber(value);
value = reader.getAttributeValue(null, R_ATTRIBUTE);
final double r = parseNumber(value);
if (r != 0.0d) {
//SVG standard specifies that the radius is forced to have a value. Otherwise the rendering for this element is disabled.
IGeometric2D circle = new Circle2D(new Point2D(cx, cy), r).transform(currentMatrix);
shapes.add(circle);
}
}
Aggregations