マウスで3点をクリックして、1点めを原点(0)とし、2点目(1)と3点目(2)を挟む、
∠1,0,2の角度を求めたくて、Form1にLabel1を置いて、
次のように書いては見たのですが、どうしても答えが違うようです。
それに、3点目をクリックしたところで、結果を出したいのですが、これも4回目となります。
また、手取り足取りの質問ですが、よろしくお願いします。
Var
Mxy:array[0..2] of TPoint;
I:Integer=0;
TX1,TY1,TX2,TY2:Double;
C1,C2,AGL:Double;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If I<3 then
Begin
Mxy[I].x:=x; Mxy[I].y:=y;
I:=I+1;
end
else
If (I>2) then //3回クリックしたら角度計算
begin
TX1:=(Mxy[1].x-Mxy[0].x);
TY1:=(Mxy[1].y-Mxy[0].y);
TX2:=(Mxy[2].x-Mxy[0].x);
TY2:=(Mxy[2].y-Mxy[0].y);
C1:= ArcTan2(TY1,TX1);
C2:= ArcTan2(TY2,TX2);
AGL:=C1-C2;
Label1.Caption:='角度:'+FloatToStr(AGL);//結果表示
//点検用
Canvas.MoveTo(Mxy[2].x,Mxy[2].y);
Canvas.lineTo(Mxy[0].x,Mxy[0].y);
Canvas.lineTo(Mxy[1].x,Mxy[1].y);
I:=0;
end;
end;
end.
こうだな
procedure TForm4.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Mxy[I].x:=x; Mxy[I].y:=y;
Inc(I);
If (I>2) then //3回クリックしたら角度計算
begin
TX1:=(Mxy[1].x-Mxy[0].x);
TY1:=(Mxy[1].y-Mxy[0].y);
TX2:=(Mxy[2].x-Mxy[0].x);
TY2:=(Mxy[2].y-Mxy[0].y);
C1:= ArcTan2(TY1,TX1);
C2:= ArcTan2(TY2,TX2);
AGL:=C1-C2;
Label1.Caption:='角度:'+FloatToStr(AGL);//結果表示
//点検用
Canvas.MoveTo(Mxy[2].x,Mxy[2].y);
Canvas.lineTo(Mxy[0].x,Mxy[0].y);
Canvas.lineTo(Mxy[1].x,Mxy[1].y);
I:=0;
end;
end;
KHE00221さん、いつも有難うございます。
3点指示で表示出来るように成りました。
If I<3 thenは要らなかったんですね。知能テストを受けているようです(^^ゞ
ところで、角度の表し方は、
度、ラジアン、サイクル、グラード 等、普段なじみのない角度の表し方があるようですが
今回の場合、Label1に表示される角度の単位は何でしょう?
てっきり、「度」で表示されるものと思っていましたが、違うみたいですね。
Helpで「ArcTan2」を読むと「ラジアン」と書いていない?
>Helpで「ArcTan2」
戻り値は,-Pi 〜 Pi ラジアンになります。
書いてありました。
Helpを見てArcTan2を使ったのに・・・
ん? さん、KHE00221さん有難うございました。
ツイート | ![]() |