{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Source of the code: https://blog.bruce-hill.com/meandering-triangles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Step 0: get some data " ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "import math\n", "\n", "\"\"\"\n", "def elevation_func(x, y):\n", " return 1 / (2 + math.sin(.2 * math.sqrt(x**2 + .2 * y**2))) * (.75 + .5 * math.sin(.1 * x))\n", "\"\"\"\n", "\n", "def elevation_func(x, y):\n", " r = math.sqrt((x - 50)**2 + (y - 50)**2)\n", " return math.exp(-r**2 *.005)\n", "\n", "elevation_data = dict()\n", "WIDTH, HEIGHT = 100, 100\n", "\n", "SPACING = 1\n", "\n", "for x in range(0, WIDTH, SPACING):\n", " for y in range(0, HEIGHT, SPACING):\n", " elevation_data[(x, y)] = elevation_func(x, y)" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "\n", "def dict_to_2darray(elevation_data, nx, ny):\n", " img = np.zeros((ny, nx))\n", " for xy in elevation_data:\n", " x, y = xy\n", " img[y, x] = elevation_data[xy]\n", " return img\n", "\n", "\n", "img = dict_to_2darray(elevation_data, WIDTH, HEIGHT)\n", "\n", "fig, ax = plt.subplots()\n", "m = ax.imshow(img)\n", "plt.colorbar(m)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Step 1: triangulate " ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "import collections\n", "\n", "\n", "Triangle = collections.namedtuple('Triangle', 'v1 v2 v3')\n", "\n", "\n", "def plot_tri(self, ax):\n", " v1 = self.v1\n", " v2 = self.v2\n", " v3 = self.v3\n", " ax.plot([v1[0], v2[0], v3[0], v1[0]], [v1[1], v2[1], v3[1], v1[1]], color='black')\n", " \n", " \n", "Triangle.plot_tri = plot_tri\n", "\n", "triangles = []\n", "\n", "for x in range(0, WIDTH - 1, SPACING):\n", " for y in range(0, HEIGHT - 1, SPACING):\n", " # upper left triangle\n", " t1 = Triangle((x, y), (x + SPACING, y), (x, y + SPACING))\n", " triangles.append(t1)\n", " # lower right triangle\n", " t2 = Triangle((x + SPACING, y), (x, y + SPACING), (x + SPACING, y + SPACING))\n", " triangles.append(t2)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "ax.invert_yaxis()\n", "for tri in triangles[:6]:\n", " tri.plot_tri(ax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Step 2 and 3: find triangles that intersect contour lines and find the contour line segments" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "Edge = collections.namedtuple(\"Edge\", \"e1 e2\")\n", "\n", "\n", "def plot_edge(self, ax):\n", " e1 = self.e1\n", " e2 = self.e2\n", " ax.plot([e1[0], e2[0]], [e1[1], e2[1]], color='blue')\n", "\n", "\n", "Edge.plot_edge = plot_edge\n", "\n", "\n", "def make_contour_segments(triangles, elevation_data, threshold=0.5):\n", " \"\"\"Returns a list of contour segments from a collection of triangles.\"\"\"\n", " contour_segments = []\n", " for triangle in triangles:\n", " below = [vertex for vertex in triangle if elevation_data[vertex] < threshold]\n", " above = [vertex for vertex in triangle if elevation_data[vertex] >= threshold]\n", " # cases where there is no contour line passing in the triangle\n", " if len(below) == 0 or len(above) == 0:\n", " continue\n", " # cases where there is a contour line\n", " minority = above if len(above) < len(below) else below\n", " majority = above if len(above) > len(below) else below\n", "\n", " contour_points = []\n", " crossed_edges = (Edge(minority[0], majority[0]),\n", " Edge(minority[0], majority[1]))\n", "\n", " for triangle_edge in crossed_edges:\n", " e1, e2 = triangle_edge.e1, triangle_edge.e2\n", " how_far = ((threshold - elevation_data[e2]) / (elevation_data[e1] - elevation_data[e2]))\n", " crossing_point = (how_far * e1[0] + (1 - how_far) * e2[0],\n", " how_far * e1[1] + (1 - how_far) * e2[1])\n", " contour_points.append(crossing_point)\n", " contour_segments.append(Edge(contour_points[0], contour_points[1]))\n", " return contour_segments" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's make a method out of this and visualize the result on a couple of different triangles" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "test_triangles = [[Triangle((0, 0), (0, 1), (1, 0))]] * 3\n", "test_elevation_data = [{(0, 0): 0, (0, 1): 1, (1, 0): 1},\n", " {(0, 0): 0, (0, 1): 1, (1, 0): 0},\n", " {(0, 0): 1, (0, 1): 1, (1, 0): 0}]\n", "\n", "fig, axes = plt.subplots(ncols=3, figsize=(6, 3))\n", "for ind, (test_tris, test_data) in enumerate(zip(test_triangles, test_elevation_data)):\n", " contour_segments = make_contour_segments(test_tris, test_data, threshold=0.5)\n", " for edge in contour_segments:\n", " edge.plot_edge(axes[ind])\n", " test_tris[0].plot_tri(axes[ind])\n", " array_data = np.c_[list(test_data.keys()), list(test_data.values())]\n", " m = axes[ind].scatter(array_data[:, 0], array_data[:, 1], c=array_data[:, 2])\n", "plt.colorbar(m)\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can recreate some of the animated data from the example tutorial on squares and not just triangles." ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "test_triangles = [[Triangle((0, 0), (0, 1), (1, 0)), Triangle((0, 1), (1, 0), (1, 1))]] * 9\n", "test_elevation_data = [{(0, 0): 0, (0, 1): 1, (1, 0): 1, (1, 1): 0},\n", " {(0, 0): 0, (0, 1): 1, (1, 0): 0, (1, 1): 0},\n", " {(0, 0): 1, (0, 1): 1, (1, 0): 0, (1, 1): 0},\n", " {(0, 0): 0, (0, 1): 1, (1, 0): 1, (1, 1): 1},\n", " {(0, 0): 0, (0, 1): 1, (1, 0): 0, (1, 1): 1},\n", " {(0, 0): 1, (0, 1): 1, (1, 0): 1, (1, 1): 0},\n", " {(0, 0): 0, (0, 1): 0, (1, 0): 1, (1, 1): 0},\n", " {(0, 0): 0, (0, 1): 1, (1, 0): 0, (1, 1): 1},\n", " {(0, 0): 1, (0, 1): 1, (1, 0): 1, (1, 1): 0}]\n", "\n", "fig, axes = plt.subplots(ncols=3, nrows=3, figsize=(6, 6))\n", "for ind, (test_tris, test_data) in enumerate(zip(test_triangles, test_elevation_data)):\n", " ax = axes.ravel()[ind]\n", " ax.invert_yaxis()\n", " threshold = 1/6 + np.random.rand()*2 / 3\n", " contour_segments = make_contour_segments(test_tris, test_data, threshold)\n", " for edge in contour_segments:\n", " edge.plot_edge(ax)\n", " for tri in test_tris:\n", " tri.plot_tri(ax)\n", " array_data = np.c_[list(test_data.keys()), list(test_data.values())]\n", " m = ax.scatter(array_data[:, 0], array_data[:, 1], c=array_data[:, 2])\n", "plt.colorbar(m, ax=axes[0, 2])\n", "plt.colorbar(m, ax=axes[1, 2])\n", "plt.colorbar(m, ax=axes[2, 2])\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's visualize the segments on the larger triangle data." ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "contour_segments = make_contour_segments(triangles, elevation_data, threshold=0.5)\n", "\n", "fig, ax = plt.subplots(ncols=2, sharex=True, sharey=True)\n", "m = ax[0].imshow(img)\n", "plt.colorbar(m, ax=ax[0], shrink=0.3)\n", "for segment in contour_segments:\n", " segment.plot_edge(ax[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Step 4: joining up the segments" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above data just consists on segments that were obtained on each triangle. We would like to have fully connected lines, not just segments." ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [], "source": [ "contour_segments = make_contour_segments(triangles, elevation_data, threshold=0.5)\n", "\n", "unassigned_segments = set(contour_segments)\n", "\n", "# building a mapping from a segment to its points\n", "points2segments = collections.defaultdict(set)\n", "for segment in contour_segments:\n", " points2segments[segment.e1].add(segment)\n", " points2segments[segment.e2].add(segment)\n", " \n", "contour_lines = []\n", "while unassigned_segments:\n", " line = collections.deque(unassigned_segments.pop())\n", " while True:\n", " tail_point = line[-1]\n", " tail_candidates = points2segments[tail_point].intersection(unassigned_segments)\n", " if tail_candidates:\n", " tail = tail_candidates.pop()\n", " line.append(tail.e1 if tail.e2 == tail_point else tail.e2)\n", " unassigned_segments.remove(tail)\n", " continue\n", " head_point = line[0]\n", " head_candidates = points2segments[head_point].intersection(unassigned_segments)\n", " if head_candidates:\n", " head = head_candidates.pop()\n", " line.appendleft(head.e1 if head.e2 == head_point else head.e2)\n", " unassigned_segments.remove(head)\n", " continue\n", " if not tail_candidates and not head_candidates:\n", " contour_lines.append(list(line))\n", " break" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How many lines did we find?" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "32" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(contour_lines)" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "ax.invert_yaxis()\n", "for line in contour_lines[:]:\n", " line = np.array(line)\n", " ax.plot(line[:, 0], line[:, 1], '-o')" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(ncols=2, sharex=True, sharey=True)\n", "m = ax[0].imshow(img)\n", "plt.colorbar(m, ax=ax[0], shrink=0.3)\n", "for segment in contour_segments:\n", " segment.plot_edge(ax[1])\n", "for line in contour_lines[:]:\n", " line = np.array(line)\n", " ax[1].plot(line[:, 0], line[:, 1], '-o')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So it turns out that this does not work as expected: I expected to find one single connected line but end up with a bunch of not completely connected segments (testing the original implementation is even worse since there are more segments). \n", "\n", "Why? Due to floating point representation errors. We're matching the line segments based on a the intersection coordinates. It seems to me that rounding errors cut off the lines.\n", "\n", "Is there a better way? Certainly! To get the intersection, we could match the segments based on the vertices that they are crossing and add the coordinates as second thoughts. But it makes the writing a little more tricky." ] } ], "metadata": { "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.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }