Привет все..
есть массив GraphicsPath
Надо найти те элементы GraphicsPath из массива,
которые являются ближайшими соседями (сверу слева справа снизу) к указателю мыши
Люди выручайте
надо срочно
02.04.05 22:59: Перенесено модератором из '.NET' — AndrewVK
Здравствуйте, AGo, Вы писали:
AGo>Привет все..
AGo>есть массив GraphicsPath
AGo>Надо найти те элементы GraphicsPath из массива,
AGo>которые являются ближайшими соседями (сверу слева справа снизу) к указателю мыши
AGo>Люди выручайте
AGo>надо срочно
Попробуй так:
вначале все координаты точек GraphicsPath пересчитываем как будто они лежат в системе координат с центром в точке где у нас указатель мыши. Это делается так: X1new = X1 — X0; Y1new = Y1 — Y0, где X0 и Y0 координаты мыши, а X1 и Y1 -- координаты первой точки пути (и так для всех точек). Потом разделяем все точки на те которые лежат слева, сверху, справа, снизу по следующему признаку:
слева лежат те точки у которых: Xnew < 0 и abs(Ynew) < Xnew
справа лежат те точки у которых: Xnew > 0 и abs(Ynew) < Xnew
сверху лежат те точки у которых: abs(Xnew) < Ynew и Ynew > 0
снизу лежат те точки у которых: abs(Xnew) < Ynew и Ynew < 0
потом надо посчитать растояние каждой точки к центру, это
D = sqrt(Xnew*Xnew + Ynew*Ynew)
и выбрать минимальные. Работает такой расчет достаточно бысто чтобы вести его полностью на событие MouseMove
Надеюсь это поможет.
Здравствуйте, PVitaliy, Вы писали:
PV>потом надо посчитать растояние каждой точки к центру
PV>[...]
PV>и выбрать минимальные.
Ну это практически эквивалентно тому, что каждый Path считается выпуклым многоугольником, и строго говоря, даже при таком предположении дает далеко не всегда верные результаты (точка (0,0) удалена от квадрата (1,100)(1,-100)(201,100)(201,-100) всего на одну единицу, хотя расстояние до ближайшей вершины больше ста)
Надо по-любому определить абстрактную функцию "расстояние от точки до GraphicsPath", и подобрать наиболее эффективную.
Алгоритм же не меняется — перебирать расстояния до всех и выдать минимум.
Здесь нужно не забыть, что расстояние может быть равно 0 (т.е. точка находится внутри Path). Тогда из всех Path, расстояние до которых 0, нужно вернуть Path с максимальным Z-Order-ом (или любую, если Z-Order пофиг).
Самая простая функция — это действительно считать расстояние до Path расстоянием до ближайшей точки Path. Но она может дать чудовищную погрешность. Когда Path имеет маленькую выпуклую форму, и их много, то это скорее лучшее решение. С этим подходом могут напортить кривые Безье — они могут очень сильно отклоняться от описывающего четырехугольника.
Чуть-чуть сложнее и точнее — это взять аппроксимацию Path многоугольником. Т.е. соединять все точки отрезками, и опускать перпендикуляры. Длину кратчайшего перпендикуляра, основание которого принадлежит отрезку, можно взять за искомое расстояние. Здесь, опять же, кривые Безье могут создать неприятную ситуацию.
Еще сложнее — анализировать, из чего состоит Path, и построить сложный геометрический алгоритм, с учетом ориентации, счетчиков выпуклости и пр. Очень нетривиальная задача, но если точность очень важна, то сделать реально.
Так что можно смело взять вариант PVitaliy и не мучаться