import std.stdio;
import std.math.algebraic : hypot;
import std.random : Random, uniform;
/**
* 点
*/
struct Point
{
double x;
double y;
}
/**
* ユークリッド距離計算
* Params:
* p1 = 始点
* p2 = 終点
* Returns: ユークリッド距離
*/
pure nothrow @nogc double distance(Point p1, Point p2)
{
return hypot(p2.x - p1.x, p2.y - p1.y);
}
void main()
{
// テストデータ作成
immutable int numPoint = 10;
Point[] points = new Point[numPoint];
for (int i = 0; i < numPoint; i++)
{
// 0.0から10.0までの範囲でランダム座標を生成
points[i] = Point(uniform(0.0, numPoint), uniform(0.0, numPoint));
}
// 10回distance関数を実施
for (int i = 0; i < numPoint; i++)
{
int idx1 = cast(int) uniform(0, numPoint);
int idx2 = cast(int) uniform(0, numPoint);
// 同じ点はNG
while (idx1 == idx2)
{
idx2 = cast(int) uniform(0, numPoint);
}
// 距離計算
double dist = distance(points[idx1], points[idx2]);
// 結果表示
writefln("[%.4f, %.4f]から[%.5f, %.5f]の距離: %.4f",
points[idx1].x, points[idx1].y,
points[idx2].x, points[idx2].y,
dist);
}
}
// ユニットテスト
unittest
{
Point point1 = Point(2.0, 1.0);
Point point2 = Point(4.0, 1.0);
assert(distance(point1, point2) == 2.0);
}