Пример #1
0
        public void testRayCast()
        {
            // Static RayCast tests
            Assert.AreEqual(double.PositiveInfinity, testRect.rayCast(new Ray2D(1.0d, 1.0d, -7.0d, -8.0d)), 0.000005d);
            Assert.AreEqual(System.Math.Sqrt(2), testRect.rayCast(new Ray2D(2.0d, 3.0d, 3.0d, 4.0d)), 0.000005d);

            // Serial RayCast tests
            Rect2D  randomRect;
            Line2D  currentSide;
            Point2D randomPointOnSide;
            Point2D randomPoint;
            int     i = 100;

            do
            {
                randomRect = new Rect2D(Util.generateRandomDoubleBetween(-1000.0d, 1000.0d), Util.generateRandomDoubleBetween(-1000.0d, 1000.0d), Util.generateRandomDoubleBetween(-1000.0d, 1000.0d), Util.generateRandomDoubleBetween(-1000.0d, 1000.0d));
                int j = 50;
                do
                {
                    currentSide       = new Line2D(randomRect.getUpperLeft(), randomRect.getUpperRight());
                    randomPointOnSide = currentSide.randomPoint();
                    randomPoint       = new Point2D(Util.generateRandomDoubleBetween(-1000.0d, 1000.0d), Util.generateRandomDoubleBetween(randomPointOnSide.getY(), 1000.0d));
                    Assert.AreEqual(randomPoint.distance(randomPointOnSide), randomRect.rayCast(new Ray2D(randomPoint, randomPoint.vec(randomPointOnSide))), 0.000005d);
                    currentSide       = new Line2D(randomRect.getLowerLeft(), randomRect.getLowerRight());
                    randomPointOnSide = currentSide.randomPoint();
                    randomPoint       = new Point2D(Util.generateRandomDoubleBetween(-1000.0d, 1000.0d), Util.generateRandomDoubleBetween(-1000.0d, randomPointOnSide.getY()));
                    Assert.AreEqual(randomPoint.distance(randomPointOnSide), randomRect.rayCast(new Ray2D(randomPoint, randomPoint.vec(randomPointOnSide))), 0.000005d);
                    currentSide       = new Line2D(randomRect.getLowerLeft(), randomRect.getUpperLeft());
                    randomPointOnSide = currentSide.randomPoint();
                    randomPoint       = new Point2D(Util.generateRandomDoubleBetween(-1000.0d, randomPointOnSide.getX()), Util.generateRandomDoubleBetween(-1000.0d, 1000.0d));
                    Assert.AreEqual(randomPoint.distance(randomPointOnSide), randomRect.rayCast(new Ray2D(randomPoint, randomPoint.vec(randomPointOnSide))), 0.000005d);
                    currentSide       = new Line2D(randomRect.getLowerRight(), randomRect.getUpperRight());
                    randomPointOnSide = currentSide.randomPoint();
                    randomPoint       = new Point2D(Util.generateRandomDoubleBetween(randomPointOnSide.getX(), 1000.0d), Util.generateRandomDoubleBetween(-1000.0d, 1000.0d));
                    Assert.AreEqual(randomPoint.distance(randomPointOnSide), randomRect.rayCast(new Ray2D(randomPoint, randomPoint.vec(randomPointOnSide))), 0.000005d);
                    j -= 1;
                } while (j > 0);
                i -= 1;
            } while (i > 0);
        }
Пример #2
0
        /**
         * Calculates the length of a ray until it intersects with a shape.<br/>
         * As this class uses the set maximum ray range to speed up this ray casting,<br/>
         * this function may return {@code double.PositiveInfinity} for a ray that intersects with an obstacle that is further away than the rayRange from the given starting point.
         * @param ray the ray to be used for ray casting.
         * @return the length of the ray.
         */
        public double rayCast(Ray2D ray)
        {
            double result      = double.PositiveInfinity;
            Rect2D rayBounding = new Rect2D(ray.getStart().getX() - rayRange, ray.getStart().getY() - rayRange, ray.getStart().getX() + rayRange, ray.getStart().getY() + rayRange);

            for (int i = 0; i < shapes.Size(); ++i)
            {
                Rect2D bounding = boundaries.Get(i);
                if (rayBounding.isInsideBorder(bounding.getLowerLeft()) ||
                    rayBounding.isInsideBorder(bounding.getUpperLeft()) ||
                    rayBounding.isInsideBorder(bounding.getLowerRight()) ||
                    rayBounding.isInsideBorder(bounding.getUpperRight()))
                {
                    double tmp = shapes.Get(i).rayCast(ray);
                    result = tmp < result ? tmp : result;
                }
            }
            return(result);
        }