二点間の距離を求める

FireMonkey ではよく使う事になる座標計算です。XE3 以降では RTL 扱いなので VCL でも同じコードとなります。

二次元での二点間の距離の求め方はこうなります。

\[ \sqrt[]{(x_2-x_1)^2+(y_2-y_1)^2} \]

三次元での二点間の距離の求め方はこうなります。

\[ \sqrt[]{(x_2-x_1)^2+(y_2-y_1)^2+(z_2-z_1)^2} \]

「このくらいなら自前で計算した方が早い」 と仰る方もいらっしゃるかもしれませんが。


[二点間の距離を求める (整数座標)]

uses
  ..., System.Types;

var
  Coord1, Coord2: TPoint;
begin
  Coord1 := Point(  0,   0);
  Coord2 := Point(100100);
  ShowMessage(Coord1.Distance(Coord2).ToString);
//ShowMessage(FloatToStr(Coord1.Distance(Coord2))); // XE3 以前
end;

TPoint レコードのフィールド X / Y は Longint 型です。レコードに座標をセットするには Point() 関数を使うのが簡単です (コンストラクタ Create でも値をセットできます)。 TPoint レコードDistance() メソッドを使えば二点間の距離を求める事ができます。Distance() メソッドの戻り値は Double 型です。


[二点間の距離を求める (実数座標)]

uses
  ..., System.Types;

var
  Coord1, Coord2: TPointF;
begin
  Coord1 := PointF(  0.0,   0.0);
  Coord2 := PointF(100.0100.0);
  ShowMessage(Coord1.Distance(Coord2).ToString);
//ShowMessage(FloatToStr(Coord1.Distance(Coord2))); // XE3 以前
end;

TPointF レコードのフィールド X / Y は Single 型です。レコードに座標をセットするには PointF() 関数を使うのが簡単です (コンストラクタ Create でも値をセットできます)。 TPointF レコードDistance() メソッドを使えば二点間の距離を求める事ができます。Distance() メソッドの戻り値は Single 型です (XE4 以前は Double 型)。


[二点間の距離を求める (三次元座標)]

[XE3 以降]

uses
  ..., System.Math.Vectors; // XE6 以降
//..., System.Types;        // XE3~XE5

var
  Coord1, Coord2: TPoint3D;
begin
  Coord1 := Point3D(  0.0,   0.0,   0.0);
  Coord2 := Point3D(100.0100.0100.0);
  ShowMessage(Coord1.Distance(Coord2).ToString);
//ShowMessage(FloatToStr(Coord1.Distance(Coord2))); // XE3 以前
end;

TPoint3D レコードのフィールド X / Y / Z は Single 型です。レコードに座標をセットするには Point3D() 関数を使うのが簡単です (コンストラクタ Create でも値をセットできます)。 TPoint3D レコードDistance() メソッドを使えば二点間の距離を求める事ができます。Distance() メソッドの戻り値は Single 型です。

[XE2]

uses
  ..., FMX.Types3D;

var
  Coord1, Coord2: TPoint3D;
  Dist: Extended;
begin
  Coord1 := Point3D(  0.0,   0.0,   0.0);
  Coord2 := Point3D(100.0100.0100.0);
  Dist := Sqrt(Sqr(Coord2.X - Coord1.X) + Sqr(Coord2.Y - Coord1.Y) + Sqr(Coord2.Z - Coord1.Z));
  ShowMessage(FloatToStr(Dist));
end;

XE2 の TPoint3D には Distance() メソッドがないので自前で計算するしかありません。単なるレコード (構造体) なので、コンストラクタも持っていません。


See Also:


 BACK