お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"ArcTan2の使い方"






X,Y座標から角度を求める方法をタンジェント関数だけで苦心して
作っていたら、ArcTan2なる便利な関数があるのを知りました。
ご存知のかたには当たり前でしょうが、一応自分のような人のために。

適当な大きさのフォームを準備。
タイマーイベントの感覚は100ぐらい。
タイマー時とフォーム描画時のイベントを記述します。
uses節にMathユニットが必要です。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, Math;

const
  EyeX: Integer = 100;
  EyeY: Integer = 100;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    EyeD: Double;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  p: TPoint;
  dd, dx, dy: Double;
begin
  GetCursorPos(p);
  Windows.ScreenToClient(Handle,p);
  dx := p.x - EyeX;
  dy := p.y - EyeY;
  //
  //角度をラジアンで求める
  //
  dd := ArcTan2(dy, dx);
  if EyeD <> dd then begin
    EyeD := dd;
    invalidate;
  end;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  x, y: Integer;
begin
  With Canvas do begin
    //
    //角度から瞳の位置を決める
    //
    x := EyeX+Round(Cos(EyeD)*60);
    y := EyeY+Round(Sin(EyeD)*60);
    Pen.Width := 10;
    Brush.Color := clWhite;
    Ellipse(0,0,200,200);
    Brush.Color := clMaroon;
    Ellipse(x-30,y-30,x+30,y+30);
  end;
end;

end.

                                     00/06/06(火) 12:34 東洞31(CZB13222)

Original document by 東洞31        氏 ID:(CZB13222)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum