private IEnumerable <IVertex3D> getConnectedVertices(IVertex3D vertex3D) { return(graph.OutEdges((TVertex)vertex3D).Select(e => e.Target).Cast <IVertex3D>() .Union( graph.InEdges((TVertex)vertex3D).Select(e => e.Source).Cast <IVertex3D>() ) ); }
/// <summary> /// Returns the dot product of two vertex and the vector. /// </summary> /// <param name="vector1">The vertex or position in 3D space</param> /// <param name="vector2">The vector.</param> /// <returns>The dot product.</returns> public static double Dot(this IVertex3D vector1, Vector3 vector2) { if (vector1 == null) { return(double.NaN); } return(vector1.X * vector2.X + vector1.Y * vector2.Y + vector1.Z * vector2.Z); }
private Vector3 calculateRepulsionForce(IVertex3D forceTarget, IVertex3D other) { var dist = Vector3.Distance(forceTarget.Position, other.Position); if (dist < 0.01f) { dist = 0.01f; } var dir = (other.Position - forceTarget.Position) / dist; return((repulsionFactor / (dist * dist)) * -dir); }
private Vector3 calculateSpringForce(IVertex3D forceTarget, IVertex3D other) { var dist = Vector3.Distance(forceTarget.Position, other.Position); if (dist < 0.01f) { dist = 0.01f; } var dir = (other.Position - forceTarget.Position) / dist; return(attractionFactor * (float)Math.Log(dist / minNodeDistance) * dir); }
private Vector3 calculateVertexForce(IVertex3D v) { var force = new Vector3(); // Edges foreach (var n in getConnectedVertices(v)) { if (n == v) { continue; } force += calculateSpringForce(v, n); } //vertices foreach (var n in getVertices()) { if (n == v) { continue; } force += calculateRepulsionForce(v, n); } return(force); }