Найдите три самых близких цели в ActionScript 3 - PullRequest
2 голосов
/ 01 октября 2008

У меня есть массив символов, которые являются точками, и я хочу взять любой символ и иметь возможность перебрать этот массив и найти 3 самых близких (используя Point.distance) соседа. Кто-нибудь может дать мне представление о том, как это сделать?

Ответы [ 3 ]

3 голосов
/ 01 октября 2008

Это новая и улучшенная версия кода, который я разместил вчера вечером. Он состоит из двух классов, PointTester и TestCase. На этот раз я тоже смог это проверить!

Начнем с TestCase.as

package  {

    import flash.geom.Point;
    import flash.display.Sprite;

    public class TestCase extends Sprite {

        public function TestCase() {
            // some data to test with
            var pointList:Array = new Array();
            pointList.push(new Point(0, 0));
            pointList.push(new Point(0, 0));
            pointList.push(new Point(0, 0));
            pointList.push(new Point(1, 2));
            pointList.push(new Point(9, 9));

            // the point we want to test against
            var referencePoint:Point = new Point(10, 10);

            var resultPoints:Array = PointTester.findClosest(referencePoint, pointList, 3);

            trace("referencePoint is at", referencePoint.x, referencePoint.y);
            for each(var result:Object in resultPoints) {
                trace("Point is at:", result.point.x, ", ", result.point.y, " that's ", result.distance, " units away");
            }
        }

    }

}

И это будет PointTester.as

package  {

    import flash.geom.Point;

    public class PointTester {

        public static function findClosest(referencePoint:Point, pointList:Array, maxCount:uint = 3):Array{

            // this array will hold the results
            var resultList:Array = new Array();

            // loop over each point in the test data
            for each (var testPoint:Point in pointList) {

                // we store the distance between the two in a temporary variable
                var tempDistance:Number = getDistance(testPoint, referencePoint);

                // if the list is shorter than the maximum length we don't need to do any distance checking
                // if it's longer we compare the distance to the last point in the list, if it's closer we add it
                if (resultList.length <= maxCount || tempDistance < resultList[resultList.length - 1].distance) {

                    // we store the testing point and it's distance to the reference point in an object
                    var tmpObject:Object = { distance : tempDistance, point : testPoint };
                    // and push that onto the array
                    resultList.push(tmpObject);

                    // then we sort the array, this way we don't need to compare the distance to any other point than
                    // the last one in the list
                    resultList.sortOn("distance", Array.NUMERIC );

                    // and we make sure the list is kept at at the proper number of entries
                    while (resultList.length > maxCount) resultList.pop();
                }
            }

            return resultList;
        }

        public static function getDistance(point1:Point, point2:Point):Number {
            var x:Number = point1.x - point2.x;
            var y:Number = point1.y - point2.y;
            return Math.sqrt(x * x + y * y);
        }
    }
}
0 голосов
/ 13 октября 2008

Если вы используете решение грейпфрукта, вы можете изменить метод getDistance на return x*x + y*y; вместо return Math.sqrt( x * x + y * y );

0 голосов
/ 06 октября 2008

Возможно, стоит упомянуть, что, если количество точек достаточно велико для того, чтобы производительность была важной, цель может быть достигнута быстрее, если сохранить два списка точек, один из которых отсортирован по X, а другой по Y. Один затем можно найти ближайшие 3 точки за время O (logn), а не за время O (n), просматривая каждую точку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...