public static NodeWeb GenerateWebPlane(Vector2 dimensions, int countMin, int countMax, int connectionsMin, int connectionsMax) { var count = Random.Range(countMin, countMax + 1); var nodeWeb = new NodeWeb(); var startX = -(dimensions.x / 2); var startY = -(dimensions.y / 2); // Create nodes for (int i = 0; i < count; i++) { // Generate node var newNode = new Node(nodeWeb); // Give it a random position, within constraints of plane var posX = Random.Range(0, dimensions.x); var posY = Random.Range(0, dimensions.y); newNode.Position = new Vector3(startX + posX, 0, startY + posY); // Store in nodeweb nodeWeb.Nodes.Add(newNode); } // Connect nodes var connectionLimits = new int[count]; if (connectionsMax > 0) { for (int i = 0; i < count; i++) { // Define and track # of connections for node i connectionLimits[i] = Random.Range(connectionsMin, connectionsMax < count - 1 ? connectionsMax : count - 1); // Generate needed connections var connectionsToCreate = connectionLimits[i] - nodeWeb.Nodes[i].ConnectionCount; if (connectionsToCreate > nodeWeb.Nodes[i].ConnectionsAvailable) { connectionsToCreate = nodeWeb.Nodes[i].ConnectionsAvailable; } for (int n = 0; n < connectionsToCreate; n++) { // Connect node i with a random node in its web var connectionIsValid = false; do { var randomOtherNode = nodeWeb.Nodes[Random.Range(0, nodeWeb.NodeCount)]; connectionIsValid = nodeWeb.Nodes[i].ConnectTo(randomOtherNode); }while (!connectionIsValid); } } } //nodeWeb.UpdateConnections(); return(nodeWeb); }
public static List <NodeConnection> MapConnectionsIn(NodeWeb web) { var connections = new List <NodeConnection>(); foreach (Node node in web.Nodes) { // Loop thru each node // Add each connection if not already in list foreach (Node connected in node.Connected) { var connection = new NodeConnection(node, connected); if (connections.Contains(connection)) { continue; } else { connections.Add(connection); } } } return(connections); }