Я не знаю ни о каких библиотеках Java, но я бы подумал, что это не будет слишком сложно для программирования.Эта проблема может рассматриваться как производная от задачи подстроки, за исключением того, что у вас нет линейной строки.Вот некоторый псевдокод Java-ish, который, вероятно, довольно близок.
for(int x = 0; x < heightmap.width(); ++x)
for(int y = 0; y < heightmap.height(); ++y)
if(find_pattern(x, y))
// YAY! pattern starts at (x, y)
// start at (x, y) and find an exact match
boolean find_pattern(int x, int y)
{
for(int xx = 0; xx < pattern.width(); ++x)
for(int yy = 0; yy < pattern.width(); ++x)
if(heightmap[x + xx][y + yy] != pattern[xx][yy])
return false;
return true;
}
Это найдет точное совпадение.Если вы хотите что-то, скажем, плюс или минус 2, вам понадобится немного больше логики в find_pattern () вместо сравнения! =.
Могут быть и другие алгоритмы, которые работают лучше.Это, наверное, самое простое в программировании.В отношении сложности это происходит в O (n ^ 2 * m ^ 2): задано n - ширина и высота карты высот, а m - ширина и высота шаблона.
ПРИМЕЧАНИЕ: это не делает проверку границ!
Если вы реализуете проверку границ, это сократит количество необходимых сравнений, поскольку очевидно, что вышеуказанный шаблон не может начинаться в двух крайних правых столбцах карты высот.Интересно, что при проверке границ сложность переходит к O (n ^ 2), так как отношение n: m равно 1: 1 или 0: 1
.