gpt4 book ai didi

c++ - 给定触摸点列表,如何检测摇动手势?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:29:44 26 4
gpt4 key购买 nike

从一组点中检测摇晃手势,基本上是在寻找方向的三个变化:

示例:(我们只需要查看 x 坐标,因为我们只查看水平抖动,而不是垂直抖动)

1,2,3,4,5,6,7,8,[9],8,7,[6],[7]

在上面的x坐标序列中,我用[]标记了方向的变化。

问题是,在上述情况下,我们会检测到即使是微小的无意抖动 - 例如,如果你要求一个人将他的手指从屏幕底部直线拖动到顶部,他的手可能会移动不经意间有点左摇右晃,我们会认为这是“抖动”

示例:

1,2,[3],[2],[3].... (unintentional shake)

为了避免这种情况,我们需要某种阈值,只有超过该阈值我们才将运动视为抖动。例如,方向变化之间的差距至少为3分,值(value)的差异至少为4分。

所以我们应该有这样的东西:

1,2,3,4,5,6,7,8,[9],8,7,6,[5],6,7,8,[9]..... detected shake

1,2,3,4,5,6,7,8,[9],8,7,6,6,7,8,9..... ignored shake

1,2,3,2,1.... ignored shake...

这似乎很难实现,因为可能需要跟踪三个索引。我没有自己实现,而是想知道这是否是一个已知的算法以及我可以查找的解决方案?

最佳答案

根据导数描述函数运动变化的事实,你可以使用导数来轻松解决问题。

enter image description here

让我们举第一个例子:

1, 2, 3, 4, 5, 6, 7, 8, [9], 8, 7, [6], [7] 

通过找到这个序列的导数:

1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1
+ + + + + + + + - - - +

现在,很容易知道哪里发生了抖动。

另一个例子:

 1, 12, 15, 8, 3, 1, 0, 5, 17, 30

一阶导数:

11, 3, -7, -5, -2, -1, 5, 12, 13
+ + - - - - + + +

简单的实现(未经测试,未经优化):

template <typename valueType> // http://stackoverflow.com/a/67020/4523099
bool same_sign(typename valueType x, typename valueType y){
return (x >= 0) ^ (y < 0);
}

template <typename T>
std::vector<T> get_derivative(std::vector<T> vec_x){
for(size_t i=0;i<vec_x.size()-1;++i){
vec_x[i]= vec_x[i+1]-vec_x[i];
}
vec_x.pop_back();
return vec_x;
}

int main(){
std::vector<int> x{1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 7 };
auto first_derivative=get_derivative(x);
std::vector<size_t> indices_of_shakes;
for(size_t i=0;i<first_derivative.size()-1;++i){
if(!same_sign(first_derivative[i],first_derivative[i+1])){
indices_of_shakes.emplace_back(i);
}

}
}

关于c++ - 给定触摸点列表,如何检测摇动手势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43885270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com