### References
- umap of arxiv: https://observablehq.com/@bmschmidt/arxiv?collection=@bmschmidt/deep-scatterplots
- Analyzing video game deaths (really cool vis!): https://cgcooke.github.io/Blog/datashader/visualisation/pubg/2020/05/31/Visualising-PUBG-Deaths-With-Datashader.html
- [GLSL Gaussian Blur](https://observablehq.com/@stwind/glsl-gaussian-blur) by @stwind
- [Anti-Aliased Grid Shader](https://madebyevan.com/shaders/grid/) by @evanw
- [2D Surface Reconstruction: Marching Squares With Meta-balls](https://iradicator.com/2d-surface-reconstruction-marching-squares-with-meta-balls/)
- [Function Plot (with time (and contours))](https://observablehq.com/@rreusser/function-plot-with-time-and-contours) by @rreusser. This notebook uses the cube helix implementation from there.
- https://iquilezles.org/articles/hwinterpolation/
- https://bartwronski.com/2020/04/14/bilinear-texture-filtering-artifacts-alternatives-and-frequency-domain-analysis/
- https://iquilezles.org/articles/texture/
- [Efficient Gaussian blur with linear sampling](https://www.rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/)
- https://observablehq.com/@s4l4x/efficient-gaussian-blur-with-linear-sampling
- [glfx: Triangle Blur](https://github.com/evanw/glfx.js/blob/master/src/filters/blur/triangleblur.js) We use this blur by @evanw
- morton nearest neighbor searching (see LowDimNearestNeighbors.jl)
- https://snorrwe.onrender.com/posts/morton-table/#range-query-splitting on linear quadtrees and range splitting
- https://github.com/snorrwe/morton-table/tree/master/morton-table
- https://github.com/mapbox/supercluster
- https://github.com/snorrwe/morton-table/blob/master/morton-table
- https://github.com/mourner/kdbush (also sort-based)
- https://alpercinar.com/open-cell-id/
- https://fgiesen.wordpress.com/2009/12/13/decoding-morton-codes/
- litmax / bigmin from https://twitter.com/jonahharris/status/1337087177591820290/photo/1 used with permission of the author (who says he got it from BSD-licensed code somewhere)
- using the idea of stopping when ranges are 'small enough' from https://snorrwe.onrender.com/posts/morton-table/#range-query-splitting
- https://aws.amazon.com/blogs/database/z-order-indexing-for-multifaceted-queries-in-amazon-dynamodb-part-1/ just interesting reading, plus the followup; gives the idea of just doing range optimization/query planning in z space without worrying about the data distribution when deciding whether to split or not
- datashader tutorial: https://examples.pyviz.org/census/census.html with data at http://s3.amazonaws.com/datashader-data/census2010.parq.zip
- https://github.com/juliusmilan/multi_value_binary_search
- on binary search and branch mispredictions: https://pvk.ca/Blog/2012/07/03/binary-search-star-eliminates-star-branch-mispredictions/
- also on binary search, walking through optimizations: https://en.algorithmica.org/hpc/data-structures/binary-search/
- billion point dataset (too large to load, even just 32-bit morton codes!) https://examples.pyviz.org/osm/osm-1billion.html
- more examples: https://examples.pyviz.org/
- vis the uber dataset w/ separate layers for pickup and dropoff: https://www.youtube.com/watch?v=n4cFwPan59I
- data: https://s3.amazonaws.com/datashader-data/nyc_taxi_wide.parq
-