コード例 #1
0
 internal double Evaluate(Point3D point)
 {
     var x = point.X;
     var y = point.Y;
     var z = point.Z;
     var components = new[] {
         x * x, y * y, z * z, 2 * x * y, 2 * x * z, 2 * y * z, 2 * x, 2 * y, 2 * z, +1
     };
     var result = 0.0;
     for (var i = 0; i < 10; ++i) {
         result += _coefficients[i] * components[i];
     }
     return result;
 }
コード例 #2
0
        /// <summary>
        /// Cuts the mesh with the specified plane. (Modified from HelixToolkit.Wpf version)
        /// </summary>
        /// <param name="mesh">
        /// The mesh.
        /// </param>
        /// <param name="plane">
        /// The plane origin.
        /// </param>
        /// <param name="normal">
        /// The plane normal.
        /// </param>
        /// <returns>
        /// The <see cref="MeshGeometry3D"/>.
        /// </returns>
        public static MeshGeometry3D CutMesh(this MeshGeometry3D mesh, Media3D.Point3D plane, Vector3 normal)
        {
            var hasTextureCoordinates = mesh.TextureCoordinates != null && mesh.TextureCoordinates.Count > 0;
            var hasNormals = mesh.Normals != null && mesh.Normals.Count > 0;
            var meshBuilder = new MeshBuilder(hasNormals, hasTextureCoordinates);
            var contourHelper = new HelixToolkit.Wpf.SharpDX.Helpers.ContourHelperDX(plane, normal, mesh);
            foreach (var position in mesh.Positions)
            {
                meshBuilder.Positions.Add(position);
            }

            if (hasTextureCoordinates)
            {
                foreach (var textureCoordinate in mesh.TextureCoordinates)
                {
                    meshBuilder.TextureCoordinates.Add(textureCoordinate);
                }
            }

            if (hasNormals)
            {
                foreach (var n in mesh.Normals)
                {
                    meshBuilder.Normals.Add(n);
                }
            }

            for (var i = 0; i < mesh.Indices.Count; i += 3)
            {
                var index0 = mesh.Indices[i];
                var index1 = mesh.Indices[i + 1];
                var index2 = mesh.Indices[i + 2];

                Vector3[] positions;
                Vector3[] normals;
                Vector2[] textureCoordinates;
                int[] triangleIndices;

                contourHelper.ContourFacet(index0, index1, index2, out positions, out normals, out textureCoordinates, out triangleIndices);

                foreach (var p in positions)
                {
                    meshBuilder.Positions.Add(p);
                }

                foreach (var tc in textureCoordinates)
                {
                    meshBuilder.TextureCoordinates.Add(tc);
                }

                foreach (var n in normals)
                {
                    meshBuilder.Normals.Add(n);
                }

                foreach (var ti in triangleIndices)
                {
                    meshBuilder.TriangleIndices.Add(ti);
                }
            }

            return meshBuilder.ToMeshGeometry3D();
        }
コード例 #3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ContourHelperDX" /> class.
        /// </summary>
        /// <param name="planeOrigin">The plane origin.</param>
        /// <param name="planeNormal">The plane normal.</param>
        /// <param name="originalMesh">The original mesh.</param>
        public ContourHelperDX(Media3D.Point3D planeOrigin, Vector3 planeNormal, MeshGeometry3D originalMesh)
        {
            var hasNormals = originalMesh.Normals != null && originalMesh.Normals.Count > 0;
            var hasTextureCoordinates = originalMesh.TextureCoordinates != null && originalMesh.TextureCoordinates.Count > 0;
            this.normals = hasNormals ? new Vector3[3] : null;
            this.textures = hasTextureCoordinates ? new Vector2[3] : null;
            this.positionCount = originalMesh.Positions.Count;

            this.meshPositions = originalMesh.Positions.ToArray();
            this.meshNormals = hasNormals ? originalMesh.Normals.ToArray() : null;
            this.meshTextureCoordinates = hasTextureCoordinates ? originalMesh.TextureCoordinates.ToArray() : null;

            // Determine the equation of the plane as
            // ax + by + cz + d = 0
            var l = (float)Math.Sqrt((planeNormal.X * planeNormal.X) + (planeNormal.Y * planeNormal.Y) + (planeNormal.Z * planeNormal.Z));
            this.a = planeNormal.X / l;
            this.b = planeNormal.Y / l;
            this.c = planeNormal.Z / l;
            this.d = -(float)((planeNormal.X * planeOrigin.X) + (planeNormal.Y * planeOrigin.Y) + (planeNormal.Z * planeOrigin.Z));
        }