Пример #1
0
        /// <summary>
        /// Finds the convex hull and creates the TFace objects.
        /// </summary>
        /// <typeparam name="TVertex"></typeparam>
        /// <typeparam name="TFace"></typeparam>
        /// <returns></returns>
        private IEnumerable <TFace> GetConvexFacesInternal <TVertex, TFace>()
            where TFace : ConvexFace <TVertex, TFace>, new()
            where TVertex : IVertex
        {
            if (!Computed)
            {
                GetConvexHullInternal <TVertex>(true);
            }

            var faces     = ConvexFaces;
            int cellCount = faces.Count;
            var cells     = new TFace[cellCount];

            for (int i = 0; i < cellCount; i++)
            {
                var face     = faces[i];
                var vertices = new TVertex[Dimension];
                for (int j = 0; j < Dimension; j++)
                {
                    vertices[j] = (TVertex)face.Vertices[j].Vertex;
                }
                cells[i] = new TFace
                {
                    Vertices  = vertices,
                    Adjacency = new TFace[Dimension],
                    Normal    = face.Normal
                };
                face.Tag = i;
            }

            for (int i = 0; i < cellCount; i++)
            {
                var face = faces[i];
                var cell = cells[i];
                for (int j = 0; j < Dimension; j++)
                {
                    if (face.AdjacentFaces[j] == null)
                    {
                        continue;
                    }
                    cell.Adjacency[j] = cells[face.AdjacentFaces[j].Tag];
                }

                // Fix the vertex orientation.
                if (face.IsNormalFlipped)
                {
                    var tempVert = cell.Vertices[0];
                    cell.Vertices[0]             = cell.Vertices[Dimension - 1];
                    cell.Vertices[Dimension - 1] = tempVert;

                    var tempAdj = cell.Adjacency[0];
                    cell.Adjacency[0]             = cell.Adjacency[Dimension - 1];
                    cell.Adjacency[Dimension - 1] = tempAdj;
                }
            }

            return(cells);
        }
Пример #2
0
        /// <summary>
        /// Finds the convex hull and creates the TFace objects.
        /// </summary>
        /// <typeparam name="TFace">The type of the t face.</typeparam>
        /// <typeparam name="TVertex">The type of the t vertex.</typeparam>
        /// <returns>TFace[].</returns>
        private TFace[] GetConvexFaces <TVertex, TFace>()
            where TFace : ConvexFace <TVertex, TFace>, new()
            where TVertex : IVertex
        {
            var faces     = ConvexFaces;
            var cellCount = faces.Count;
            var cells     = new TFace[cellCount];

            for (var i = 0; i < cellCount; i++)
            {
                var face     = FacePool[faces[i]];
                var vertices = new TVertex[NumOfDimensions];
                for (var j = 0; j < NumOfDimensions; j++)
                {
                    vertices[j] = (TVertex)Vertices[face.Vertices[j]];
                }

                cells[i] = new TFace
                {
                    Vertices  = vertices,
                    Adjacency = new TFace[NumOfDimensions],
                    Normal    = IsLifted ? null : face.Normal
                };
                face.Tag = i;
            }

            for (var i = 0; i < cellCount; i++)
            {
                var face = FacePool[faces[i]];
                var cell = cells[i];
                for (var j = 0; j < NumOfDimensions; j++)
                {
                    if (face.AdjacentFaces[j] < 0)
                    {
                        continue;
                    }
                    cell.Adjacency[j] = cells[FacePool[face.AdjacentFaces[j]].Tag];
                }

                // Fix the vertex orientation.
                if (face.IsNormalFlipped)
                {
                    var tempVert = cell.Vertices[0];
                    cell.Vertices[0] = cell.Vertices[NumOfDimensions - 1];
                    cell.Vertices[NumOfDimensions - 1] = tempVert;

                    var tempAdj = cell.Adjacency[0];
                    cell.Adjacency[0] = cell.Adjacency[NumOfDimensions - 1];
                    cell.Adjacency[NumOfDimensions - 1] = tempAdj;
                }
            }

            return(cells);
        }
