Commit 5e6e837
committed
MAINT: Unify calculation of normal vectors from polygons
This combines `get_normals` and `_generate_normals`, and eliminates all other calls to np.cross.
`get_normals` and `_generate_normals` were profiled, and it was found that vectorizing `np.cross` like in `get_normals` was faster:
```python
import numpy as np
def get_normals(polygons):
v1 = np.empty((len(polygons), 3))
v2 = np.empty((len(polygons), 3))
for poly_i, ps in enumerate(polygons):
# pick three points around the polygon at which to find the
# normal doesn't vectorize because polygons is jagged
i1, i2, i3 = 0, len(ps)//3, 2*len(ps)//3
v1[poly_i, :] = ps[i1, :] - ps[i2, :]
v2[poly_i, :] = ps[i2, :] - ps[i3, :]
return np.cross(v1, v2)
def _generate_normals(self, polygons):
normals = []
for verts in polygons:
v1 = np.array(verts[0]) - np.array(verts[1])
v2 = np.array(verts[2]) - np.array(verts[0])
normals.append(np.cross(v1, v2))
return np.array(normals)
polygons = [
np.random.rand(np.random.randint(10, 1000), 3)
for i in range(100)
]
%timeit _generate_normals(polygons)
# 3.14 ms ± 255 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit get_normals(polygons)
# 452 µs ± 4.33 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
```1 parent 3e90025 commit 5e6e837
1 file changed
+44
-33
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1686 | 1686 | | |
1687 | 1687 | | |
1688 | 1688 | | |
1689 | | - | |
1690 | | - | |
1691 | | - | |
1692 | | - | |
1693 | | - | |
1694 | | - | |
1695 | | - | |
1696 | | - | |
1697 | | - | |
1698 | | - | |
1699 | | - | |
1700 | | - | |
1701 | | - | |
1702 | | - | |
1703 | 1689 | | |
1704 | 1690 | | |
1705 | 1691 | | |
1706 | 1692 | | |
1707 | 1693 | | |
1708 | 1694 | | |
1709 | 1695 | | |
1710 | | - | |
| 1696 | + | |
1711 | 1697 | | |
1712 | 1698 | | |
1713 | 1699 | | |
| |||
1721 | 1707 | | |
1722 | 1708 | | |
1723 | 1709 | | |
1724 | | - | |
| 1710 | + | |
1725 | 1711 | | |
1726 | 1712 | | |
1727 | 1713 | | |
| |||
1732 | 1718 | | |
1733 | 1719 | | |
1734 | 1720 | | |
1735 | | - | |
1736 | | - | |
1737 | | - | |
1738 | | - | |
| 1721 | + | |
| 1722 | + | |
1739 | 1723 | | |
1740 | 1724 | | |
1741 | 1725 | | |
1742 | | - | |
1743 | 1726 | | |
1744 | | - | |
1745 | | - | |
1746 | | - | |
1747 | | - | |
1748 | | - | |
1749 | | - | |
| 1727 | + | |
| 1728 | + | |
| 1729 | + | |
| 1730 | + | |
| 1731 | + | |
| 1732 | + | |
| 1733 | + | |
| 1734 | + | |
| 1735 | + | |
| 1736 | + | |
| 1737 | + | |
| 1738 | + | |
| 1739 | + | |
| 1740 | + | |
| 1741 | + | |
| 1742 | + | |
| 1743 | + | |
| 1744 | + | |
| 1745 | + | |
| 1746 | + | |
| 1747 | + | |
| 1748 | + | |
| 1749 | + | |
| 1750 | + | |
| 1751 | + | |
| 1752 | + | |
| 1753 | + | |
| 1754 | + | |
| 1755 | + | |
| 1756 | + | |
| 1757 | + | |
| 1758 | + | |
| 1759 | + | |
| 1760 | + | |
| 1761 | + | |
| 1762 | + | |
1750 | 1763 | | |
1751 | 1764 | | |
1752 | 1765 | | |
| |||
1993 | 2006 | | |
1994 | 2007 | | |
1995 | 2008 | | |
1996 | | - | |
1997 | | - | |
1998 | | - | |
| 2009 | + | |
1999 | 2010 | | |
2000 | 2011 | | |
2001 | 2012 | | |
| |||
2042 | 2053 | | |
2043 | 2054 | | |
2044 | 2055 | | |
2045 | | - | |
2046 | | - | |
2047 | | - | |
| 2056 | + | |
| 2057 | + | |
| 2058 | + | |
2048 | 2059 | | |
2049 | 2060 | | |
2050 | 2061 | | |
| |||
0 commit comments