public void SafeLocatePlaces(List <ShipmentNode> nodes, List <ShipmentEdge> edges) { iterations = 0; ResetIds(); float edge = Places[0].GetComponent <RectTransform>().sizeDelta.x / 2; float distanceMin = GetMinDistance(); Vector2 mapSize = Map.GetComponent <RectTransform>().sizeDelta / 2; float xMax = (mapSize.x - edge) * 0.95f; float yMax = (mapSize.y - edge) * 0.95f; List <MapPlace> locatedPlaces = new List <MapPlace>(Places.Count); Utils.Shuffle(Places); nodes.Sort((node1, node2) => node1.Type == ShipmentNodeType.Start ? -1 : node2.Type == ShipmentNodeType.Start ? 1 : ShipmentsView.instance.Model.GetEdgesByIdNode(node2.Id).Count - ShipmentsView.instance.Model.GetEdgesByIdNode(node1.Id).Count); SetFirstPlace(nodes[0], xMax, yMax); locatedPlaces.Add(Places[0]); Places[0].gameObject.SetActive(true); int i = 1; for (; i < nodes.Count; i++) { MapPlace mapPlace = Places[i]; mapPlace.gameObject.SetActive(true); ShipmentNode node = nodes[i]; mapPlace.SetData(node.Id, PlacesSprites[node.Id], CrosSprites[node.Type == ShipmentNodeType.Other ? 1 : 0], node.Type); if (iterations >= 100) { iterations = 0; locatedPlaces.Clear(); foreach (ShipmentEdge a in edges) { a.Length = 0; } SafeLocatePlaces(nodes, edges); return; } SafeLocatePlace(mapPlace, locatedPlaces, ShipmentsView.instance.Model.GetEdgesByIdNode(node.Id), xMax, yMax, distanceMin); } // Oculto los places no usados for (int j = Places.Count - 1; j >= i; j--) { Places[j].gameObject.SetActive(false); } foreach (ShipmentEdge shipmentEdge in edges) { if (shipmentEdge.Length == 0) { MapPlace place = Places.Find(e => e.Id == shipmentEdge.IdNodeA); MapPlace mapPlace = Places.Find(e => e.Id == shipmentEdge.IdNodeB); float distance = Vector2.Distance(place.transform.position, mapPlace.transform.position) / Ruler.GetUnityDistances(); shipmentEdge.Length = (int)distance; } } }
/* * public void LocatePlaces(List<ShipmentNode> nodes, List<ShipmentEdge> edges) * { * foreach (MapPlace mapPlace in Places.GetRange(1, Places.Count - 1)) * { * mapPlace.Id = -1; * } * * * float scaleFactor = FindObjectOfType<Canvas>().scaleFactor; * float edge = Places[0].GetComponent<RectTransform>().sizeDelta.x; * float distanceMin = Mathf.Sqrt(2)*edge; * Vector2 mapSize = Map.GetComponent<RectTransform>().sizeDelta; * float xMax = mapSize.x - edge / 2; * float yMax = mapSize.y * scaleFactor - edge; * * List<MapPlace> locatedPlaces = new List<MapPlace>(Places.Count); * SetFirstPlace(nodes[0], xMax, yMax); * locatedPlaces.Add(Places[0]); * int i = 1; * for (; i < nodes.Count; i++) * { * /* * if(nodes[i].Id == 0) continue; #1# * Places[i].SetData(nodes[i].Id, PlacesSprites[nodes[i].Id], CrosSprites[nodes[i].Type == ShipmentNodeType.Other ? 1 : 0], nodes[i].Type); * List<int> edgeDistances = new List<int>(); * /* List<MapPlace> listOfPlaces = * locatedPlaces.FindAll( * e => * { * ShipmentEdge shipmentEdge = ShipmentsView.instance.Model.GetEdgesByIdNode(Places[i].Id) * .Find(f => f.IdNodeA == e.Id || f.IdNodeB == e.Id); * if (shipmentEdge != null) edgeDistances.Add(shipmentEdge); * return shipmentEdge != null; * });#1# * List<MapPlace> listOfPlaces = locatedPlaces.FindAll( * e => * { * ShipmentEdge shipmentEdge = edges.Find(f => (f.IdNodeA == Places[i].Id && f.IdNodeB == e.Id) || (f.IdNodeB == Places[i].Id && f.IdNodeA == e.Id)); * if(shipmentEdge != null) edgeDistances.Add(shipmentEdge.Length); * return shipmentEdge != null; * }); * do * { * LocatePlace(Places[i], xMax, yMax); * * } while (!CheckEdgeDistances(Places[i], listOfPlaces, edgeDistances) || !CheckMinDistances(Places[i], locatedPlaces, distanceMin * 2)); * Places[i].gameObject.SetActive(true); * } * for (int j = Places.Count - 1; j >= i; j--) * { * Places[j].gameObject.SetActive(false); * } * } */ private void SetFirstPlace(ShipmentNode node, float xMax, float yMax) { Places[0].SetData(node.Id, FirstPlaceSprite, CrosSprites[node.Type == ShipmentNodeType.Other ? 1 : 0], node.Type); Places[0].transform.localPosition = new Vector2(-xMax, yMax); }