Compare commits

...

21 Commits

Author SHA1 Message Date
Jan Petykiewicz 0a81c97af1 bump version to v0.7 2 years ago
Jan Petykiewicz 56989009e0 move to hatch-based build 2 years ago
jan 6ee12d8db9 update pypi tags 3 years ago
Jan Petykiewicz 38dc51aa7e update email 3 years ago
Jan Petykiewicz 81e34520aa strip whitespace from version string 3 years ago
Jan Petykiewicz 6d861d8a9c update req. python version 4 years ago
Jan Petykiewicz f8d3a6600e bump version to v0.6 4 years ago
Jan Petykiewicz e5e30a9414 Use VERSION.py instead of plain text VERSION 4 years ago
Jan Petykiewicz 522b610209 add .mypy_cache to .gitignore 4 years ago
Jan Petykiewicz ecefdff781 typing and comment updates 4 years ago
Jan Petykiewicz 085bb79ed7 add py.typed to enable downstream type checking 4 years ago
Jan Petykiewicz 94ebf9fa18 bump version to 0.5 5 years ago
Jan Petykiewicz 99b35a1561 gitignore build artifacts 5 years ago
Jan Petykiewicz 50e3822eac Create folder-based module and use VERSION file
use VERSION to avoid importing the module before it's installed
5 years ago
Jan Petykiewicz f68ab6bedb Update README 5 years ago
Jan Petykiewicz 1ab4b17247 add classifiers 5 years ago
Jan Petykiewicz 76f6c68472 add MANIFEST.in 5 years ago
jan c10fd556e2 Update source url 5 years ago
Jan Petykiewicz 219e4b9926 Use readme as long_description 6 years ago
Jan Petykiewicz 756c015b87 Move version info inside module 6 years ago
Jan Petykiewicz 3ca8afb3ef Use python3 for setup.py 6 years ago

7
.gitignore vendored

@ -1,3 +1,10 @@
*.pyc
__pycache__
*.idea
build/
dist/
*.egg-info/
.mypy_cache