Пример #3
0
        /// <summary>
        /// Поиск выпуклой оболочки и создание объекта Face
        /// </summary>
        TFace[] GetConvexFaces <TVertex, TFace>()
            where TFace : ConvexFace <TVertex, TFace>, new()
            where TVertex : IVertex
        {
            var faces     = ConvexFaces;
            int cellCount = faces.Count;
            var cells     = new TFace[cellCount];

            for (int i = 0; i < cellCount; i++)
            {
                var face     = FacePool[faces[i]];
                var vertices = new TVertex[Dimension];
                for (int j = 0; j < Dimension; j++)
                {
                    vertices[j] = (TVertex)this.Vertices[face.Vertices[j]];
                }

                cells[i] = new TFace
                {
                    Vertices  = vertices,
                    Adjacency = new TFace[Dimension],
                    Normal    = IsLifted ? null : face.Normal
                };
                face.Tag = i;
            }

            for (int i = 0; i < cellCount; i++)
            {
                var face = FacePool[faces[i]];
                var cell = cells[i];
                for (int j = 0; j < Dimension; j++)
                {
                    if (face.AdjacentFaces[j] < 0)
                    {
                        continue;
                    }
                    cell.Adjacency[j] = cells[FacePool[face.AdjacentFaces[j]].Tag];
                }

                // Закрепление ориентации вершин
                if (face.IsNormalFlipped)
                {
                    var tempVert = cell.Vertices[0];
                    cell.Vertices[0]             = cell.Vertices[Dimension - 1];
                    cell.Vertices[Dimension - 1] = tempVert;

                    var tempAdj = cell.Adjacency[0];
                    cell.Adjacency[0]             = cell.Adjacency[Dimension - 1];
                    cell.Adjacency[Dimension - 1] = tempAdj;
                }
            }

            return(cells);
        }
        public override void Read(BinaryReader r)
        {
            base.Read(r);
            NumIntFaces = DataSize / 6;        // This is an array of TFaces, which are 3 uint16.
            Faces       = new TFace[NumIntFaces];
            for (var i = 0; i < NumIntFaces; i++)
            {
                Faces[i].i0 = r.ReadUInt16();
                Faces[i].i1 = r.ReadUInt16();
                Faces[i].i2 = r.ReadUInt16();
            }
            var skin = GetSkinningInfo();

            skin.IntFaces = Faces.ToList();
        }
Пример #5
0
        public override void Read(BinaryReader b)
        {
            base.Read(b);
            NumIntFaces = this.DataSize / 6;        // This is an array of TFaces, which are 3 uint16.
            Faces       = new TFace[NumIntFaces];
            for (int i = 0; i < NumIntFaces; i++)
            {
                Faces[i].i0 = b.ReadUInt16();
                Faces[i].i1 = b.ReadUInt16();
                Faces[i].i2 = b.ReadUInt16();
            }
            SkinningInfo skin = GetSkinningInfo();

            skin.IntFaces = Faces.ToList();
        }
