/// <summary> /// Ищет путь от одной звездной системы до другой. (Старый метод) /// </summary> /// <param name="from">Начальная точка полета.</param> /// <param name="to">Конечная точка полета.</param> public static List <StarSystem> FindWay(StarSystem from, StarSystem to) { List <StarSystem> path = new List <StarSystem>(); if (from == null || to == null) { return(path); } StarSystem currSys = from, s, tS = null; path.Add(currSys); int breakPoint = 90; while (true) { Vector3 mainDirection = new Vector3(to.x - currSys.x, to.y - currSys.y, to.z - currSys.z); double minDistance = double.MaxValue; for (int i = 0; i < Program.Game.Galaxy.stars.Count; i++) { s = Program.Game.Galaxy.stars[i]; if (s == currSys) { continue; } Vector3 direction = new Vector3(s.x - currSys.x, s.y - currSys.y, s.z - currSys.z); double angle = mainDirection.ScalarWith(direction); double distance = DrawController.Distance(currSys, s); if (distance < minDistance && angle > 0) { minDistance = distance; tS = s; } } currSys = tS; path.Add(tS); if (path.Count > breakPoint) //Если путь не находится, тупо делаем как было) { path.Clear(); path.Add(from); path.Add(to); break; } if (tS == to) { break; } } return(path); }
/// <summary> /// Осуществляет движение флота. /// </summary> /// <param name="time">Время галактики</param> public override void Move(double time) { if (s2 == null)//обновляем координаты флота, если во время шага он остается в своей системе { y = s1.y; z = s1.z; x = s1.x; } else if (starDistanse > 0.5)//Обновляем координаты, если флот летит. динамический рассчет дистанции нужен для равномерного движения { onWay = true; double dx = (s2.x - x) / starDistanse; double dy = (s2.y - y) / starDistanse; double dz = (s2.z - z) / starDistanse; x += dx; y += dy; z += dz; starDistanse = DrawController.Distance(this, s2); } else//Флот долетел до звезды { s1 = s2; s2 = null; starDistanse = 0; onWay = false; s1.Discovered = true; s2 = path.Next(); if (s2 == null) { path.Clear(); starDistanse = 0; onWay = false; s1.Discovered = true; } else { starDistanse = DrawController.Distance(s1, s2); } x = s1.x; y = s1.y; z = s1.z; } }
/// <summary> /// Устанавливает цель для флота. /// </summary> /// <param name="s">Звездная система</param> public void setTarget(StarSystem s) { if (s == null) { path.Clear(); s2 = null; starDistanse = 0; } else { path.CalculateWay(s1, s); s2 = path.First; starDistanse = DrawController.Distance(path.First, this); } }
/// <summary> /// Расчитывает дистанции от каждой системы до каждой и заносит их в массив Distances /// </summary> public static void FillDistancesFrom(List <StarSystem> systems) { Distances = new double[systems.Count][]; for (int i = 0; i < systems.Count; i++) { Distances[i] = new double[systems.Count]; for (int j = 0; j < systems.Count; j++) { if (i == j) { Distances[i][j] = double.MaxValue; } else { Distances[i][j] = DrawController.Distance(systems[i], systems[j]); } } } }