Пример #1
0
        public SortableSize AllocateSize(int width, int height, int id)
        {
            if (m_SortableSizeStack.Count > 0)
            {
                SortableSize size = m_SortableSizeStack.Pop();
                size.width  = width;
                size.height = height;
                size.id     = id;
                return(size);
            }

            return(new SortableSize(width, height, id));
        }
Пример #2
0
        public int packRectangles(bool sort = true)
        {
            if (sort)
            {
                mInsertList.Sort((emp1, emp2) => emp1.width.CompareTo(emp2.width));
            }

            while (mInsertList.Count > 0)
            {
                SortableSize sortableSize = mInsertList.Pop();

                int width  = sortableSize.width;
                int height = sortableSize.height;

                int index = getFreeAreaIndex(width, height);

                if (index >= 0)
                {
                    IntegerRectangle freeArea = mFreeAreas[index];
                    IntegerRectangle target   = allocateRectangle(freeArea.x, freeArea.y, width, height);

                    target.id = sortableSize.id;

                    // Generate the new free areas, these are parts of the old ones intersected or touched by the target
                    generateNewFreeAreas(target, mFreeAreas, mNewFreeAreas);

                    while (mNewFreeAreas.Count > 0)
                    {
                        mFreeAreas.Add(mNewFreeAreas.Pop());
                    }

                    mInsertedRectangles.Add(target);

                    if (target.right > mPackedWidth)
                    {
                        mPackedWidth = target.right;
                    }

                    if (target.bottom > mPackedHeight)
                    {
                        mPackedHeight = target.bottom;
                    }
                }

                freeSize(sortableSize);
            }

            return(rectangleCount);
        }
Пример #3
0
        public int PackRectangles(bool sort = true)
        {
            if (sort)
            {
                m_InsertList.Sort((emp1, emp2) => emp1.width.CompareTo(emp2.width));
            }

            while (m_InsertList.Count > 0)
            {
                SortableSize sortableSize = m_InsertList.Pop();
                int          width        = sortableSize.width;
                int          height       = sortableSize.height;

                int index = GetFreeAreaIndex(width, height);//根据W,H 得到下标
                if (index >= 0)
                {
                    IntegerRectangle freeArea = m_FreeAreas[index];//得到一个可以容纳target的Area
                    IntegerRectangle target   = RectanglePackerMgr.S.AllocateIntegerRectangle(freeArea.x, freeArea.y, width, height);
                    target.id = sortableSize.id;

                    // Generate the new free areas, these are parts of the old ones intersected or touched by the target
                    GenerateNewFreeAreas(target, m_TempFreeAreas);

                    while (m_TempFreeAreas.Count > 0)
                    {
                        m_FreeAreas.Add(m_TempFreeAreas.Pop());
                    }

                    m_InsertedRectangles.Add(target);

                    if (target.right > m_PackedWidth)
                    {
                        m_PackedWidth = target.right;
                    }

                    if (target.top > m_PackedHeight)
                    {
                        m_PackedHeight = target.top;
                    }
                }

                RectanglePackerMgr.S.ReleaseSize(sortableSize);
            }

            return(rectangleCount);
        }
Пример #4
0
 private void freeSize(SortableSize size)
 {
     mSortableSizeStack.Add(size);
 }
Пример #5
0
        public void insertRectangle(int width, int height, int id)
        {
            SortableSize sortableSize = allocateSize(width, height, id);

            mInsertList.Add(sortableSize);
        }
Пример #6
0
 public void ReleaseSize(SortableSize size)
 {
     m_SortableSizeStack.Add(size);
 }
Пример #7
0
        public void InsertRectangle(int width, int height, int id)
        {
            SortableSize sortableSize = RectanglePackerMgr.S.AllocateSize(width, height, id);

            m_InsertList.Add(sortableSize);
        }