DGPointPairClass GetMinMax() { DGPointPairClass toReturn = new DGPointPairClass(); DGPointClass rMin = rooms[0].GetCorner(0); DGPointClass rMax = rooms[0].GetCorner(2); toReturn.point01 = new DGPointClass(rMin); toReturn.point02 = new DGPointClass(rMax); foreach (DGRoomClass room in rooms) { rMin = room.GetCorner(0); rMax = room.GetCorner(2); if (rMin.GetX() < toReturn.point01.GetX()) { toReturn.point01.SetX(rMin.GetX()); } if (rMin.GetY() < toReturn.point01.GetY()) { toReturn.point01.SetY(rMin.GetY()); } if (rMax.GetX() > toReturn.point02.GetX()) { toReturn.point02.SetX(rMax.GetX()); } if (rMax.GetY() > toReturn.point02.GetY()) { toReturn.point02.SetY(rMax.GetY()); } } foreach (DGRoomClass coridor in coridors) { rMin = coridor.GetCorner(0); rMax = coridor.GetCorner(2); if (rMin.GetX() < toReturn.point01.GetX()) { toReturn.point01.SetX(rMin.GetX()); } if (rMin.GetY() < toReturn.point01.GetY()) { toReturn.point01.SetY(rMin.GetY()); } if (rMax.GetX() > toReturn.point02.GetX()) { toReturn.point02.SetX(rMax.GetX()); } if (rMax.GetY() > toReturn.point02.GetY()) { toReturn.point02.SetY(rMax.GetY()); } } //Debug.Log("Minimum: " + toReturn.point01.ToString() + " Maximum: " + toReturn.point02.ToString()); return(toReturn); }
public void Generate() { int generatedRooms = 0; int genStep = 0; rooms = new List <DGRoomClass>(); coridors = new List <DGRoomClass>(); while (generatedRooms < roomsCount && genStep < generationCycleLimits) { DGRoomClass newRoom = GenerateRandomRoom(); //проверяем, пересекается ли комната с уже созданными if (!newRoom.IsTooSmall(coridorThicknes) && !newRoom.IsIntersect(rooms)) { rooms.Add(newRoom); generatedRooms++; } else { genStep++; } } if (rooms.Count > 1) {//есть хотя бы две комнаты, строим коридоры //для каждой ищем ближайшую for (int i = 0; i < rooms.Count; i++) { //int j = GetRoomToRoomClosestIndex(i); int[] toRoomClostArray = GetRoomToRoomClosestIndexesArray(i); for (int j = 0; j < coridorsCount; j++) { if (j < toRoomClostArray.Length) { int toRoomId = toRoomClostArray[j]; if (toRoomId != i && toRoomId > -1) { BuildCoridor(i, toRoomId); } } } } //дальше формируем матрицу с проходимостью DGPointPairClass minMax = GetMinMax(); dgMap = new DGMap(minMax.point02.GetY() - minMax.point01.GetY(), minMax.point02.GetX() - minMax.point01.GetX(), minMax.point01, minMax.point02); foreach (DGRoomClass room in rooms) { dgMap.FillByRoom(room, false); } foreach (DGRoomClass coridor in coridors) { dgMap.FillByRoom(coridor, true); } } }