2

D3D アプリケーション用の単純なジェスチャ認識エンジンを作成しようとしています。ジェスチャ レコグナイザは、受信した各ポイントを容量 3 の boost::circular_buffer に格納し、次のようにバッファ内の類似の FrameID の数をカウントすることによって機能します。

UINT Trackball::CalculateGestureSize(Windows::UI::Input::PointerPoint ^ pPoint)
{
    // shift the circular buffer queue one if it's full (common case)
    if (m_pointQueue.full())
    {
        m_pointQueue.pop_back();
    }

    // then store our point
    m_pointQueue.push_front(*pPoint);

    // now we need to see how many of the points in the
    // circular buffer match the frame Id
    UINT gestureLength = 0;
    for (UINT i = 0; i < MAX_GESTURE_SIZE; i += 1)
    {
        if (m_pointQueue[i].FrameId == pPoint->FrameId)
        {
            gestureLength += 1;
        }
    }

    assert(gestureLength != 0);

    return gestureLength;
}

ただし、コンパイラはこの型をインスタンス化する方法を理解できません。

// a queue of size 3 that helps determine what kind of gesture we're working with
boost::circular_buffer<Windows::UI::Input::PointerPoint> m_pointQueue;

& と * は WinRT オブジェクトでは使用できないため:

boost/concept_check.hpp(195): error C3699: '&' : cannot use this indirection on type 'const Windows::UI::Input::PointerPoint' compiler replacing '&' with '^' to continue parsing

コンパイラのエラー リストは、そのエラーの連鎖的な影響により、非常に急速に長くなります。

現在、私の解決策は、PointerPoint に必要な情報を構造体にコピーし、それを boost::circular_buffer の型名として使用することです。

// So WinRT objects (like Windows::UI::Input::PointerPoint) can't
// be used in STL-like containers (like boost::circular_buffer)
// because * and & operators cannot be used on them, so I'm copying 
// the necessary info into this struct and using that instead
typedef struct 
{
    UINT FrameId;
    Windows::Foundation::Point Position;
} LocalPoint;

// a queue of size 3 that helps determine what kind of gesture we're working with
boost::circular_buffer<LocalPoint> m_pointQueue;

これは間違いなく機能しますが、より良い解決策があるかどうか疑問に思っていました。

読んでくれて、助けてくれてありがとう。

4

2 に答える 2