Network graph 시각화를 위한 뷰를 만드는 중에
노드에 사용자 interaction 처리에 대해 추가하고 싶은 것이 생겼다.
바로 흔드는 제스쳐이다.
노드를 잡고 흔들었을 때 액션을 주고 싶은 상황이다.
구글에 shake를 키워드로 검색하면 디바이스 자체를 흔드는 결과가 많이 나오고
원하는 결과를 찾기 힘들어 직접 만들어 보기로 했다.
먼저 "노드를 잡고 흔든다"의 정의를 내려야 겠다.
1. 흔드는 과정의 모션이벤트들은 기준이 되는 노드 주변에 특정 거리내에 존재해야 한다.
2. 흔드는 과정의 모션이벤트들은 기준이 되는 노드를 기준으로 반대편을 반복하는 시퀀스를 가져야 한다.
3. 흔드는 과정의 모션이벤트들의 속도는 일정 이상이어야 한다.
위 3가지 조건을 만족하도록 작성해보자.
일단 흔드는 모션이벤트를 수집하는 대략적인 시간이 필요하겠다.
이를 통하여 연산해야 하는 모션이벤트의 대략적인 개수를 파악할 필요가 있겠다.
일단 내 에뮬레이터에서는 초당 약 60번 수집을 하는 것을 확인할 수 있었다.
따라서, 0.5초 정도의 흔들기를 통해서 제스처 감지를 하려면 약 30개 정도의 모션 이벤트를 처리하여
위 조건들을 만족하는지 확인해야 한다.
1번 조건을 만족하는 검사는 매우 쉽겠다.
모션이벤트가 노드로 부터 떨어진 거리가 정한 threshold 보다 작은지 검사하면 되겠다.
약 30개 정도의 모션 이벤트를 처리할 때, 10% 미만 정도는 해당 조건을 만족하지 못하더라도
나머지 조건을 만족하면 흔드는 모션으로 인정해도 될 것 같다.
2번 조건을 만족하는 검사를 해보자.
먼저 위 조건2 이미지에서 2, 3, 4, 5와 같은 모션 이벤트 시퀀스에서 방향의 반환점 역할을 하는
요소들을 peak motion event라고 명명해주자.
먼저 peak motion event들을 찾아 주어야 하겠다.
위 처럼 모션이벤트 시퀀스에서 기준의 모션이벤트 전후의 모션이벤트를 통하여 내적연산을 하여 음수가 되면
1번 벡터와 2번 벡터는 반대 방향을 바라보는 상황임을 알 수 있다.
따라서, 시퀀스의 n번째 모션이벤트는 peak motion event가 되겠다.
이와 같은 방법으로 peak motion event subsequence를 찾아주었다면 이를 통해서
모션이벤트 시퀀스가 반복적으로 노드를 기준으로 반대방향에 존재하는지 확인해주자.
Peek를 찾았을 때와 같이 peek간에 노드를 기준으로 반대편에 있는 것을 조사할 생각이다.
하지만 한가지 기준을 추가하려고 한다.
두벡터의 내적연산은 90도만 초과하면 음수의 결과값을 얻을 수 있다.
이를 통해서 연속된 peek가 반대편에 있다고 말하기에는 힘들것 같다는 생각이 있다.
따라서, 각도를 약 140도 초과가 되도록 잡아주겠다.
두벡터의 내적연산을 수행할시에 평행할때를 기준으로 값의 75퍼센트 이상을 보장하는 기준으로 정했다.
위 조건을 만족하면 2번째 조건을 만족한다고 할 수 있겠다.
마지막 속도 조건은 1, 2조건을 만족한 모션이벤트 시퀀스의 처음과 마지막의 이벤트 타임이
일정 시간 이하로 설정해주면 되겠다.
나의 경우는 0.5초로 설정해주려고 한다.
실제 기능구현까지 시행착오는 다음에 작성하도록 하겠다.