Мое предложение не налагать ограничения, а просто рисовать, скажем, просто красный каркасный многоугольник, если для вас это неприемлемо.
Это более или менее похоже на то, когда программисты накладывают ограничения на поля ввода формы, например дата начала должна предшествовать дате окончания и не позволять вам вводить дату в поле начала, которое следует за датой в поле конца ... вынуждая пользователей сначала перейти на конечное поле, затем ввести дату окончания, а затем вставить табуляцию вернуться в поле начала, чтобы ввести правильную дату начала.
Просто показывать поля красным НАМНОГО более удобно ... и на самом деле требуется меньше кода.
Захват движений мыши редко является разумной идеей. Если вы не можете применить то, что просит пользователь, просто сделайте это очевидным, а не ограничивая движение ... возможно, пользователь перемещает первую вершину и хочет позже переместить другую вершину в положение, которое сделает ваше преобразование действительным (точно так же, как пример двух полей даты).
Если вы действительно думаете, что ДОЛЖНЫ всегда препятствовать неправильным позициям (и это, например, запретит пользователю переворачивать изображение, даже если ваше преобразование разрешит операцию переворачивания без проблем), то самое простое решение, которое приходит мне в голову, это просто иметь функцию isValid()
и просто не перемещать ключевую точку на новую позицию, если она недействительна.
Наличие кода, который «скользит» по недопустимым областям пространства состояний, - довольно сложная обработка IMO, в том числе из-за того, что недопустимые области будут довольно близки к «почти недействительным» областям.
Даже в том случае, если «скольжение» является требованием, я бы, вероятно, пошел на реализацию неявного подхода isValid()
, выполнив локальный поиск вокруг позиции ключевой точки, чтобы найти ближайшую действительную точку к точке, которую запрашивает пользователь.
Явное вычисление всех возможностей скольжения было бы кошмаром для получения правильной информации и поддержки, если вам нужно что-то изменить в алгоритме преобразования (и, следовательно, в том, что является действительным, а что нет).