2009-07-28 2 views
1

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

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

if (!PointInPolygon(local, polyGon)) 
    { 
     Cursor.Position = safePoint; 
    } 
    else 
    { 
     safePoint = Cursor.Position; 
    } 

Я не люблю это по нескольким причинам:

  • Из-за замедления времени обновления или по какой-либо причине, я иногда в состоянии вырваться из коробки. Затем он сохраняет эту позицию как safePoint, за пределами многоугольника. Моя мышь затем застряла в этом положении.

  • Наклонные края должны опутать мышь в направлении наклона. Нажатие правой кнопки мыши на «/» образной стене должно заканчиваться курсором в верхнем правом углу. Но из-за характера этого подхода, переходя по линии, сброс курсора туда, где он был ранее. Продолжать движение по правому краю будет только сбрасывать курсор и не будет нажимать «вверх по склону».

Есть ли какие-либо другие подходы к решению этой проблемы? Меня беспокоит последний вопрос: это поперечное поведение склона является главной целью моей программы, и мне нужно заставить ее работать. Даже если я использую этот базовый метод, любые идеи для оптимизации этого конкретного поведения?


EDIT:

Были предложен Ридом, что я вместо того, чтобы вернуться к тому, что ближе всего к текущим недоступным точкам. Учитывая четыре угловые точки четырехугольника, как мне найти ближайшую точку в/на фигуре?

ответ

0
  1. Найти уравнение краевой линии с помощью двух конечных точек.
  2. - (1/slope) дает наклон перпендикулярной линии.
  3. Решите уравнение линии перпендикулярной линии, используя известную точку по краю (местоположение истинной мыши)
  4. Решите для пересечения краевой линии и перпендикулярной линии.
  5. Поместите поддельный курсор в это место.
2

Вместо отслеживания «safePoint», я хотел бы сделать следующее:

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

Он также устраняет необходимость сохранения состояния между вызовами (safepoint).

+0

Хм, отличная идея. Теперь мне нужно только выяснить, учитывая, что четыре точки, которые связывали четырехугольник, какой лучший/самый простой способ найти ближайшую точку? – cksubs

+0

Вот несколько алгоритмов для вас: http://www.devmaster.net/forums/archive/index.php/t-103.html С небольшими многоугольниками (зависит от вашей ситуации, но обычно менее 10 сегментов или около того), просто точка поиска грубой силы -> сегменты часто являются самым быстрым подходом. –

-1

ближайшая точка:

if(mouse.x > maxX) 
    mouse.x = maxX; 
else if(mouse.x < minX) 
    mouse.x = minX; 

// same for Y. 
+0

Это граница многоугольника, а не прямоугольник -1 –

+0

lol, служит мне для того, чтобы не смотреть на слово вверх :) – Eugene

+1

Ну, тогда просто поверните нормаль к каждой стороне и найдите кратчайшее расстояние между точкой и пересечением нормальной и боковой , – Eugene

2

Как ограничить точки P внутри выпуклой многоугольника (невыпуклые немного сложнее) в 2-D (предположим, по часовой стрелке обмотки порядка):

Для каждого края (Pi, Pj) многоугольника ...

Найти нормальный вектор N края (единичный вектор от Pi к Pj, поворачивается на 90 градусов)

Найти смещение D от края до точки P вдоль N (D = (Р - Р) точка N)

If D является положительным (или отрицательным против часовой стрелки обмотки порядка), то Р = Р - Н * D

Конец цикла :)

Смежные вопросы