Skip to main content

Pack a set of rectangles into a bounding box with minimum area

Project description

Pack a set of rectangles into a bounding box with minimum area

Welcome to rectangle-packer

PyPI-Versions PyPI-Wheel Build-Status Read-the-Docs GitHub-License

PyPI-Downloads

Primary use: Given a set of rectangles with fixed orientations, find a bounding box of minimum area that contains them all with no overlap.

This project is inspired by Matt Perdeck’s blog post Fast Optimizing Rectangle Packing Algorithm for Building CSS Sprites.

  • The latest documentation is available on Read the Docs.

  • The source code is available on GitHub.

Installation

Install latest version from PyPI:

$ python3 -m pip install rectangle-packer

Or clone the repository and install with:

$ python3 setup.py install

Basic usage

# Import the module
>>> import rpack

# Create a bunch of rectangles (width, height)
>>> sizes = [(58, 206), (231, 176), (35, 113), (46, 109)]

# Pack
>>> positions = rpack.pack(sizes)

# The result will be a list of (x, y) positions:
>>> positions
[(0, 0), (58, 0), (289, 0), (289, 113)]

The output positions are the lower left corner coordinates of each rectangle in the input.

These positions will yield a packing with no overlaps and enclosing area as small as possible (best effort).

Examples

Example A:

pack10

Example B:

packphi

Example C: Sometimes the input rectangles simply cannot be packed in a good way. Here is an example of low packing density:

pack10bad

Example D: The image below is contributed by Paul Brodersen, and illustrates a solution to a problem discussed at stackoverflow.

PaulBrodersenExampleImage

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rectangle-packer-2.0.1.tar.gz (100.3 kB view hashes)

Uploaded Source

Built Distributions

