Найти ближайшие GraphicsPath
От: AGo Россия  
Дата: 30.03.05 00:43
Оценка:
Привет все..

есть массив GraphicsPath

Надо найти те элементы GraphicsPath из массива,
которые являются ближайшими соседями (сверу слева справа снизу) к указателю мыши

Люди выручайте
надо срочно


02.04.05 22:59: Перенесено модератором из '.NET' — AndrewVK
Re: Найти ближайшие GraphicsPath
От: PVitaliy Украина  
Дата: 30.03.05 07:56
Оценка:
Здравствуйте, 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
Надеюсь это поможет.
Re[2]: Найти ближайшие GraphicsPath
От: Кирилл Осенков Украина
Дата: 30.03.05 21:21
Оценка:
Здравствуйте, 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 и не мучаться
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.