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); }
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 SpringLayoutData GetLayoutData(NodeComponent nodeComponent) { return(nodeComponent.GetVisualComponent().GetComponent <SpringLayoutData>()); }
private ForceVectorNodeLayoutData GetLayoutData(NodeComponent nodeComponent) { return(nodeComponent.GetVisualComponent().GetComponent <ForceVectorNodeLayoutData>()); }