public AgentLocation getGoalLocation( AgentLocation location, Area sensorView )
    {
        Rectangle2D bounds = sensorView.getBounds();
        double curX        = location.getX();
        double curY        = location.getY();
        double curTheta    = location.getTheta();

        double newX     = -1;
        double newY     = -1;
        double newTheta = location.getTheta();

        int limit      = 1000;
        boolean placed = false;

        if ( !goals.isEmpty() )
        {
            AgentLocation p = goals.get( 0 );

            newX = p.getX();
            newY = p.getY();
            newTheta = p.getTheta();

            goals.remove( 0 );
        }
        else
        {
            while ( !placed && --limit > 0 )
            {
                double avgR = ( bounds.getWidth() + bounds.getHeight() ) / 2 ;

                for ( int i = 0; i < 200; i++ )
                {
                    double theta = i * PI / 50;
                    double r = ( 1 + .5 * rand.nextGaussian() ) * avgR;
                    newX = (int) round( r * cos( theta ) + curX ) + 5;
                    newY = (int) round( r * sin( theta ) + curY ) + 5;
                    newTheta = atan2( newY - curY, newX - curX );

                    if ( sensorView.contains( newX, newY ) )
                    {
                        AgentLocation goal  = new AgentLocation( newX, newY, newTheta );
                        Area path = new Area( new Rectangle2D.Double( curX, curY, hypot( newX - curX, newY - curY ), .5/*wingSpan/2*/ ) );
                        path.transform( AffineTransform.getRotateInstance( newTheta, curX, curY ) );
                        path.intersect( sensorView );
                        goals.add( goal );
                    }
                }

                newX = goals.get( 0 ).getX();
                newY = goals.get( 0 ).getY();
                goals.remove( 0 );

                if ( sensorView.contains( newX, newY ) )
                {
                    newTheta = atan2( newY - curY, newX - curX );
                    Area path = new Area( new Rectangle2D.Double( curX, curY, hypot( newX - curX, newY - curY ), .5/*wingSpan/2*/ ) );
                    path.transform( AffineTransform.getRotateInstance( newTheta, curX, curY ) );
                    path.intersect( sensorView );

                    if ( !path.isEmpty() && path.isSingular() ) { placed = true; }
                }
            }

            if ( !placed )
            {
                newX     = curX;
                newY     = curY;
                newTheta = curTheta + PI;
            }
        }

        return new AgentLocation( newX, newY, newTheta );
    }