Реализация края, ограничивающего мышь
-
19-09-2019 - |
Вопрос
Эта линия, иначе называемая «жестким краем», не может пересечь мышь.Полезно в играх и тому подобном.
В настоящее время у меня есть функция, которая возвращает значение, если курсор мыши находится в многоугольнике, нарисованном на экране.Если это не так, я перемещаю курсор к последней сохраненной точке многоугольника.
if (!PointInPolygon(local, polyGon))
{
Cursor.Position = safePoint;
}
else
{
safePoint = Cursor.Position;
}
Мне это не нравится по нескольким причинам:
Из-за медленного времени обновления или по какой-либо причине мне иногда удается выйти из коробки.Затем это положение сохраняется как SafePoint за пределами многоугольника.Моя мышь затем застревает в этом положении.
Наклонные края должны направлять мышь в направлении наклона.При повторном нажатии мыши вправо на стену в форме «/» курсор должен оказаться в верхнем правом углу.Но из-за характера этого подхода переход через линию вернет курсор туда, где он был раньше.Продолжение нажатия вправо приведет только к сбросу курсора, а не к его перемещению «вверх по склону».
Есть ли другие подходы к решению этой проблемы?Больше всего меня беспокоит последний вопрос:такое поведение при поперечном наклоне является основной целью моей программы, и мне нужно заставить его работать.Даже если я использую этот базовый метод, есть ли идеи по оптимизации этого конкретного поведения?
РЕДАКТИРОВАТЬ:
Рид предложил мне вместо этого вернуться к точке, БЛИЖАЙШЕЙ к текущей точке выхода за пределы поля.Учитывая 4 угловые точки четырехугольника, как мне найти ближайшую точку в форме?
Решение 3
Другие советы
Вместо отслеживания «safePoint» я бы сделал следующее:
Если вы оказались за пределами многоугольника, вместо возврата к последней известной безопасной точке поместите указатель мыши в точку, ближайшую к текущему местоположению мыши на/в многоугольнике.Это также улучшит ощущение, поскольку курсор будет иметь тенденцию (медленно) следовать наклонам на краях многоугольников и т. д.
Это также устраняет необходимость сохранять состояние между вызовами (точка сохранения).
Как ограничить точку п внутри выпуклый многоугольник (невыпуклый немного сложнее) в 2D (предположим, порядок намотки по часовой стрелке):
Для каждого края (Пи, Пиджей) из многоугольника...
Найдите нормальный вектор Н края (единичный вектор, указывающий от Пи к Пиджей, повернут на 90 градусов)
Найдите смещение Д от края до точки п вдоль Н ( D = (P - Пи) точка N )
Если Д положительно (или отрицательно при порядке намотки против часовой стрелки), тогда П = П - Н*Д
Конец цикла :)
Ближайшая точка:
if(mouse.x > maxX)
mouse.x = maxX;
else if(mouse.x < minX)
mouse.x = minX;
// same for Y.