rectangle_packer-2.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (64.3 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

rectangle_packer-2.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (66.7 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

rectangle_packer-2.0.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (64.3 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

rectangle_packer-2.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (66.8 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

rectangle_packer-2.0.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (64.5 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

rectangle_packer-2.0.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (67.0 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

rectangle_packer-2.0.1-cp311-cp311-win_amd64.whl (58.0 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

rectangle_packer-2.0.1-cp311-cp311-win32.whl (53.3 kB view hashes)

Uploaded CPython 3.11 Windows x86

rectangle_packer-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl (324.9 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

rectangle_packer-2.0.1-cp311-cp311-musllinux_1_1_s390x.whl (330.2 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ s390x

rectangle_packer-2.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl (333.8 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ ppc64le

rectangle_packer-2.0.1-cp311-cp311-musllinux_1_1_i686.whl (318.2 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ i686

rectangle_packer-2.0.1-cp311-cp311-musllinux_1_1_aarch64.whl (322.4 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ ARM64

rectangle_packer-2.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (329.6 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ s390x

rectangle_packer-2.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (333.6 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ppc64le

rectangle_packer-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (322.7 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

rectangle_packer-2.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (324.6 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

rectangle_packer-2.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (312.9 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

rectangle_packer-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl (63.3 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ x86-64

rectangle_packer-2.0.1-cp310-cp310-win_amd64.whl (67.4 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

rectangle_packer-2.0.1-cp310-cp310-win32.whl (59.5 kB view hashes)

Uploaded CPython 3.10 Windows x86

rectangle_packer-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl (305.7 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

rectangle_packer-2.0.1-cp310-cp310-musllinux_1_1_s390x.whl (315.2 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ s390x

rectangle_packer-2.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl (320.7 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ ppc64le

rectangle_packer-2.0.1-cp310-cp310-musllinux_1_1_i686.whl (297.8 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

rectangle_packer-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl (307.9 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ ARM64

rectangle_packer-2.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (308.7 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ s390x

rectangle_packer-2.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (313.7 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64le

rectangle_packer-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (302.6 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

rectangle_packer-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (300.8 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

rectangle_packer-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (292.4 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

rectangle_packer-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl (65.1 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

rectangle_packer-2.0.1-cp39-cp39-win_amd64.whl (66.6 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

rectangle_packer-2.0.1-cp39-cp39-win32.whl (58.5 kB view hashes)

Uploaded CPython 3.9 Windows x86

rectangle_packer-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl (306.1 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

rectangle_packer-2.0.1-cp39-cp39-musllinux_1_1_s390x.whl (310.5 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ s390x

rectangle_packer-2.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl (314.4 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ ppc64le

rectangle_packer-2.0.1-cp39-cp39-musllinux_1_1_i686.whl (298.3 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

rectangle_packer-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl (302.3 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ ARM64

rectangle_packer-2.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (305.9 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ s390x

rectangle_packer-2.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (310.5 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64le

rectangle_packer-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (299.2 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

rectangle_packer-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (300.0 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

rectangle_packer-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (292.2 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

rectangle_packer-2.0.1-cp39-cp39-manylinux2010_x86_64.whl (274.2 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

rectangle_packer-2.0.1-cp39-cp39-manylinux2010_i686.whl (265.8 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.12+ i686

rectangle_packer-2.0.1-cp39-cp39-manylinux1_x86_64.whl (274.2 kB view hashes)

Uploaded CPython 3.9

rectangle_packer-2.0.1-cp39-cp39-manylinux1_i686.whl (265.8 kB view hashes)

Uploaded CPython 3.9

rectangle_packer-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl (65.2 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

rectangle_packer-2.0.1-cp38-cp38-win_amd64.whl (66.6 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

rectangle_packer-2.0.1-cp38-cp38-win32.whl (58.5 kB view hashes)

Uploaded CPython 3.8 Windows x86

rectangle_packer-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl (314.6 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

rectangle_packer-2.0.1-cp38-cp38-musllinux_1_1_s390x.whl (319.1 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ s390x

rectangle_packer-2.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl (324.6 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ ppc64le

rectangle_packer-2.0.1-cp38-cp38-musllinux_1_1_i686.whl (307.5 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

rectangle_packer-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl (310.6 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ ARM64

rectangle_packer-2.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl (309.6 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ s390x

rectangle_packer-2.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (314.1 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ppc64le

rectangle_packer-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (300.8 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

rectangle_packer-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (302.6 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

rectangle_packer-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (295.4 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

rectangle_packer-2.0.1-cp38-cp38-manylinux2010_x86_64.whl (282.4 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

rectangle_packer-2.0.1-cp38-cp38-manylinux2010_i686.whl (274.5 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.12+ i686

rectangle_packer-2.0.1-cp38-cp38-manylinux1_x86_64.whl (282.3 kB view hashes)

Uploaded CPython 3.8

rectangle_packer-2.0.1-cp38-cp38-manylinux1_i686.whl (274.5 kB view hashes)

Uploaded CPython 3.8

rectangle_packer-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl (63.6 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

rectangle_packer-2.0.1-cp37-cp37m-win_amd64.whl (65.4 kB view hashes)

Uploaded CPython 3.7m Windows x86-64

rectangle_packer-2.0.1-cp37-cp37m-win32.whl (57.1 kB view hashes)

Uploaded CPython 3.7m Windows x86

rectangle_packer-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl (271.6 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

rectangle_packer-2.0.1-cp37-cp37m-musllinux_1_1_s390x.whl (275.4 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ s390x

rectangle_packer-2.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl (280.5 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ ppc64le

rectangle_packer-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl (265.1 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

rectangle_packer-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl (268.1 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ ARM64

rectangle_packer-2.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl (273.4 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ s390x

rectangle_packer-2.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (277.0 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ppc64le

rectangle_packer-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (266.4 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

rectangle_packer-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (268.5 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

rectangle_packer-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (262.6 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

rectangle_packer-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl (246.3 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64

rectangle_packer-2.0.1-cp37-cp37m-manylinux2010_i686.whl (241.8 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.12+ i686

rectangle_packer-2.0.1-cp37-cp37m-manylinux1_x86_64.whl (246.3 kB view hashes)

Uploaded CPython 3.7m

rectangle_packer-2.0.1-cp37-cp37m-manylinux1_i686.whl (241.8 kB view hashes)

Uploaded CPython 3.7m

rectangle_packer-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl (62.9 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ x86-64

rectangle_packer-2.0.1-cp36-cp36m-win_amd64.whl (65.8 kB view hashes)

Uploaded CPython 3.6m Windows x86-64

rectangle_packer-2.0.1-cp36-cp36m-win32.whl (57.4 kB view hashes)

Uploaded CPython 3.6m Windows x86

rectangle_packer-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl (273.8 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ x86-64

rectangle_packer-2.0.1-cp36-cp36m-musllinux_1_1_s390x.whl (277.5 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ s390x

rectangle_packer-2.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl (282.6 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ ppc64le

rectangle_packer-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl (265.9 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ i686

rectangle_packer-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl (269.5 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ ARM64

rectangle_packer-2.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl (275.0 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ s390x

rectangle_packer-2.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (279.3 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ppc64le

rectangle_packer-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (268.0 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ARM64

rectangle_packer-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (270.8 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

rectangle_packer-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (263.5 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

rectangle_packer-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl (248.3 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.12+ x86-64

rectangle_packer-2.0.1-cp36-cp36m-manylinux2010_i686.whl (242.2 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.12+ i686

rectangle_packer-2.0.1-cp36-cp36m-manylinux1_x86_64.whl (248.3 kB view hashes)

Uploaded CPython 3.6m

rectangle_packer-2.0.1-cp36-cp36m-manylinux1_i686.whl (242.2 kB view hashes)

Uploaded CPython 3.6m

rectangle_packer-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl (62.9 kB view hashes)

Uploaded CPython 3.6m macOS 10.9+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page