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