{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A surprisingly wide variety of interesting-looking vector line graphics can be generated with a fairly simple technique.\n", "\n", "First, we take a bunch of lines. These lines work best if they represent a pattern with some regularity, so I call them the **texture**. Then, we pick a **surface**, which is essentially an elevation map represented by a matrix of heights. It can be generated mathematically or taken from real data. Next, we **map** the texture onto the surface, and capture the heights along all each line to add a third dimension to those lines. Finally, **project** the result to convert the 3D lines back into 2D lines. If we're lucky, these lines will be more interesting to look at than the texture we started with.\n", "\n", "We'll use [penkit](https://github.com/paulgb/penkit/)'s `show_layer` function for displaying plots within the notebook, so if the following code throws an `ImportError`, try running `pip install penkit` in a terminal." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "from penkit.preview import show_layer\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generating a Texture" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's begin by generating a texture. As I mentioned, a texture is just a set of lines. \n", "\n", "For the first texture we'll take inspiration from the band Joy Division's famous [Unknown Pleasures album cover](https://en.wikipedia.org/wiki/Unknown_Pleasures#/media/File:Unknown_Pleasures_Joy_Division_LP_sleeve.jpg). Joy Division-inspired plots have become a genre in their own right, [sometimes called joy plots](https://twitter.com/JennyBryan/status/856674638981550080)\n", "\n", "The texture in this case is simply a bunch of evenly-spaced horizontal lines. To simplify the math later on, it is helpful to constrain texture coordinates such that both dimensions are in the range `[0, 1]`. If you try generating your own (and I encourage you to!), make sure they are within this area (you might find [`penkit.textures.util.fit_texture`](http://penkit.readthedocs.io/en/latest/penkit.textures.html#penkit.textures.util.fit_texture) helpful)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def make_joy_texture(num_lines=10, resolution=50):\n", " # np.meshgrid is a handy way to generate a grid of points. It\n", " # returns a pair of matrices, which we will flatten into arrays.\n", " # For the x-coordinates, we put a nan value at the end so that when\n", " # we flatten them there is a separater between each horizontal line.\n", " x, y = np.meshgrid(\n", " np.hstack([np.linspace(0, 1, resolution), np.nan]),\n", " np.linspace(0, 1, num_lines),\n", " )\n", " \n", " # For coordinates where the x value is nan, set the y value to nan\n", " # as well. nan coordinates represent breaks in the path, indicating\n", " # here that the pen should be raised between each horizontal line.\n", " y[np.isnan(x)] = np.nan\n", " return x.flatten(), y.flatten()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we represent all of the lines in two same-sized arrays: one of x-coordinates, and one of y-coordinates. Each coordinate pair creates a line from the previous coordinate pair, unless either contains a `nan` (\"not a number\") indicator, which represents a gap in the path. All coordinates are absolute, i.e. vectors from the origin rather than relative to the previous point. If you would like a more gradual introduction to this way of representing lines, see my [Fractal Generation with L-Systems](https://bitaesthetics.com/posts/fractal-generation-with-l-systems.html) tutorial." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "joy_texture = make_joy_texture(6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use `show_layer` to preview the texture:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show_layer(joy_texture)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you count the lines, there are six of them, which is the parameter we passed as `num_lines`. You might have also noticed the optional `resolution` parameter and wondered why it matters. The lines above are actually made up of a bunch of line segments, and the number of these segments is the **resolution**. We can use `matplotlib` to make it clear where the line segments are." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(*make_joy_texture(10, 5), marker='.');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Try modifying the parameters to `make_joy_texture` to check your understanding. The resolution doesn't make a difference when we plot the texture, but soon we will be bending the texture into curves. The higher the resolution, the more accurate the curves will be." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generating Surfaces\n", "\n", "### Blurred Noise Surface\n", "\n", "A surface is essentially just a matrix of numbers that we can interpret as elevations. One way to generate interesting surfaces is to generate random noise and blur it." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from scipy.ndimage.filters import gaussian_filter\n", "\n", "# This step isn't necessary, but it ensures that the same \"random\" plot\n", "# will be generated every time the tutorial is run.\n", "np.random.seed(int('banana', 36))\n", "\n", "NOISE_BLUR = 40\n", "noise_surface = gaussian_filter(np.random.normal(size=(500, 500)), NOISE_BLUR)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Surfaces can also be visualized with `matplotlib`, but we need to use `imshow` rather than `plot`. Lighter pixels represent points with higher elevations." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(noise_surface, cmap='gray');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### \"Hole\" Surface\n", "\n", "Another way to generate a surface is to run a mathematical function over the x and y coordinates. To do this easily in `numpy`, we can generate a pair of matrices:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "SURFACE_SIZE = 500\n", "grid = np.meshgrid(\n", " np.linspace(0, 1, SURFACE_SIZE),\n", " np.linspace(0, 1, SURFACE_SIZE)\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These matrices represent smooth gradients along the horizontal and vertical axes, respectively. These will be the \"raw ingredients\" to our process. We can apply different functions to them to get different effects." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "_, (p1, p2) = plt.subplots(1, 2)\n", "p1.imshow(grid[0], cmap='gray')\n", "p2.imshow(grid[1], cmap='gray');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Standard graphing functions, like `sin`, can be generalized into 3D by converting the (x, y) values into a scalar and calling `sin()` on *that*. The natural transformation into a scalar is the *norm*, i.e. the distance from the origin.\n", "\n", "Note that the x and y values are scaled between 0 and 1, rather than being the raw pixel coordinates." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "hole_surface = np.sin(\n", " np.linalg.norm((np.array(grid) - 0.5) * np.pi, axis=0))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(hole_surface, cmap='gray');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Bubble Surface\n", "\n", "Another fun math function involves taking the product of the sine of both axis. It comes out looking like a grid of bubbles, so I call it the `bubble_surface`." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "NUM_BUBBLES_PER_SIDE = 3\n", "bubble_surface = (\n", " np.sin((grid[0] - 0.5) * NUM_BUBBLES_PER_SIDE * np.pi) *\n", " np.sin((grid[1] - 0.5) * NUM_BUBBLES_PER_SIDE * np.pi))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(bubble_surface, cmap='gray');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Applying the Texture\n", "\n", "Now that we have a surface, we can **map** it to the texture. First we strech the texture over the surface dimensions. Then, for each point in the texture, we find its associated pixel on the surface and look up the \"elevation\" at that point. That elevation becomes the Z-value for the texture. We can think of these Z-values, combined with the original X and Y values, as making up a 3D version of the original texture." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def texture_map(texture, surface):\n", " texture_x, texture_y = texture\n", " surface_w, surface_h = surface.shape\n", " \n", " # First, we convert the points along the texture into integers within\n", " # the bounds of the surface's index. The clipping here will also convert\n", " # the nan values to 0.\n", " index_x = np.clip(np.int32(surface_w * texture_x), 0, surface_w - 1)\n", " index_y = np.clip(np.int32(surface_h * texture_y), 0, surface_h - 1)\n", " \n", " # Grab z-values along the texture path. Note that this will include values\n", " # for every point, even if it is nan or had to be clipped to within the\n", " # bounds of the surface, so we have to fix that next.\n", " surface_z = surface[index_x, index_y]\n", " \n", " # Set z-values that are either out of bounds or nan in the texture to nan\n", " # in the output.\n", " # Numpy wants to warn about the fact that there are nan values in the\n", " # textures, so we silence warnings about this.\n", " with np.errstate(invalid='ignore'):\n", " surface_z[(texture_x < 0) | (texture_x >= 1) |\n", " (texture_y < 0) | (texture_y >= 1)] = np.nan\n", " \n", " return surface_z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To actually plot this 3D shape, we need to **project** it back to 2D. There are different ways to do this, but one way is to preserve the X coordinates, and use a linear blend of the Y and Z coordinates as the Y coordinates. Here's a function that handles both the **mapping** (by calling `texture_map`) and **projection**." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def texture_plot(texture, surface, angle=45, **kwargs):\n", " # Extract the Xs and Ys from the texture\n", " surface_x, surface_y = texture\n", " \n", " # Map the texture to get the Zs\n", " surface_z = texture_map(texture, surface.T)\n", " \n", " # The projection is as simple as linearly blending the Z and Y\n", " # dimensions. The multiples are calculated from the given\n", " # angle with standard trig.\n", " z_coef = np.sin(np.radians(angle))\n", " y_coef = np.cos(np.radians(angle))\n", " plot = (surface_x, -surface_y * y_coef + surface_z * z_coef)\n", "\n", " return show_layer(plot, **kwargs)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "texture_plot(make_joy_texture(20), bubble_surface * 0.1, 40)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "texture_plot(make_joy_texture(40), noise_surface * 12, 40)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In both examples above, I've applied a scale to the surface by multiplying a number to the surface. Try modifying the multipliers and see what happens. Also, try modifying the angle parameter to other numbers between 0 and 90." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dark Side of the Surface\n", "\n", "You may have noticed that in the plot above, some of the lines cross each other. This gives the impression that the surface is transparent, as if we can \"see through\" it to lines behind the surface. In order to make images that look 3D, we can make the surface appear opaque by not drawing lines that would be obscured by the surface.\n", "\n", "One way to do this is by \"masking\" the visible parts of the surface. First, we apply the projection to the surface. Then, we walk over the surface keeping track of the maximum height as we go. Only the parts of the surface where the height of the sloped surface is equal to the (cumulative) maximum are kept.\n", "\n", "To understand this, consider a two-dimensional version below. The lines of sight are parallel, because we are using an [axonometric projection](https://en.wikipedia.org/wiki/Axonometric_projection). In this example, the lighter-colored parts of the surface would be masked out because they are hidden to the observer. If you trace the line left to right, you can see that points along the line are only visible if no point left of them is higher. In other words, they are equal to the cumulative maximum point.\n", "\n", "![](https://bitaesthetics.com/img/eye.svg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The same principle applies for our surfaces, but we have to do it for every cross-section of the surface. Fortunately, `matplotlib` has a function `np.maximum.accumulate` that calculates a cumulative maximum over every slice at once. By comparing the cumulative maximums to the actual elevation, we can determine the visibility of each pixel on the surface. The result of this function is a [mask](https://en.wikipedia.org/wiki/Mask_%28computing%29) that tells us which pixels of the surface are visible." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def make_visible_mask(surface, angle):\n", " s = surface.shape[0]\n", " \n", " # Just as in projection, we calculate the Y and Z\n", " # coefficients with sin/cos.\n", " y_coef = np.cos(np.radians(angle))\n", " z_coef = np.sin(np.radians(angle))\n", " \n", " # Rotate the surface so that the visibilty mask represents\n", " # the visibility at the desired angle.\n", " projected_surface = (\n", " z_coef * surface -\n", " y_coef * np.expand_dims(np.linspace(0., 1., s), axis=1)\n", " )\n", " \n", " # Calculate the cumulative maximum along each cross-section of\n", " # the projected surface. We flip on the input and output because\n", " # we want to accumulate from the bottom of the surface up, rather\n", " # than the top-down. This is because we interpret the bottom of\n", " # the surface as closer to the observer.\n", " projected_surface_max = np.flipud(np.maximum.accumulate(np.flipud(projected_surface)))\n", " \n", " # Compare each point on the surface to the cumulative maximum\n", " # along its cross-section.\n", " return projected_surface == projected_surface_max" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To apply the mask, we can set all values of the surface that are *not* in the mask to `nan`." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def remove_hidden_parts(surface, angle):\n", " surface = np.copy(surface)\n", " surface[~make_visible_mask(surface, angle)] = np.nan\n", " return surface" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The input and output of this process, as well as the mask used, are shown below." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "_, (i, m, r) = plt.subplots(1, 3)\n", "# Plot input surface\n", "i.imshow(bubble_surface, cmap='gray')\n", "i.set_title('input')\n", "i.axis('off')\n", "# Plot mask\n", "m.imshow(make_visible_mask(bubble_surface, 10), cmap='gray')\n", "m.set_title('mask')\n", "m.axis('off')\n", "# Plot result\n", "r.imshow(remove_hidden_parts(bubble_surface, 10), cmap='gray')\n", "r.set_title('result')\n", "r.axis('off');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Putting it all together, we can apply `remove_hidden_parts` to a surface and get the result we want." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "angle=70\n", "texture_plot(make_joy_texture(50, 100), remove_hidden_parts(bubble_surface * 0.1, angle), angle)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "angle=65\n", "texture_plot(make_joy_texture(80, 100), remove_hidden_parts(\n", " hole_surface * 1.2 + noise_surface + bubble_surface * 0.1, angle), angle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Grids\n", "\n", "Now that we have seen how projection works, let's explore some more interesting textures. If we swap the X and Y dimensions, our horizontal lines become vertical lines. By concatenating the vertical and horizontal lines, we can make a grid texture." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def make_grid_texture(num_h_lines=10, num_v_lines=10, resolution=50):\n", " x_h, y_h = make_joy_texture(num_h_lines, resolution)\n", " y_v, x_v = make_joy_texture(num_v_lines, resolution)\n", " return np.concatenate([x_h, x_v]), np.concatenate([y_h, y_v])" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show_layer(make_grid_texture())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's use `penkit`'s `rotate_texture` function to play with the grid." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from penkit.textures.util import rotate_texture, fit_texture\n", "grid_texture = fit_texture(rotate_texture(make_grid_texture(40, 40, 200), 40))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just as we scaled surfaces before by multiplying them by a scale factor, we can combine them by adding them. Let's combine all of the surfaces we've seen and map a grid texture to them. Try changing some of the values and seeing how the plot changes." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "angle = 30\n", "texture_plot(grid_texture, remove_hidden_parts(\n", " 0.1 * hole_surface + 16 * noise_surface + 0.1 * bubble_surface, angle), angle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## More Textures\n", "\n", "Penkit includes some additional textures we can play with. Here's a way to create a spiral." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from penkit.textures import make_hex_texture, make_spiral_texture\n", "spiral_texture = make_spiral_texture(\n", " spirals=30, # how many full rotations to do\n", " ccw=False, # whether to go counter-clockwise\n", " resolution=3000 # resolution (how many lines to use)\n", ")\n", "show_layer(spiral_texture)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "angle = 45\n", "texture_plot(spiral_texture, remove_hidden_parts(\n", " 0.1 * bubble_surface + 6 * noise_surface, angle), angle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another texture provided by penkit is a hexagonal grid." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from penkit.textures import make_hex_texture\n", "show_layer(make_hex_texture(14, 10))" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "angle = 45\n", "texture_plot(make_hex_texture(30, 10), remove_hidden_parts(\n", " hole_surface + 0.2 * bubble_surface, angle), angle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Topographic Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead of generating the surface, as we have done so far, we can instead use real data as a source for the surface. In the United States, the [U.S. Geological Survey](https://nationalmap.gov/elevation.html) provides topographic data for free. Numpy can't read the files directly, so I've pre-prepared a numpy object file derived from the data.\n", "\n", "Here's a surface generated from the topography of San Francisco." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sf_surface = np.load('sf.npy')\n", "plt.imshow(sf_surface, cmap='gray');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since texture mapping takes just one pixel for each point in the texture, it is sensitive to noise and other high-frequency changes in the data. One way to solve this would be to modify the texture mapping function to sample more points on the surface around the target. Equivalently, we could just modify each point on the surface to represent a sample of the pixels that surround it. That's exactly what `gaussian_filter`, which we've already used for the `noise_surface`, does: it takes a weighted sample of the pixels around each pixel, and gives us a new surface.\n", "\n", "I've also log-transformed the data. This emphasizes relative differences in height over absolute differences. Depending on the data I find it can lead to better results." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sf_surface = np.float32(sf_surface)\n", "sf_surface = gaussian_filter(np.log(sf_surface+1.), 10)\n", "plt.imshow(sf_surface, cmap='gray');" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "angle = 46\n", "texture_plot(rotate_texture(make_grid_texture(100, 100, 200), 13), remove_hidden_parts(\n", " sf_surface / 20, angle), angle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hilbert Curves" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Let's explore one more texture I find interesting. Penkit includes tools for plotting [L-Systems](https://bitaesthetics.com/posts/fractal-generation-with-l-systems.html). These can make interesting textures for surface projection. One example is the [Hilbert curve](https://en.wikipedia.org/wiki/Hilbert_curve)." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from penkit.fractal import hilbert_curve\n", "show_layer(hilbert_curve(5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To make this into a texture suitable for surface projection, we can use `fit_texture`. If we want to apply a rotation, we can do so before the call to `fit_texture` (try reversing the order for a different effect.)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hilbert_texture = fit_texture(rotate_texture(hilbert_curve(6, 5), 22))\n", "angle = 6\n", "texture_plot(hilbert_texture, remove_hidden_parts(noise_surface * 81, angle), angle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Next Steps\n", "\n", "- Try creating your own surfaces and textures.\n", "- Use `penkit.write.write_plot` to save your plot as an `svg` suitable for plotting.\n", "- Look into [GDAL](http://www.gdal.org/) for converting topographic data into numpy arrays" ] } ], "metadata": { "date": "2017-12-16", "title": "Surface Projection", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }