47 lines
1.1 KiB
C#
47 lines
1.1 KiB
C#
using Shogi.Domain.Pieces;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Numerics;
|
|
|
|
namespace Shogi.Domain.Pathing
|
|
{
|
|
[DebuggerDisplay("{Direction} - {Distance}")]
|
|
public class Path
|
|
{
|
|
public Vector2 Direction { get; }
|
|
public Distance Distance { get; }
|
|
public Path(Vector2 direction, Distance distance = Distance.OneStep)
|
|
{
|
|
Direction = direction;
|
|
Distance = distance;
|
|
}
|
|
|
|
public Path Invert() => new(Vector2.Negate(Direction), Distance);
|
|
}
|
|
|
|
public static class PathExtensions
|
|
{
|
|
public static Path GetNearestPath(this IEnumerable<Path> paths, Vector2 start, Vector2 end)
|
|
{
|
|
if (!paths.DefaultIfEmpty().Any())
|
|
{
|
|
throw new ArgumentException("No paths to get nearest path from.");
|
|
}
|
|
|
|
var shortestPath = paths.First();
|
|
foreach (var path in paths.Skip(1))
|
|
{
|
|
var distance = Vector2.Distance(start + path.Direction, end);
|
|
var shortestDistance = Vector2.Distance(start + shortestPath.Direction, end);
|
|
if (distance < shortestDistance)
|
|
{
|
|
shortestPath = path;
|
|
}
|
|
}
|
|
return shortestPath;
|
|
}
|
|
}
|
|
}
|