wintabから傾きを取得するコード

Posted on Fri 24 December 2010 in ペイントツール

f:id:hiroki0:20101225035447j:image Azimuthがペンとタブレットの前後方向の軸がなす角、
Altitudeがペンとタブレット平面がなす角です。
ペンが逆さまのときAltitudeは負の値になります。
矢印が向いてるほうがタブレットの上側を表しています。

まず、取得するデータ型に傾きを定義するために、PK_ORIENTATIONをPACKETDATAに含めます。

#include <wintab.h>
#define PACKETDATA (PK_CURSOR | PK_X | PK_Y | PK_Z | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION)
#define PACKETMODE PK_BUTTONS
#include <pktdef.h>

タブレットからのデータを正規化するために、
WTInfo関数を呼び出して、AzimuthとAltitudeの最大値を調べています。

typedef UINT (API *WTInfo_)( UINT wCategory, UINT nIndex, LPVOID lpOutput );

HMODULE dll = LoadLibrary("wintab32.dll");
WTInfo_ wtInfo = (WTInfo_)GetProcAddress(dll, "WTInfoA");

double maxAzimuth;
double maxAltitude;
AXIS orientationInfo[3];

UINT res = wtInfo(WTI_DEVICES, DVC_ORIENTATION, &orientationInfo);
if (res != 0) {
  maxAzimuth = orientationInfo[0].axMax;
  maxAltitude = orientationInfo[1].axMax;
}

次は、タブレットデータ取得時のコードです。

typedef BOOL (API *WTPacket_)( HCTX Ctx, UINT wSerial, LPVOID lpPkt );

WTPacket_ wtPacket= (WTPacket_)GetProcAddress(m_dll, "WTPacket");
PACKET packet;
wtPacket((HCTX)lp, (UINT)wp, &packet);

double azimuth_rad = 2.0 * M_PI * ((double)packet.pkOrientation.orAzimuth / maxAzimuth);
double altitude_rad = (M_PI / 2.0) * ((double)packet.pkOrientation.orAzimuth/ maxAltitude);

正しく角度が取得できていれば、
azimuth_radは0から2π、altitude_radは-πからπの範囲の
値が入っているはずです。