Пример #6
0
        private TFace[] GetConvexFaces <TVertex, TFace>() where TVertex : IVertex where TFace : ConvexFace <TVertex, TFace>, new()
        {
            IndexBuffer convexFaces = ConvexFaces;
            int         count       = ((SimpleList <int>)convexFaces).Count;

            TFace[] array = new TFace[count];
            for (int i = 0; i < count; i++)
            {
                ConvexFaceInternal convexFaceInternal = FacePool[((SimpleList <int>)convexFaces)[i]];
                TVertex[]          array2             = new TVertex[NumOfDimensions];
                for (int j = 0; j < NumOfDimensions; j++)
                {
                    array2[j] = (TVertex)Vertices[convexFaceInternal.Vertices[j]];
                }
                TFace[] array3 = array;
                int     num    = i;
                TFace   val    = new TFace();
                ((ConvexFace <TVertex, TFace>)val).Vertices  = array2;
                ((ConvexFace <TVertex, TFace>)val).Adjacency = new TFace[NumOfDimensions];
                ((ConvexFace <TVertex, TFace>)val).Normal    = ((!IsLifted) ? convexFaceInternal.Normal : null);
                array3[num]            = val;
                convexFaceInternal.Tag = i;
            }
            for (int k = 0; k < count; k++)
            {
                ConvexFaceInternal convexFaceInternal2 = FacePool[((SimpleList <int>)convexFaces)[k]];
                TFace val2 = array[k];
                for (int l = 0; l < NumOfDimensions; l++)
                {
                    if (convexFaceInternal2.AdjacentFaces[l] >= 0)
                    {
                        ((ConvexFace <TVertex, TFace>)val2).Adjacency[l] = array[FacePool[convexFaceInternal2.AdjacentFaces[l]].Tag];
                    }
                }
                if (convexFaceInternal2.IsNormalFlipped)
                {
                    TVertex val3 = ((ConvexFace <TVertex, TFace>)val2).Vertices[0];
                    ((ConvexFace <TVertex, TFace>)val2).Vertices[0] = ((ConvexFace <TVertex, TFace>)val2).Vertices[NumOfDimensions - 1];
                    ((ConvexFace <TVertex, TFace>)val2).Vertices[NumOfDimensions - 1] = val3;
                    TFace val4 = ((ConvexFace <TVertex, TFace>)val2).Adjacency[0];
                    ((ConvexFace <TVertex, TFace>)val2).Adjacency[0] = ((ConvexFace <TVertex, TFace>)val2).Adjacency[NumOfDimensions - 1];
                    ((ConvexFace <TVertex, TFace>)val2).Adjacency[NumOfDimensions - 1] = val4;
                }
            }
            return(array);
        }
Пример #7
0
        private TFace[] GetConvexFaces <TVertex, TFace>() where TVertex : IVertex where TFace : ConvexFace <TVertex, TFace>, new()
        {
            IndexBuffer convexFaces = this.ConvexFaces;
            int         count       = convexFaces.Count;

            TFace[] localArray = new TFace[count];
            int     index      = 0;

            while (index < count)
            {
                ConvexFaceInternal internal2   = this.FacePool[convexFaces[index]];
                TVertex[]          localArray2 = new TVertex[this.Dimension];
                int num3 = 0;
                while (true)
                {
                    if (num3 >= this.Dimension)
                    {
                        TFace local = Activator.CreateInstance <TFace>();
                        local.Vertices    = localArray2;
                        local.Adjacency   = new TFace[this.Dimension];
                        local.Normal      = !this.IsLifted ? internal2.Normal : null;
                        localArray[index] = local;
                        internal2.Tag     = index;
                        index++;
                        break;
                    }
                    localArray2[num3] = (TVertex)this.Vertices[internal2.Vertices[num3]];
                    num3++;
                }
            }
            int num4 = 0;

            while (num4 < count)
            {
                ConvexFaceInternal internal3 = this.FacePool[convexFaces[num4]];
                TFace local2 = localArray[num4];
                int   num5   = 0;
                while (true)
                {
                    if (num5 >= this.Dimension)
                    {
                        if (internal3.IsNormalFlipped)
                        {
                            TVertex local3 = local2.Vertices[0];
                            local2.Vertices[0] = local2.Vertices[this.Dimension - 1];
                            local2.Vertices[this.Dimension - 1] = local3;
                            TFace local4 = local2.Adjacency[0];
                            local2.Adjacency[0] = local2.Adjacency[this.Dimension - 1];
                            local2.Adjacency[this.Dimension - 1] = local4;
                        }
                        num4++;
                        break;
                    }
                    if (internal3.AdjacentFaces[num5] >= 0)
                    {
                        local2.Adjacency[num5] = localArray[this.FacePool[internal3.AdjacentFaces[num5]].Tag];
                    }
                    num5++;
                }
            }
            return(localArray);
        }