Я разрабатываю приложение, чтобы проверить, является ли розыгрыш симметричным или нет. Все строки пользователей хранятся в ArrayList, состоящем из списка точек, также структурированного:
private ArrayList<ArrayList<Pair<Float,Float>>> segments = new ArrayList<>();
Вот как я строю область рисования:
Черная фигура является частью фона, и мне не нужно ее учитывать, когда нужно проверить симметрию. Мне нужен только его центр (который я храню как единую координату), так как мне нужно рассмотреть возможность проверки симметрии по нему. Поскольку рисунки делают дети, мне также нужно учитывать некоторую гибкость, поскольку линии никогда не будут точно симметричными. Я реализовал метод, который делит каждый сегмент на 10 частей, а затем проверяет, имеют ли координаты каждой части одинаковое увеличение/уменьшение:
private boolean checkShape (int z, ArrayList<Pair<Float,Float>> points) {
ArrayList<Pair<Float,Float>> copia = segments.get(z);
int nGroupsFirstShape = (segments.get(z).size()*10)/100;
int nValuesFirstShape[] = new int[10];
for (int j=0, j2=0; j<10; j++, j2+=nGroupsFirstShape) {
int sumValues=0;
sumValues+=copia.get(j2).first-copia.get(j2+nGroupsFirstShape-1).first;
sumValues+=copia.get(j2).second-copia.get(j2+nGroupsFirstShape-1).second;
nValuesFirstShape[j] = sumValues;
}
ArrayList<Pair<Float,Float>> copia2 = points;
int nGroupSecondShape = (copia2.size()*10)/100;
int nValuesSecondShape[] = new int[10];
for (int j=0, j2=0; j<10; j++, j2+=nGroupSecondShape) {
int sumValues=0;
sumValues+=copia2.get(j2).first-copia2.get(j2+nGroupSecondShape-1).first;
sumValues+=copia2.get(j2).second-copia2.get(j2+nGroupSecondShape-1).second;
nValuesSecondShape[j] = sumValues;
}
int differences[] = new int[10];
int numberOf = 0;
for (int index=0; index<10; index++) {
differences[index] = nValuesFirstShape[index] - nValuesSecondShape[index];
if (differences[index]<0) differences[index] = -differences[index];
if (differences[index]<nGroupsFirstShape*2.5) numberOf++;
}
if (numberOf>=6) return true; else return false;
}
Если это проверено хотя бы на 6 частях, то я могу считать отрезки симметричными. Огромная проблема этого метода заключается в том, что линии могут иметь разный размер. Знаете ли вы какие-либо методы расчета симметрии области рисования? Поскольку я сохраняю изображение в виде растрового изображения, я также пытался найти метод, чтобы вычислить его непосредственно в файле изображения, но ничего не нашел.