Вы можете попытаться использовать алгоритм линии сканирования - для каждой линии многоугольника (так что y = min (y) .. max (y)), получите l = min (x) и r = max (x). Вычислите левый / правый уклон (дельтакс) и сравните его с уклоном предыдущей линии. Если это изменилось (используйте некоторый допуск здесь), вы находитесь в углу прямоугольника (или близко к нему). Это не будет работать во всех случаях, поскольку наклон не может быть таким точным из-за низкого разрешения, но для больших прямоугольников и наклонов, которые не слишком похожи, это должно работать.
По крайней мере, это хорошо работает для вашего примера:
X0000000000X l = 0, r = 11
.00000000000 l = 1, r = 11, deltaxl = 1, deltaxr = 0
..X000000000 l = 2, r = 11, deltaxl = 1, deltaxr = 0
.....0000000 l = 5, r = 11, deltaxl = 3, deltaxr = 0
........0000 l = 8, r = 11, deltaxl = 3, deltaxr = 0
...........X l = 11, r = 11, deltaxl = 3, deltaxr = 0
Вы начинаете с вершины прямоугольника, где вы получаете два разных значения для l и r, поэтому у вас уже есть два угла. С левой стороны, для первых трех строк вы получите deltax = 1, но после него вы получите deltax = 3, поэтому есть угол в (3, 3). С правой стороны ничего не меняется, deltax = 0, поэтому вы получаете только точку в конце.
Обратите внимание, что вы здесь "собираете" углы, поэтому, если у вас нет 4 углов в конце, уклоны были слишком похожи (или у вас есть изображение треугольника), и вы можете переключиться на другой ( точнее) алгоритм или просто выдают ошибку. То же самое, если у вас есть более 4 углов или некоторые другие странные вещи, такие как отверстия в прямоугольнике. Похоже, что происходит какое-то обнаружение изображений, поэтому такие случаи могут происходить, верно?
В некоторых случаях простой deltax = (x - lastx) не будет работать хорошо, см. Этот пример для левой части прямоугольника:
xxxxxx
xxxxx deltax = 1 dy/dx = 1/1 = 1
xxxxx deltax = 0 dy/dx = 2/1 = 2
xxxx deltax = 1 dy/dx = 3/2 = 1.5
xxxx deltax = 0 dy/dx = 4/2 = 2
xxx deltax = 1 dy/dx = 5/3 = 1.66
Иногда deltax равен 0, иногда равен 1. Лучше использовать наклон линии от фактической точки до верхней левой / правой точки (deltay / deltax). Используя его, вам все равно придется придерживаться допуска, но ваши значения будут уточняться с каждой новой строкой.