比较图形值或结构

Ond*_*kar 9 java

我有一个Android应用程序,它获取手势坐标(3轴 - x,y,z).我需要将它们与我在数据库中的坐标进行比较,并确定它们是否相同.

我还需要增加一些容差,因为加速度计(捕获手势的设备)非常敏感.这很容易,但我也想考虑例如在空中画出的"大圆圈",就像在空中画出的"小圆圈"一样.意思是会有不同的值,但图的结构会是一样的,对吧?

我听说过将图值转换成位然后进行比较.这是正确的方法吗?这样的比较有没有图书馆?

到目前为止,我只是硬编码,涵盖了我的所有要求,除了最后一个(大圆圈与小圆圈).

我的代码现在:

 private int checkWhetherGestureMatches(byte[] values, String[] refValues) throws IOException {
        int valuesSize = 32;
        int ignorePositions = 4;

        byte[] valuesX = new byte[valuesSize];
        byte[] valuesY = new byte[valuesSize];
        byte[] valuesZ = new byte[valuesSize];

        for (int i = 0; i < valuesSize; i++) {
            int position = i * 3 + ignorePositions;
            valuesX[i] = values[position];
            valuesY[i] = values[position + 1];
            valuesZ[i] = values[position + 2];
        }


        Double[] valuesXprevious = new Double[valuesSize];
        Double[] valuesYprevious = new Double[valuesSize];
        Double[] valuesZprevious = new Double[valuesSize];


        for (int i = 0; i < valuesSize; i++) {
            int position = i * 3 + ignorePositions;
            valuesXprevious[i] = Double.parseDouble(refValues[position]);
            valuesYprevious[i] = Double.parseDouble(refValues[position + 1]);
            valuesZprevious[i] = Double.parseDouble(refValues[position + 2]);
        }


        int incorrectPoints = 0;
        for (int j = 0; j < valuesSize; j++) {
            if (valuesX[j] < valuesXprevious[j] + 20 && valuesX[j] > valuesXprevious[j] - 20
                    && valuesY[j] < valuesYprevious[j] + 20 && valuesY[j] > valuesYprevious[j] - 20
                    && valuesZ[j] < valuesZprevious[j] + 20 && valuesZ[j] > valuesZprevious[j] - 20) {
            } else {
                incorrectPoints++;
            }
        }
        return incorrectPoints;
    }
Run Code Online (Sandbox Code Playgroud)

编辑:

我发现JGraphT,它可能会奏效.如果您对此已有所了解,请告诉我.

EDIT2:

看到这些图像,它们是相同的手势,但是一个以比另一个更慢的动作完成.

更快一个: 快点

较慢的一个: 在此输入图像描述

我没有捕获相同手势的图像,其中一个比另一个小,可能稍后添加.

Ond*_*kar 0

我使用了算法的Java实现Dynamic Time Wrapping。该库称为 fastDTW。

不幸的是,据我了解,他们不再支持它,尽管我发现了它的用途。 https://code.google.com/p/fastdtw/

我现在不记得了,但我想我使用了这个并自己编译了它: https ://github.com/cscotta/fastdtw/tree/master/src/main/java/com/fastdtw/dtw