Here’s an example from the MIConvexHull project, where StarMath is used to perform a number of vector operations.

 

What is required is to find the normal vector for the (hyper-)plane that passes through the provided vertices.

        private static double[] findNormalVector(IList<IVertexConvHull> vertices)

        {

            double[] normal;

if the dimension is 3, then we can simply use StarMath’s multiplyCross (crossProduct) to find an orthogonal vector to the 2 vector created in the plane by the 3 points.

 

            if (dimension == 3)

                normal = StarMath.multiplyCross(StarMath.subtract(vertices[1].coordinates, vertices[0].coordinates),

                                                StarMath.subtract(vertices[2].coordinates, vertices[1].coordinates));

If the number of dimensions is something else, n, then we will have to solve a system of equations. What is the vector, n which is orthogonal to the n vertices? Here we use StarMath’s solve routine to solve the Ax = b set of linear equations. A is simply comprised of  vertices’ coordinate values, and we are seeking values of n (or shown as x in the typical Ax = b) that produce the same value.

            else

            {

                var b = new double[dimension];

                for (var i = 0; i < dimension; i++) b[i] = 1.0;

            

In this case that same value is set to 1, as all values are 1. The values of A are created using StarMath’s SetRow function.

               var A = new double[dimension, dimension];

                for (var i = 0; i < dimension; i++)

                    StarMath.SetRow(i, A, vertices[i].coordinates);

         

Finally, the normal vector is produced by the solve function. For additional mathematical simplicity, this is normalized so that it has magnitude of 1. This is done by using StarMath’s normalize function.

               normal = StarMath.solve(A, b);

            }

            return StarMath.normalize(normal);

        }

 

Here is the entire function shown again.

 

        private static double[] findNormalVector(IList<IVertexConvHull> vertices)

        {

            double[] normal;

            if (dimension == 3)

                normal = StarMath.multiplyCross(StarMath.subtract(vertices[1].coordinates, vertices[0].coordinates),

                                                StarMath.subtract(vertices[2].coordinates, vertices[1].coordinates));

            else

            {

                var b = new double[dimension];

                for (var i = 0; i < dimension; i++) b[i] = 1.0;

                var A = new double[dimension, dimension];

                for (var i = 0; i < dimension; i++)

                    StarMath.SetRow(i, A, vertices[i].coordinates);

                normal = StarMath.solve(A, b);

            }

            return StarMath.normalize(normal);

        }

 

Last edited Oct 18, 2010 at 3:26 PM by mattica, version 2

Comments

No comments yet.