protected void UpdateEdges() { sceneComponents.AcceptEdge(edgeComponent => { AbstractGraphEdge edge = edgeComponent.GetGraphEdge(); AbstractGraphNode startNode = edge.GetStartGraphNode(); AbstractGraphNode endNode = edge.GetEndGraphNode(); sceneComponents.GetNodeComponent(startNode.GetId()).ConnectedRb.Add(sceneComponents.GetNodeComponent(endNode.GetId()).Rb); sceneComponents.GetNodeComponent(endNode.GetId()).ConnectedRb.Add(sceneComponents.GetNodeComponent(startNode.GetId()).Rb); edgeComponent.UpdateGeometry( sceneComponents.GetNodeComponent(startNode.GetId()).GetVisualComponent().transform.position, sceneComponents.GetNodeComponent(endNode.GetId()).GetVisualComponent().transform.position); }); float MostEdgesNodeCount = 0; foreach (var n in sceneComponents.nodeComponents) { if (n.ConnectedRb.Count > MostEdgesNodeCount) { MostEdgesNodeCount = n.ConnectedRb.Count; } } foreach (var n in sceneComponents.nodeComponents) { if (n.ConnectedRb.Count == MostEdgesNodeCount) { n.SetPosition(Vector3.zero); } } }
private void DrawGraphEdge(AbstractGraphEdge edge) { if (graphSceneComponents.HasEdgeComponent(edge)) { return; } EdgeComponent edgeComponent = new EdgeComponent(edge, graphScenePrefabs.InstantiateEdge()); graphSceneComponents.AddEdgeComponent(edgeComponent); NodeComponent startNode = graphSceneComponents.GetNodeComponent(edgeComponent.GetGraphEdge().GetStartGraphNode().GetId()); NodeComponent endNode = graphSceneComponents.GetNodeComponent(edgeComponent.GetGraphEdge().GetEndGraphNode().GetId()); if (endNode == null) { return; } SpringJoint spring = endNode.GetVisualComponent().GetComponent <SpringJoint> (); spring.connectedBody = startNode.GetVisualComponent().GetComponent <Rigidbody> (); // checking if there is any other edge connecting the same nodes long sameNodeConnections = 0; graphSceneComponents.AcceptEdge(existingEdgeComponent => { AbstractGraphEdge existingEdge = existingEdgeComponent.GetGraphEdge(); AbstractGraphNode existingStartNode = existingEdge.GetStartGraphNode(); AbstractGraphNode existingEndNode = existingEdge.GetEndGraphNode(); if ( existingStartNode.GetId() == startNode.GetGraphNode().GetId() && existingEndNode.GetId() == endNode.GetGraphNode().GetId() || existingStartNode.GetId() == endNode.GetGraphNode().GetId() && existingEndNode.GetId() == startNode.GetGraphNode().GetId() ) { sameNodeConnections = sameNodeConnections + 1; } }); if (sameNodeConnections > 1) { edgeComponent.MultiEdge = true; } }
public void AddEdgeComponent(EdgeComponent edgeComponent) { AbstractGraphEdge edge = edgeComponent.GetGraphEdge(); NodeComponent edgeStartNode = GetNodeComponent(edge.GetStartGraphNode().GetId()); if (edgeStartNode == null) { Debug.Log("Unable to find start node component."); return; } NodeComponent edgeEndNode = GetNodeComponent(edge.GetEndGraphNode().GetId()); if (edgeEndNode == null) { Debug.Log("Unable to find end node component."); return; } edgeComponents.Add(edgeComponent); edgeComponent.UpdateGeometry(edgeStartNode.GetVisualComponent().transform.position, edgeEndNode.GetVisualComponent().transform.position); }
private void InitializeEdgeComponent() { LineRenderer line = GetVisualComponent().GetComponent <LineRenderer> (); line.name = "Edge_" + graphEdge.GetId(); float angle = UnityEngine.Random.Range(0, 360); float xRotation = Mathf.Cos(Mathf.Deg2Rad * angle) * 100; float yRotation = Mathf.Sin(Mathf.Deg2Rad * angle) * 100; float zRotation = Mathf.Cos(Mathf.Deg2Rad * angle) * 100; GetVisualComponent().transform.Rotate(new Vector3(xRotation, yRotation, zRotation)); relationship = GetVisualComponent().GetComponent <Relationship>(); relationship.LR = line; relationship.Node1 = GameObject.Find("Node_" + graphEdge.GetStartGraphNode().GetId().ToString()).GetComponent <Node>(); relationship.Node2 = GameObject.Find("Node_" + graphEdge.GetEndGraphNode().GetId().ToString()).GetComponent <Node>(); relationship.RelationshipType = graphEdge.GetRType(); sourceRb = relationship.Node1.GetComponent <Rigidbody>(); targetRb = relationship.Node2.GetComponent <Rigidbody>(); }
public void Update(float time) { graphSceneComponents.AcceptEdge(edgeComponent => { AbstractGraphEdge edge = edgeComponent.GetGraphEdge(); AbstractGraphNode startNode = edge.GetStartGraphNode(); AbstractGraphNode endNode = edge.GetEndGraphNode(); NodeComponent startNodeComponent = graphSceneComponents.GetNodeComponent(startNode.GetId()); NodeComponent endNodeComponent = graphSceneComponents.GetNodeComponent(endNode.GetId()); // ---- distance function start float distance = 1F / startNode.GetDegree(); distance *= 100; distance *= 4; SpringJoint springJoint = endNodeComponent.GetVisualComponent().GetComponent <SpringJoint>(); springJoint.maxDistance = distance; springJoint.minDistance = distance; SphereCollider collider = endNodeComponent.GetVisualComponent().GetComponent <SphereCollider>(); collider.radius = distance * 0.3F; endNodeComponent.GetVisualComponent().GetComponent <Rigidbody>().mass = 5; // ---- distance function end // magic Rigidbody body = endNodeComponent.GetVisualComponent().GetComponent <Rigidbody>(); body.inertiaTensor = new Vector3(0.01F, 0.01F, 0.01F); edgeComponent.UpdateGeometry( startNodeComponent.GetVisualComponent().transform.position, endNodeComponent.GetVisualComponent().transform.position); }); // graphLayout.DoLayout (time); }