Metadata-Version: 2.1
Name: squircle
Version: 0.2.1
Summary: Stretch circles into squares and squish squares into circles
Home-page: https://github.com/verhovsky/squircle
Author: Boris Verkhovskiy
Author-email: boris.verk@gmail.com
License: MIT
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Other Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: MacOS :: MacOS X
Classifier: Operating System :: POSIX
Classifier: Operating System :: Microsoft :: Windows
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3 :: Only
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Provides-Extra: numpy
Requires-Dist: numpy ; extra == 'numpy'

[`squircle.py`](https://pypi.org/project/squircle/) is a Python utility for
stretching circles into squares and squishing squares into circles. It requires
Python 3.6 or later.

## Installation

```sh
pip install squircle
```

## Usage:

```python
import numpy as np
from PIL import Image

from squircle import to_circle, to_square

square = np.asarray(Image.open('some-square-image.jpg'))
circle = to_circle(square)
and_back_to_square = to_square(circle)
```

there's 3 stretching methods you can choose from

```python
>>> from squircle import methods
>>> list(methods.keys())
['fgs', 'stretch', 'elliptical']
>>> circle = to_circle(square, method='elliptical')
```

### Stretching methods

#### Fernández-Guasti squircle (`fgs`)

The Fernández-Guasti squircle is used by default.

https://squircular.blogspot.com/2015/09/fernandez-guastis-squircle.html

http://mathworld.wolfram.com/Squircle.html

#### Simple Stretching (`stretch`)

This method "just linearly stretches each point radially so that the rim of the circle matches the rim of the square".

https://squircular.blogspot.com/2015/09/elliptical-arc-mapping.html

#### Elliptical grid mapping (`elliptical`)

"The way I went about this was to think of a line of constant x (as well as a line of constant y) getting mapped to an ellipse in the circle"

https://mathproofs.blogspot.com/2005/07/mapping-square-to-circle.html

https://squircular.blogspot.com/2015/09/mapping-circle-to-square.html

#### Schwarz-Christoffel conformal mapping

`raise NotImplementedError`. The math is difficult.

https://squircular.blogspot.com/2015/09/schwarz-christoffel-mapping.html

http://jcgt.org/published/0005/02/01/

## Development

After `pip install tox` you can run squircle's (limited) test set with

```sh
tox
```

On Ubuntu, you also need the following dependencies for numpy and matplotlib

```sh
sudo apt install python3-dev libjpeg-dev zlib1g-dev libfreetype6-dev
```

You can visually inspect the transformations by uncommenting the matplotlib code in `test_squircle.py` and then invoking the tests directly with `pytest` instead of tox

``` sh
pytest
```

but you'll need to install the dependencies of the tests manually, which you can do with `pip install pytest numpy matplotlib pillow`.

## TODOs

If you would like to help with this project, [the open issues on GitHub](https://github.com/verhovsky/squircle/issues) should list some ideas.

## Credits

This code is converted from the C++ sources on Chamberlain Fong's blog posts, which (I think) are based on his paper [Analytical Methods for Squaring the Disc (2014)](https://arxiv.org/ftp/arxiv/papers/1509/1509.06344.pdf).

The square image in `test_images/` is https://commons.wikimedia.org/wiki/File:Graph-paper.svg and the circle is taken from Chamberlain Fong's blog posts.


