Commit 3e07fd4
MAINT: Unify calculation of normal vectors from polygons (#12136)
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 9c56881 commit 3e07fd4
1 file changed
Lines changed: 43 additions & 32 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1684 | 1684 | | |
1685 | 1685 | | |
1686 | 1686 | | |
1687 | | - | |
1688 | | - | |
1689 | | - | |
1690 | | - | |
1691 | | - | |
1692 | | - | |
1693 | | - | |
1694 | | - | |
1695 | | - | |
1696 | | - | |
1697 | | - | |
1698 | | - | |
1699 | | - | |
1700 | | - | |
1701 | 1687 | | |
1702 | 1688 | | |
1703 | 1689 | | |
1704 | 1690 | | |
1705 | 1691 | | |
1706 | 1692 | | |
1707 | 1693 | | |
1708 | | - | |
| 1694 | + | |
1709 | 1695 | | |
1710 | 1696 | | |
1711 | 1697 | | |
| |||
1719 | 1705 | | |
1720 | 1706 | | |
1721 | 1707 | | |
1722 | | - | |
| 1708 | + | |
1723 | 1709 | | |
1724 | 1710 | | |
1725 | 1711 | | |
| |||
1731 | 1717 | | |
1732 | 1718 | | |
1733 | 1719 | | |
1734 | | - | |
1735 | | - | |
1736 | | - | |
| 1720 | + | |
1737 | 1721 | | |
1738 | 1722 | | |
1739 | 1723 | | |
1740 | | - | |
1741 | 1724 | | |
1742 | | - | |
1743 | | - | |
1744 | | - | |
1745 | | - | |
1746 | | - | |
1747 | | - | |
| 1725 | + | |
| 1726 | + | |
| 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 | + | |
1748 | 1761 | | |
1749 | 1762 | | |
1750 | 1763 | | |
| |||
1991 | 2004 | | |
1992 | 2005 | | |
1993 | 2006 | | |
1994 | | - | |
1995 | | - | |
1996 | | - | |
| 2007 | + | |
1997 | 2008 | | |
1998 | 2009 | | |
1999 | 2010 | | |
| |||
2040 | 2051 | | |
2041 | 2052 | | |
2042 | 2053 | | |
2043 | | - | |
2044 | | - | |
2045 | | - | |
| 2054 | + | |
| 2055 | + | |
| 2056 | + | |
2046 | 2057 | | |
2047 | 2058 | | |
2048 | 2059 | | |
| |||
0 commit comments