/// <summary> /// Проверяет, допустимая ли дистанция для совершения действия. /// </summary> /// <param name="act"> Проверяемое действие. </param> /// <param name="currentCubePos"> Узел, из которого совершается действие. </param> /// <param name="targetCubePos"> Целевой узел. </param> /// <returns>Возвращает true, если дистанция допустима.</returns> public static bool CheckDistance(this ITacticalAct act, CubeCoords currentCubePos, CubeCoords targetCubePos) { var range = act.Stats.Range; var distance = currentCubePos.DistanceTo(targetCubePos); var isInDistance = range.Contains(distance); return(isInDistance); }
/// <summary> /// Рисует линию в кубических координатах. /// </summary> /// <param name="a"> Начало линии. </param> /// <param name="b"> Конец линии. </param> /// <returns> Набор координат, составляющих линию. </returns> public static CubeCoords[] CubeDrawLine(CubeCoords a, CubeCoords b) { var n = a.DistanceTo(b); var list = new List <CubeCoords>(); for (var i = 0; i <= n; i++) { LerpCube(a, b, 1.0f / n * i, out float cubeX, out float cubeY, out float cubeZ); var point = RoundCube(cubeX, cubeY, cubeZ); list.Add(point); } return(list.ToArray()); }
public static CubeCoords[] CubeDrawLine([NotNull] CubeCoords a, [NotNull] CubeCoords b) { var n = a.DistanceTo(b); var list = new List <CubeCoords>(); // Первую итерацию выполняем отдельно. // В ней всегда берём t=0 AddPointToList(a, b, list, 0); // Последующие итерации начинаем с 1, // т.к. первую итерацию обработали. for (var i = 1; i <= n; i++) { // t принимает значения 0..1. // Мы делим 1 на количество шагов n. // И берём i-тый шаг. var t = 1.0f / n * i; AddPointToList(a, b, list, t); } return(list.ToArray()); }