Как найти точку в массиве точек, который находится ближе всего к другой точке - PullRequest
0 голосов
/ 19 мая 2019

PolygonPoints - массив точек, используемых для визуализации многоугольника. У меня также есть функция LINQ, которая возвращает точку, ближайшую к 0,0.

Как я могу изменить эту функцию LINQ , чтобы вернуть x, y в массиве PolygonPoints CLOSEST в текущую позицию мыши ?

1008 * LINQ *

    var PointClosestToZero = PolygonPoints.Aggregate(
    (minPoint, next) =>
         (minPoint.X * minPoint.X + minPoint.Y * minPoint.Y)
         < (next.X * next.X + next.Y * next.Y) ? minPoint : next);

1 Ответ

4 голосов
/ 20 мая 2019

Что делает это проще, так это написание небольших функций. По отдельности их легче понять, а затем, когда вы их соедините, их будет немного легче читать, потому что часть запроса содержит имена других функций. Это также очень помогает, если вы используете наиболее описательные имена переменных, какие только можете себе представить.

Далее вы упомянули, что у вас уже есть функция для нахождения точки в массиве, ближайшем к (0, 0). Если вы хотите найти точку в массиве, ближайшем к мыши, вам не нужна другая функция. Оба одинаковы. Вы пытаетесь найти точку в массиве, ближайшую к другой точке. Эта точка может быть (0,0) или позицией мыши.

Во-первых, если все это зависит от вычисления расстояния между двумя точками, напишите функцию только для этого. Это будет намного проще, чем включить его в запрос:

double DistanceBetweenPoints(Point p1, Point p2)
{
    return Math.Sqrt(Math.Pow((p2.X - p1.X), 2) + Math.Pow(p2.Y - p1.Y, 2));
}

Или со встроенной функциональностью:

double DistanceBetweenPoints(Point p1, Point p2)
{
    return (p2 - p1).Length;
}

Далее, если PolygonPoints - это массив Point, а mousePosition - это Point, то это даст вам точку в PolygonPoints ближайший mousePosition:

public Point FindClosest(Point[] searchIn, Point compareTo)
{
    return searchIn
        .Select(p => new {point = p, distance = DistanceBetweenPoints(p, compareTo)})
        .OrderBy(distances => distances.distance)
        .First().point;
}

Первый Select создает набор анонимных объектов, каждый из которых содержит Point и свое расстояние от точки сравнения.

Затем OrderBy приказывает найти тот, который наименьшим расстоянием

First() выбирает первое (наименьшее расстояние), а .point выбирает только Point из этого анонимного объекта. (First() приведет к исключению, если searchIn пусто. Вы могли бы сначала проверить этот аргумент и выдать ArgumentException, если массив пуст. Таким образом, легче определить, в чем проблема.)

Если вы хотите найти индекс ближайшей точки в исходном массиве, это будет

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