|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"マウスの回転を感知する関数"
こんにちは、妙義のかたつむりです
type
TMouseRotation = (mrNone, mrRight, mrLeft);
// マウスの回転
function GetMouseRotation(X, Y: Integer): TMouseRotation;
const
X0: integer = 0;
Y0: integer = 0;
X1: integer = 1;
Y1: integer = 1;
Rotation: real = 0;
var
Theta: real;
Ax, Ay, Bx, By: integer;
InnerProd, OuterProd: real;
begin
result:= mrNone;
Ax:= X-X1;
Ay:= Y-Y1; // vectorA: P(X1, Y1) → P(Y1, Y)
Bx:= X1-X0;
By:= Y1-Y0; // vectorB: P(X0, Y0) → P(X1, Y1)
repeat
OuterProd:= Ax*By-Ay*Bx;
if OuterProd = 0 then break;
InnerProd:= Ax*Bx+Ay*By;
if Abs(InnerProd) <= 1 then break;
Theta:= ArcCos(InnerProd/Sqrt(Ax*Ax+Ay*Ay)/Sqrt(Bx*Bx+By*By));
if OuterProd > 0 then Theta:= 0 - Theta;
Rotation:= Rotation + Theta;
if Rotation >= PI*2 then begin
result:= mrRight;
Rotation:= 0;
end else if Rotation <= -PI*2 then begin
result:= mrLeft;
Rotation:= 0;
end;
X0:= X1;
Y0:= Y1;
X1:= X;
Y1:= Y;
until true;
end;
------ 使用例 ----------
procedure TForm1.reLogViewMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
case GetMouseRotation(X, Y) of
mrRight: showmessage('右回り');
mrLeft: showmessage('左回り');
else ;
end;
end;
00/03/29(水) 22:45 妙義のかたつむり(QWK05270) __@ノ'
Original document by 妙義のかたつむり氏 ID:(QWK05270)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|