Ejemplo n.º 1
0
 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>()
                )
            );
 }
Ejemplo n.º 2
0
 /// <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);
 }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }