Here are the examples of the csharp api System.Collections.Generic.List.AddSorted(PackingRectangle) taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.
1 Examples
19
Source : RectanglePacker.cs
with MIT License
from SilkCommunity
with MIT License
from SilkCommunity
private static bool TryPackAsOrdered(List<PackingRectangle> emptySpaces, Span<PackingRectangle> unpacked,
Span<PackingRectangle> packed, uint binWidth, uint binHeight, out uint boundsWidth, out uint boundsHeight)
{
// We clear the empty spaces list and add one space covering the entire bin.
emptySpaces.Clear();
emptySpaces.Add(new PackingRectangle(0, 0, binWidth, binHeight));
// boundsWidth and boundsHeight both start at 0.
boundsWidth = 0;
boundsHeight = 0;
// We loop through all the rectangles.
for (int r = 0; r < unpacked.Length; r++)
{
// We try to find a space for the rectangle. If we can't, then we return false.
if (!TryFindBestSpace(unpacked[r], emptySpaces, out int spaceIndex))
return false;
PackingRectangle oldSpace = emptySpaces[spaceIndex];
packed[r] = unpacked[r];
packed[r].X = oldSpace.X;
packed[r].Y = oldSpace.Y;
boundsWidth = Math.Max(boundsWidth, packed[r].Right);
boundsHeight = Math.Max(boundsHeight, packed[r].Bottom);
// We calculate the width and height of the rectangles from splitting the empty space
uint freeWidth = oldSpace.Width - packed[r].Width;
uint freeHeight = oldSpace.Height - packed[r].Height;
if (freeWidth != 0 && freeHeight != 0)
{
emptySpaces.RemoveAt(spaceIndex);
// Both freeWidth and freeHeight are different from 0. We need to split the
// empty space into two (plus the image). We split it in such a way that the
// bigger rectangle will be where there is the most space.
if (freeWidth > freeHeight)
{
emptySpaces.AddSorted(new PackingRectangle(packed[r].Right, oldSpace.Y, freeWidth, oldSpace.Height));
emptySpaces.AddSorted(new PackingRectangle(oldSpace.X, packed[r].Bottom, packed[r].Width, freeHeight));
}
else
{
emptySpaces.AddSorted(new PackingRectangle(oldSpace.X, packed[r].Bottom, oldSpace.Width, freeHeight));
emptySpaces.AddSorted(new PackingRectangle(packed[r].Right, oldSpace.Y, freeWidth, packed[r].Height));
}
}
else if (freeWidth == 0)
{
// We only need to change the Y and height of the space.
oldSpace.Y += packed[r].Height;
oldSpace.Height = freeHeight;
emptySpaces[spaceIndex] = oldSpace;
EnsureSorted(emptySpaces, spaceIndex);
//emptySpaces.RemoveAt(spaceIndex);
//emptySpaces.Add(new PackingRectangle(oldSpace.X, oldSpace.Y + packed[r].Height, oldSpace.Width, freeHeight));
}
else if (freeHeight == 0)
{
// We only need to change the X and width of the space.
oldSpace.X += packed[r].Width;
oldSpace.Width = freeWidth;
emptySpaces[spaceIndex] = oldSpace;
EnsureSorted(emptySpaces, spaceIndex);
//emptySpaces.RemoveAt(spaceIndex);
//emptySpaces.Add(new PackingRectangle(oldSpace.X + packed[r].Width, oldSpace.Y, freeWidth, oldSpace.Height));
}
else // The rectangle uses up the entire empty space.
emptySpaces.RemoveAt(spaceIndex);
}
return true;
}