Я предполагаю, что вы ищете общее решение.Как уже отмечали другие, вам нужно направление в качестве пропущенного ввода.В основном вы будете использовать направление и величину (в нашем случае 10) и конвертировать эти полярные координаты в декартовы.Затем вы добавляете получившиеся координаты вместе X + Xoffset = Xnew и Y + Yoffset = Ynew.
Подробности преобразования приведены здесь: http://www.mathsisfun.com/polar-cartesian-coordinates.html
Редактировать: послеРазместил свой код, ответ - нет.Случаи для NorthWest, SouthWest, NorthEast, SouthEast не верны.В этих случаях вы перемещаете 1,41 (приблизительно) пикселей.Вы не должны пытаться постепенно разгадать загадку.Используйте математическую полярную координату и суммируйте общее смещение, а затем округлите до ближайшего целого числа.
Вот упрощенный мод псевдокода для вашего решения:
public static Location2D DistanceToXY(Location2D current, Directions dir, int steps) {
ushort x = current.X;
ushort y = current.Y;
switch (dir) {
case Directions.North:
y=y+steps;
break;
case Directions.South:
y=y-steps;
break;
case Directions.East:
x=x+steps;
break;
case Directions.West:
x=x-steps;
break;
case Directions.NorthWest:
float sqrt2 = 2 ^ 0.5
x=x+int((sqrt2 * steps) + 0.5);
y=y-int((sqrt2 * steps) + 0.5);
break;
case Directions.SouthWest:
x=x-int((sqrt2 * steps) + 0.5);
y=y-int((sqrt2 * steps) + 0.5);
break;
case Directions.NorthEast:
x=x+int((sqrt2 * steps) + 0.5);
y=y+int((sqrt2 * steps) + 0.5);
break;
case Directions.SouthEast:
x=x-int((sqrt2 * steps) + 0.5);
y=y+int((sqrt2 * steps) + 0.5);
break;
}
return new Location2D(x, y);
}