Вопрос

Эта линия, иначе называемая «жестким краем», не может пересечь мышь.Полезно в играх и тому подобном.

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

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

Мне это не нравится по нескольким причинам:

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

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

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


РЕДАКТИРОВАТЬ:

Рид предложил мне вместо этого вернуться к точке, БЛИЖАЙШЕЙ к текущей точке выхода за пределы поля.Учитывая 4 угловые точки четырехугольника, как мне найти ближайшую точку в форме?

Это было полезно?

Решение 3

<Ол> <Литий> Найти уравнение краевой линии с помощью двух конечных точек.
  • -. (1 / наклон) дает наклон перпендикулярной линии
  • <Литий> Решить для уравнения линии, перпендикулярной линии, используя известную точку через край (расположение истинной мыши) <Литий> Решить для пересечения линии кромки и перпендикулярной линии.
  • Поместите курсор поддельный в этом месте.
  • Другие советы

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

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

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

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

    Для каждого края (Пи, Пиджей) из многоугольника...

    Найдите нормальный вектор Н края (единичный вектор, указывающий от Пи к Пиджей, повернут на 90 градусов)

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

    Если Д положительно (или отрицательно при порядке намотки против часовой стрелки), тогда П = П - Н*Д

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

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

    if(mouse.x > maxX) 
        mouse.x = maxX;
    else if(mouse.x < minX)
        mouse.x = minX;
    
    // same for Y.
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top