Я пытался решить эту проблему по-разному, и после месяца попыток решить ее самостоятельно я думаю, что пришло время взглянуть на нее свежим взглядом. Я пытаюсь создать приложение для масштабирования изображения для изменения размера 8-битных спрайтов и превращения их в векторные изображения. До сих пор я работал над этим; он берет изображение, разбивает его на формы (области со смежными пикселями одного цвета), а затем каждый пиксель в форме заменяется четырьмя пикселями:
private Point[] expand(int x, int y){
x *= factor;
y *= factor;
return new Point[]{new Point(x+half_factor,y), new Point(x+factor,y+half_factor),
new Point(x+half_factor, y+factor), new Point(x,y+half_factor)};
}
Каждая из четырех точек помещается в двумерный логический массив:
private void placePoint(int x, int y){
table[x][y] = !table[x][y];
extrema(x,y);
}
И результат для одной отдельной формы выглядит так:
Теперь я хочу превратить все эти точки (за исключением тех, что внутри) в многоугольник, и я пробовал много разных решений, совсем недавно я пытался найти ближайшего соседа, пока он не дойдет до начала, но каждый алгоритм пробую не получается. В этом конкретном примере он попадает в перевернутую гумбу в правом нижнем углу и запутывается в кластере пикселей слева от него. Программа считает, что путь пройден, и создает линию оттуда в левый верхний угол, полностью игнорируя точки в левом нижнем квадранте.
Вот как я хочу, чтобы это выглядело:
Вот несколько вещей, которые всегда верны в моей ситуации и могут помочь найти работающий алгоритм:
- Первая точка в списке всех точек является частью самого внешнего пути
- Каждая точка на самом внешнем пути имеет соседа, который находится от нее либо на C единиц, либо на √C единиц.
- Самый внешний путь всегда будет закрытым путем
Любая помощь будет высоко ценится!
ОБНОВЛЕНИЕ:
Я пробовал все решения и предложения, приведенные ниже, и добился небольшого прогресса, но все же я не получаю желаемого результата.
ОРИГИНАЛ:
ВЫВОД:
ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ:
Теперь все работает, осталось исправить мелкие ошибки!
√2.C
единиц для диагонали 2. почему вы изменяете размер / учетверяет точки, если вы все равно собираетесь векторизовать? Если вы остаетесь на том же разрешении, вы можете использовать методы прямого 8-точечного соседства. И можете использовать A* напрямую, просто отключите начальную и конечную точки перед ее применением. Также может помочь Поиск дыр в двухточечных наборах?, поскольку ваш массив представляет собой карту плотности. - person Spektre   schedule 16.03.2016