Эти три класса недействительных полигонов должны быть проверены независимо.
Случай B:
Проверьте, чтобы убедиться, что нет повторяющихся вершин вашего многоугольника.
Случай C:
Проверьте, чтобы удостовериться, что никакие вершины не приземляться на любых краях. Предполагая, что вы используете числа с плавающей запятой, это может оказаться сложным, потому что числа с плавающей запятой должны были бы быть одинаковыми. Это можно обойти, сказав, что они не могут находиться в пределах EPS
друг от друга, но это может привести к недействительности некоторых других полигонов, которые почти недействительны. Я лично использовал бы сам EPS
, если бы мне не требовалась предельная точность (в этот момент я не знаю, что бы я сделал).
Случай D:
Как вы сказали, это можно найти, проверяя, если какие-либо ребра пересекаются.
Корпус E: Два края перекрываются (пересекаются в бесконечно много точек), а их вершины - нет.
Я не уверен, что это должен быть отдельный случай, но эта ситуация не может быть задержана проверкой на случай D (я думаю, что вы в конечном итоге разделите на ноль). Поэтому вам также нужно будет проверить, что два ребра не соответствуют точно такой же линии.
Я не могу думать ни о каких других случаях на данный момент
Просто проверьте пересечения вершинного края, а также перекрестные края. – Beta
B и C также должны пропустить проверку пересечения ребер, если есть фактическое пересечение. Угол, «очень близкий» к краю, не считается пересечением, верно? @Beta: точка не может пересекаться ни с чем. Что вы имеете в виду? –
Вы запускаете C++ в .Net/CLR Framework? –