@ -6,13 +6,22 @@ float_raster calculates pixel values with float64 precision and is capable of dr
with variable pixel widths and heights.
- [Source repository](https://mpxd.net/code/jan/float_raster)
- [PyPi](https://pypi.org/project/float_raster)
## Installation
Requirements:
* python 3 (written and tested with 3.5)
* python >=3.8
* numpy
Install with pip, via git:
Install with pip:
```bash
pip install git+https://mpxd.net/gogs/jan/float_raster.git@release
pip3 install float_raster
```
Alternatively, install via git
```bash
pip3 install git+https://mpxd.net/code/jan/float_raster.git@release
```

@ -0,0 +1 @@
../LICENSE.md

@ -0,0 +1 @@
../README.md

@ -0,0 +1,11 @@
"""
Module for rasterizing polygons, with float-precision anti-aliasing on
a non-uniform rectangular grid.
See the documentation for float_raster.raster(...) for details.
"""
from .float_raster import *
__author__ = 'Jan Petykiewicz'
__version__ = '0.7'

@ -1,16 +1,7 @@
"""
Module for rasterizing polygons, with float-precision anti-aliasing on
a non-uniform rectangular grid.
See the documentation for raster(...) for details.
"""
from typing import Tuple
import numpy
from typing import Tuple, Optional
import numpy # type: ignore
from numpy import logical_and, diff, floor, ceil, ones, zeros, hstack, full_like, newaxis
from scipy import sparse
__author__ = 'Jan Petykiewicz'
from scipy import sparse # type: ignore
def raster(vertices: numpy.ndarray,
@ -27,11 +18,14 @@ def raster(vertices: numpy.ndarray,
Polygons are assumed to have clockwise vertex order; reversing the vertex order is equivalent
to multiplying the result by -1.
:param vertices: 2xN ndarray containing x,y coordinates for each vertex of the polygon
:param grid_x: x-coordinates for the edges of each pixel (ie, the leftmost two columns span
x=grid_x[0] to x=grid_x[1] and x=grid_x[1] to x=grid_x[2])
:param grid_y: y-coordinates for the edges of each pixel (see grid_x)
:return: 2D ndarray with pixel values in the range [0, 1] containing the anti-aliased polygon
Args:
vertices: 2xN ndarray containing `x,y` coordinates for each vertex of the polygon
grid_x: x-coordinates for the edges of each pixel (ie, the leftmost two columns span
`x=grid_x[0]` to `x=grid_x[1]` and `x=grid_x[1]` to `x=grid_x[2]`)
grid_y: y-coordinates for the edges of each pixel (see `grid_x`)
Returns:
2D ndarray with pixel values in the range [0, 1] containing the anti-aliased polygon
"""
vertices = numpy.array(vertices)
grid_x = numpy.array(grid_x)
@ -58,7 +52,7 @@ def find_intersections(
vertices: numpy.ndarray,
grid_x: numpy.ndarray,
grid_y: numpy.ndarray
) -> Tuple[numpy.ndarray]:
) -> Tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]:
"""
Find intersections between a polygon and grid lines
"""
@ -135,7 +129,7 @@ def create_vertices(
vertices: numpy.ndarray,
grid_x: numpy.ndarray,
grid_y: numpy.ndarray,
new_vertex_data: Tuple[numpy.ndarray] = None
new_vertex_data: Optional[Tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]] = None
) -> sparse.coo_matrix:
"""
Create additional vertices where a polygon crosses gridlines
@ -180,6 +174,7 @@ def create_vertices(
return vertices
def clip_vertices_to_window(
vertices: numpy.ndarray,
min_x: float = -numpy.inf,
@ -210,26 +205,29 @@ def get_raster_parts(
grid_y: numpy.ndarray
) -> sparse.coo_matrix:
"""
This function performs the same task as raster(...), but instead of returning a dense array
This function performs the same task as `raster(...)`, but instead of returning a dense array
of pixel values, it returns a sparse array containing the value
(-area + 1j * cover)
`(-area + 1j * cover)`
for each pixel which contains a line segment, where
cover is the fraction of the pixel's y-length that is traversed by the segment,
multiplied by the sign of (y_final - y_initial)
area is the fraction of the pixel's area covered by the trapezoid formed by
`cover` is the fraction of the pixel's y-length that is traversed by the segment,
multiplied by the sign of `(y_final - y_initial)`
`area` is the fraction of the pixel's area covered by the trapezoid formed by
the line segment's endpoints (clipped to the cell edges) and their projections
onto the pixel's left (i.e., lowest-x) edge, again multiplied by
the sign of (y_final - y_initial)
the sign of `(y_final - y_initial)`
Note that polygons are assumed to be wound clockwise.
The result from raster(...) can be obtained with
raster_result = numpy.real(lines_result) + numpy.imag(lines_result).cumsum(axis=0)
The result from `raster(...)` can be obtained with
`raster_result = numpy.real(lines_result) + numpy.imag(lines_result).cumsum(axis=0)`
:param vertices: 2xN ndarray containing x,y coordinates for each point in the polygon
:param grid_x: x-coordinates for the edges of each pixel (ie, the leftmost two columns span
x=grid_x[0] to x=grid_x[1] and x=grid_x[1] to x=grid_x[2])
:param grid_y: y-coordinates for the edges of each pixel (see grid_x)
:return: Complex sparse COO matrix containing area and cover information
Args:
vertices: 2xN ndarray containing `x, y` coordinates for each point in the polygon
grid_x: x-coordinates for the edges of each pixel (ie, the leftmost two columns span
`x=grid_x[0]` to `x=grid_x[1]` and `x=grid_x[1]` to `x=grid_x[2]`)
grid_y: y-coordinates for the edges of each pixel (see `grid_x`)
Returns:
Complex sparse COO matrix containing area and cover information
"""
if grid_x.size < 2 or grid_y.size < 2:
raise Exception('Grid must contain at least one full pixel')

@ -0,0 +1,38 @@
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "float_raster"
description = "High-precision anti-aliasing polygon rasterizer"
readme = "README.md"
license = { file = "LICENSE.md" }
authors = [
{ name="Jan Petykiewicz", email="jan@mpxd.net" },
]
homepage = "https://mpxd.net/code/jan/float_raster"
repository = "https://mpxd.net/code/jan/float_raster"
keywords = [
"coverage",
]
classifiers = [
"Programming Language :: Python :: 3",
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Intended Audience :: Information Technology",
"Intended Audience :: Manufacturing",
"Intended Audience :: Science/Research",
"License :: OSI Approved :: GNU Affero General Public License v3",
"Topic :: Scientific/Engineering",
"Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
"Topic :: Multimedia :: Graphics :: Graphics Conversion",
]
requires-python = ">=3.8"
dynamic = ["version"]
dependencies = [
"numpy~=1.21",
"scipy",
]
[tool.hatch.version]
path = "float_raster/__init__.py"

@ -1,16 +0,0 @@
#!/usr/bin/env python
from setuptools import setup
setup(name='float_raster',
version='0.4',
description='High-precision anti-aliasing polygon rasterizer',
author='Jan Petykiewicz',
author_email='anewusername@gmail.com',
url='https://mpxd.net/gogs/jan/float_raster',
py_modules=['float_raster'],
install_requires=[
'numpy',
'scipy',
],
)
Loading…
Cancel
Save