Пример #1
0
        /// <summary>
        /// Classify faces as being inside, outside or on boundary of other object
        /// </summary>
        /// <param name="otherObject">object 3d used for the comparison</param>
        public void ClassifyFaces(CsgObject3D otherObject, CancellationToken cancellationToken, Action <CsgFace> classifyFaces = null)
        {
            var otherBounds = otherObject.Bounds;

            foreach (var vertex in vertices)
            {
                cancellationToken.ThrowIfCancellationRequested();

                if (!otherBounds.Contains(vertex.Position) &&
                    vertex.Status != FaceStatus.Outside)
                {
                    vertex.Status = FaceStatus.Outside;
                }
            }

            //calculate adjacency information
            Faces.All();
            foreach (var face in Faces.QueryResults)
            {
                cancellationToken.ThrowIfCancellationRequested();

                face.v1.AddAdjacentVertex(face.v2);
                face.v1.AddAdjacentVertex(face.v3);
                face.v2.AddAdjacentVertex(face.v1);
                face.v2.AddAdjacentVertex(face.v3);
                face.v3.AddAdjacentVertex(face.v1);
                face.v3.AddAdjacentVertex(face.v2);
            }

            // for each face
            foreach (var face in Faces.QueryResults)
            {
                cancellationToken.ThrowIfCancellationRequested();

                // If the face vertices can't be classified with the simple classify
                if (face.SimpleClassify() == false)
                {
                    //makes the ray trace classification
                    face.RayTraceClassify(otherObject);

                    //mark the vertices
                    if (face.v1.Status == FaceStatus.Unknown)
                    {
                        face.v1.Mark(face.Status);
                    }
                    if (face.v2.Status == FaceStatus.Unknown)
                    {
                        face.v2.Mark(face.Status);
                    }
                    if (face.v3.Status == FaceStatus.Unknown)
                    {
                        face.v3.Mark(face.Status);
                    }
                }

                classifyFaces?.Invoke(face);
            }
        }