お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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