wintabから傾きを取得するコード
Posted on Fri 24 December 2010 in ペイントツール
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は-πからπの範囲の
値が入っているはずです。