├── .gitignore ├── LICENSE ├── README.md ├── docs └── random-tiles.gif ├── examples ├── random_tiles.py └── random_tiles_p5.py ├── pyproject.toml ├── setup.cfg └── tactile ├── __init__.py ├── preamble.py ├── tactile.py └── tiling_data.py /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | build 3 | *.pyc 4 | *.egg-info 5 | .DS_STORE -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2018, Craig S. Kaplan 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tactile-Python 2 | 3 | Tactile-Python is a pure Python port of [tactile-js](https://github.com/isohedral/tactile-js), a library for representing, manipulating, and drawing isohedral tilings on the 2D plane. [Craig S. Kaplan](https://github.com/isohedral) created `tactile-js` based on his [PhD thesis](https://cs.uwaterloo.ca/~csk/other/phd/). 4 | 5 | See [`tactile`'s original README file](https://github.com/isohedral/tactile/blob/master/README.md) for more information on how to use this library. 6 | 7 | ## Install 8 | 9 | `pip install tactile` 10 | 11 | ## Demo 12 | 13 | See `examples/random_tiles_p5.py` which requires [`p5`](https://p5.readthedocs.io/en/latest/). It will display random tilings in a window. 14 | 15 | ![Animating random tiles](docs/random-tiles.gif?raw=true "Animating random tiles") 16 | 17 | ## License 18 | 19 | BSD 3-Clause License, inherited from [tactile-js](https://github.com/isohedral/tactile-js). 20 | 21 | ## Related Libraries and Projects 22 | 23 | * [turning-function](https://github.com/DBraun/turning-function): A shape distance metric, hopefully the same as used in ["Escherization"](https://dl.acm.org/doi/10.1145/344779.345022) (Kaplan & Salesin, 2000) -------------------------------------------------------------------------------- /docs/random-tiles.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DBraun/tactile-python/e4cc4f644e34b7e7bd194576ecb11a0bc7cf66fd/docs/random-tiles.gif -------------------------------------------------------------------------------- /examples/random_tiles.py: -------------------------------------------------------------------------------- 1 | import random 2 | import math 3 | 4 | import p5 5 | 6 | from tactile import IsohedralTiling, tiling_types, EdgeShape, mul, Point 7 | 8 | RENDER_WIDTH = 1000 9 | RENDER_HEIGHT = 1000 10 | 11 | 12 | def make_random_tiling(): 13 | # Construct a tiling 14 | tiling = IsohedralTiling(random.choice(tiling_types)) 15 | 16 | # Randomize the tiling vertex parameters 17 | ps = tiling.parameters 18 | for i in range(tiling.num_parameters): 19 | ps[i] += (random.random()-.5)*0.2 20 | tiling.parameters = ps 21 | 22 | # Make some random edge shapes. Note that here, we sidestep the 23 | # potential complexity of using .shapes vs. .parts by checking 24 | # ahead of time what the intrinsic edge shape is and building 25 | # Bezier control points that have all necessary symmetries. 26 | # See https://github.com/isohedral/tactile-js/ for more info. 27 | 28 | edges = [] 29 | for shp in tiling.edge_shapes: 30 | ej = [] 31 | if shp == EdgeShape.I: 32 | # Must be a straight line. 33 | pass 34 | elif shp == EdgeShape.J: 35 | # Anything works for J 36 | ej.append(Point(random.random()*0.6, random.random() - 0.5)) 37 | ej.append(Point(random.random()*0.6 + 0.4, random.random() - 0.5)) 38 | elif shp == EdgeShape.S: 39 | # 180-degree rotational symmetry 40 | ej.append(Point(random.random()*0.6, random.random() - 0.5)) 41 | ej.append(Point(1.0 - ej[0].x, -ej[0].y)) 42 | elif shp == EdgeShape.U: 43 | # Symmetry after reflecting/flipping across length. 44 | ej.append(Point(random.random()*0.6, random.random() - 0.5)) 45 | ej.append(Point(1.0 - ej[0].x, ej[0].y)) 46 | 47 | edges.append( ej ) 48 | 49 | return tiling, edges 50 | 51 | 52 | def draw_random_tiling(tx=0, ty=0, scale=100): 53 | 54 | tiling, edges = make_random_tiling() 55 | 56 | # Make some random colors. 57 | cols = [] 58 | for i in range(3): 59 | cols.append([random.randint(0,255), random.randint(0,255), random.randint(0,255)]) 60 | 61 | # Define a world-to-screen transformation matrix that scales by 100x. 62 | ST = [scale, 0.0, tx, 0.0, scale, ty] 63 | 64 | for i in tiling.fill_region_bounds( -2, -2, 12, 12 ): 65 | T = mul( ST, i.T ) 66 | p5.fill(*cols[ tiling.get_color( i.t1, i.t2, i.aspect ) ]) 67 | 68 | start = True 69 | p5.begin_shape() 70 | 71 | for si in tiling.shapes: 72 | S = mul( T, si.T ) 73 | # Make the edge start at (0,0) 74 | seg = [ mul( S, Point(0., 0.)) ] 75 | 76 | if si.shape != EdgeShape.I: 77 | # The edge isn't just a straight line. 78 | ej = edges[ si.id ] 79 | seg.append( mul( S, ej[0] ) ) 80 | seg.append( mul( S, ej[1] ) ) 81 | 82 | # Make the edge end at (1,0) 83 | seg.append( mul( S, Point(1., 0.)) ) 84 | 85 | if si.rev: 86 | seg.reverse() 87 | 88 | if start: 89 | start = False 90 | p5.vertex(seg[0].x, seg[0].y ) 91 | if len(seg) == 2: 92 | p5.vertex(seg[1].x, seg[1].y ) 93 | else: 94 | p5.bezier_vertex( 95 | seg[1].x, seg[1].y, 96 | seg[2].x, seg[2].y, 97 | seg[3].x, seg[3].y) 98 | 99 | p5.end_shape() 100 | 101 | 102 | def setup(): 103 | 104 | global RENDER_WIDTH 105 | global RENDER_HEIGHT 106 | 107 | p5.size(RENDER_WIDTH, RENDER_HEIGHT) 108 | # p5.no_loop() 109 | 110 | 111 | def draw(): 112 | # p5.stroke_weight(1) 113 | # p5.stroke(0,0,0) 114 | p5.no_stroke() 115 | p5.background(0) 116 | draw_random_tiling() 117 | # p5.save_frame() 118 | 119 | 120 | if __name__ == '__main__': 121 | 122 | p5.run() 123 | -------------------------------------------------------------------------------- /examples/random_tiles_p5.py: -------------------------------------------------------------------------------- 1 | import random 2 | import math 3 | 4 | import p5 5 | 6 | from tactile import EdgeShape, mul, Point 7 | from random_tiles import make_random_tiling 8 | 9 | 10 | def draw_random_tiling(): 11 | 12 | tiling, edges = make_random_tiling() 13 | 14 | # Make some random colors. 15 | cols = [] 16 | for i in range(3): 17 | cols.append([ 18 | int(math.floor(random.random() * 255)), 19 | int(math.floor(random.random() * 255)), 20 | int(math.floor(random.random() * 255))]) 21 | 22 | # Define a world-to-screen transformation matrix that scales by 100x. 23 | scale = 100 24 | tx = 0 25 | ty = 0 26 | ST = [ scale, 0.0, tx, 0.0, scale, ty ] 27 | 28 | for i in tiling.fill_region_bounds( -2, -2, 12, 12 ): 29 | T = mul( ST, i.T ) 30 | p5.fill(*cols[ tiling.get_color( i.t1, i.t2, i.aspect ) ]) 31 | 32 | start = True 33 | p5.begin_shape() 34 | 35 | for si in tiling.shapes: 36 | S = mul( T, si.T ) 37 | # Make the edge start at (0,0) 38 | seg = [ mul( S, Point(0., 0.)) ] 39 | 40 | if si.shape != EdgeShape.I: 41 | # The edge isn't just a straight line. 42 | ej = edges[ si.id ] 43 | seg.append( mul( S, ej[0] ) ) 44 | seg.append( mul( S, ej[1] ) ) 45 | 46 | # Make the edge end at (1,0) 47 | seg.append( mul( S, Point(1., 0.)) ) 48 | 49 | if si.rev: 50 | seg.reverse() 51 | 52 | if start: 53 | start = False 54 | p5.vertex(seg[0].x, seg[0].y ) 55 | if len(seg) == 2: 56 | p5.vertex(seg[1].x, seg[1].y ) 57 | else: 58 | p5.bezier_vertex( 59 | seg[1].x, seg[1].y, 60 | seg[2].x, seg[2].y, 61 | seg[3].x, seg[3].y) 62 | 63 | p5.end_shape() 64 | 65 | 66 | def setup(): 67 | p5.size(1000, 1000) 68 | # p5.no_loop() 69 | 70 | 71 | def draw(): 72 | # p5.stroke_weight(1) 73 | # p5.stroke(0,0,0) 74 | p5.no_stroke() 75 | p5.background(0) 76 | draw_random_tiling() 77 | # p5.save_frame() 78 | 79 | 80 | if __name__ == '__main__': 81 | 82 | p5.run() 83 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = [ 3 | "setuptools>=42", 4 | "wheel" 5 | ] 6 | build-backend = "setuptools.build_meta" -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = tactile 3 | version = 0.1.0 4 | author = David Braun 5 | author_email = braun@ccrma.stanford.edu 6 | description = Python module for representing, manipulating, and drawing tilings of the 2D plane. 7 | keywords = tiling, tessellation, tessellations, geometry 8 | long_description = file: README.md 9 | long_description_content_type = text/markdown 10 | url = https://github.com/DBraun/tactile-python 11 | project_urls = 12 | Bug Tracker = https://github.com/DBraun/tactile-python/issues 13 | classifiers = 14 | Programming Language :: Python :: 3 15 | License :: OSI Approved :: BSD License 16 | Operating System :: OS Independent 17 | 18 | [options] 19 | packages = tactile 20 | python_requires = >=3.6 21 | tests_require = pytest 22 | 23 | [options.packages.find] 24 | where = tactile -------------------------------------------------------------------------------- /tactile/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- encoding: utf-8 -*- 3 | from .tactile import IsohedralTiling, tiling_types, EdgeShape, mul, Point -------------------------------------------------------------------------------- /tactile/preamble.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | from enum import Enum 4 | from collections import namedtuple 5 | 6 | 7 | class EdgeShape(Enum): 8 | 9 | J = 10001 10 | U = 10002 11 | S = 10003 12 | I = 10004 13 | 14 | Point = namedtuple('Point', ['x', 'y']) 15 | 16 | Shape = namedtuple('Shape', [ 17 | 'T', 18 | 'id', 19 | 'shape', 20 | 'rev', 21 | 'second', 22 | 't1', 23 | 't2', 24 | 'aspect', 25 | ], defaults=[ 26 | None, 27 | None, 28 | None, 29 | None, 30 | False, 31 | None, 32 | None, 33 | None, 34 | ]) 35 | 36 | 37 | def mul(A, B): 38 | if hasattr(B, 'x'): 39 | 40 | # Matrix * Point 41 | 42 | x = A[0] * B.x + A[1] * B.y + A[2] 43 | y = A[3] * B.x + A[4] * B.y + A[5] 44 | 45 | return Point(x, y) 46 | else: 47 | 48 | # Matrix * Matrix 49 | 50 | return [ 51 | A[0] * B[0] + A[1] * B[3], 52 | A[0] * B[1] + A[1] * B[4], 53 | A[0] * B[2] + A[1] * B[5] + A[2], 54 | A[3] * B[0] + A[4] * B[3], 55 | A[3] * B[1] + A[4] * B[4], 56 | A[3] * B[2] + A[4] * B[5] + A[5], 57 | ] 58 | 59 | 60 | def matchSeg(p, q): 61 | return [ 62 | q.x - p.x, 63 | p.y - q.y, 64 | p.x, 65 | q.y - p.y, 66 | q.x - p.x, 67 | p.y, 68 | ] 69 | -------------------------------------------------------------------------------- /tactile/tactile.py: -------------------------------------------------------------------------------- 1 | from .preamble import EdgeShape, mul, matchSeg, Shape, Point 2 | from .tiling_data import TilingTypeData, Tiling, tiling_types 3 | 4 | import math 5 | import copy 6 | from typing import List 7 | 8 | 9 | def make_point(coeffs, offs, params): 10 | 11 | # This is a bit messy because the tactile-js source code 12 | # pretends to have an extra 1.0 value tacked onto the end of the params. 13 | # We don't do that in this library, however. So instead, we have to 14 | # account for it in this `make_point` function. 15 | len_params = len(params) 16 | len_params_plus_one = len_params+1 17 | 18 | x = coeffs[offs + len_params] 19 | y = coeffs[offs + len_params_plus_one+len_params] 20 | 21 | for i, param in enumerate(params): 22 | x += coeffs[offs + i] * param 23 | y += coeffs[offs + len_params_plus_one + i] * param 24 | 25 | point = Point(x, y) 26 | 27 | return point 28 | 29 | 30 | def make_matrix(coeffs, offs, params): 31 | ret = [] 32 | 33 | # This is a bit messy because the tactile-js source code 34 | # pretends to have an extra 1.0 value tacked onto the end of the params. 35 | # We don't do that in this library, however. So instead, we have to 36 | # account for it in this `make_point` function. 37 | len_params = len(params) 38 | len_params_plus_one = len_params+1 39 | 40 | for row in range(2): 41 | for col in range(3): 42 | 43 | val = coeffs[offs + len_params] 44 | 45 | for idx, param in enumerate(params): 46 | val += coeffs[offs + idx] * param 47 | ret.append(val) 48 | offs += len_params_plus_one 49 | 50 | return ret 51 | 52 | 53 | M_orients = [ 54 | [1.0, 0.0, 0.0, 0.0, 1.0, 0.0], # IDENTITY 55 | [-1.0, 0.0, 1.0, 0.0, -1.0, 0.0], # ROT 56 | [-1.0, 0.0, 1.0, 0.0, 1.0, 0.0], # FLIP 57 | [1.0, 0.0, 0.0, 0.0, -1.0, 0.0], # ROFL 58 | ] 59 | 60 | TSPI_U = [[0.5, 0.0, 0.0, 0.0, 0.5, 0.0], [-0.5, 0.0, 1.0, 0.0, 0.5, 0.0]] 61 | 62 | TSPI_S = [[0.5, 0.0, 0.0, 0.0, 0.5, 0.0], [-0.5, 0.0, 1.0, 0.0, -0.5, 0.0]] 63 | 64 | 65 | class IsohedralTiling: 66 | 67 | def __init__(self, tp: Tiling): 68 | self.reset(tp) 69 | 70 | def reset(self, tp: Tiling): 71 | self._tiling_type = tp 72 | self.ttd = TilingTypeData.get_data(tp) 73 | self._parameters = copy.deepcopy(self.ttd.default_params) 74 | self._recompute() 75 | 76 | def _recompute(self): 77 | ntv = self.num_vertices 78 | np = self.num_parameters 79 | na = self.num_aspects 80 | 81 | # Recompute tiling vertex locations. 82 | self.verts = [] 83 | for idx in range(ntv): 84 | self.verts.append( 85 | make_point(self.ttd.vertex_coeffs, idx * (2 * (np + 1)), self._parameters) 86 | ) 87 | 88 | # Recompute edge transforms and reversals from orientation information. 89 | self.reversals = [] 90 | self.edges = [] 91 | for idx in range(ntv): 92 | fl = self.ttd.edge_orientations[2 * idx] 93 | ro = self.ttd.edge_orientations[2 * idx + 1] 94 | self.reversals.append(fl != ro) 95 | self.edges.append( 96 | mul( 97 | matchSeg(self.verts[idx], self.verts[(idx + 1) % ntv]), 98 | M_orients[2 * fl + ro], 99 | ) 100 | ) 101 | 102 | # Recompute aspect xforms. 103 | self._aspects = [] 104 | for idx in range(na): 105 | self._aspects.append( 106 | make_matrix(self.ttd.aspect_coeffs, 6 * (np + 1) * idx, self._parameters) 107 | ) 108 | 109 | # Recompute translation vectors. 110 | self._t1 = make_point(self.ttd.translation_coeffs, 0, self._parameters) 111 | self._t2 = make_point(self.ttd.translation_coeffs, 2 * (np + 1), self._parameters) 112 | 113 | @property 114 | def tiling_type(self): 115 | return self._tiling_type 116 | 117 | @property 118 | def num_parameters(self): 119 | return self.ttd.num_params 120 | 121 | @property 122 | def parameters(self): 123 | return self._parameters 124 | 125 | @parameters.setter 126 | def parameters(self, arr: List[float]): 127 | 128 | if not isinstance(arr, list): 129 | arg_type = type(arr) 130 | raise ValueError(f'The passed parameters must be a pure Python list, but an arg of type "{arg_type}" was passed.') 131 | 132 | expected_length = self.num_parameters 133 | passed_length = len(arr) 134 | if passed_length != expected_length: 135 | raise ValueError(f"The length of the passed parameters was {passed_length}, but {expected_length} was expected.") 136 | 137 | self._parameters = copy.deepcopy(arr) 138 | self._recompute() 139 | 140 | @property 141 | def num_edge_shapes(self): 142 | return self.ttd.num_edge_shapes 143 | 144 | @property 145 | def edge_shapes(self): 146 | return self.ttd.edge_shapes 147 | 148 | @property 149 | def shapes(self): 150 | for idx in range(self.num_vertices): 151 | an_id = self.ttd.edge_shape_ids[idx] 152 | 153 | yield Shape( 154 | **{ 155 | "T": self.edges[idx], 156 | "id": an_id, 157 | "shape": self.ttd.edge_shapes[an_id], 158 | "rev": self.reversals[idx], 159 | } 160 | ) 161 | 162 | @property 163 | def parts(self): 164 | for idx in range(self.num_vertices): 165 | an_id = self.ttd.edge_shape_ids[idx] 166 | shp = self.ttd.edge_shapes[an_id] 167 | 168 | if (shp == EdgeShape.J) or (shp == EdgeShape.I): 169 | yield Shape( 170 | **{ 171 | "T": self.edges[idx], 172 | "id": an_id, 173 | "shape": shp, 174 | "rev": self.reversals[idx], 175 | "second": False, 176 | } 177 | ) 178 | else: 179 | indices = [1, 0] if self.reversals[idx] else [0, 1] 180 | Ms = TSPI_U if (shp == EdgeShape.U) else TSPI_S 181 | 182 | yield Shape( 183 | **{ 184 | "T": mul(self.edges[idx], Ms[indices[0]]), 185 | "id": an_id, 186 | "shape": shp, 187 | "rev": False, 188 | "second": False, 189 | } 190 | ) 191 | 192 | yield Shape( 193 | **{ 194 | "T": mul(self.edges[idx], Ms[indices[1]]), 195 | "id": an_id, 196 | "shape": shp, 197 | "rev": True, 198 | "second": True, 199 | } 200 | ) 201 | 202 | @property 203 | def num_vertices(self): 204 | return self.ttd.num_vertices 205 | 206 | @property 207 | def vertices(self): 208 | return self.verts 209 | 210 | @property 211 | def num_aspects(self): 212 | return self.ttd.num_aspects 213 | 214 | @property 215 | def aspects(self): 216 | # aspect transforms 217 | return self._aspects 218 | 219 | @property 220 | def t1(self): 221 | return self._t1 222 | 223 | @property 224 | def t2(self): 225 | return self._t2 226 | 227 | def fill_region_bounds(self, xmin: float, ymin: float, xmax: float, ymax: float): 228 | yield from self._fill_region_quad( 229 | Point(xmin, ymin), 230 | Point(xmax, ymin), 231 | Point(xmax, ymax), 232 | Point(xmin, ymax) 233 | ) 234 | 235 | def _fill_region_quad(self, A: Point, B: Point, C: Point, D: Point): 236 | t1 = self.t1 237 | t2 = self.t2 238 | ttd = self.ttd 239 | aspects = self._aspects 240 | 241 | self._last_y = None 242 | 243 | def bc(M, p): 244 | return Point(M[0] * p.x + M[1] * p.y, M[2] * p.x + M[3] * p.y) 245 | 246 | def sample_at_height(P, Q, y): 247 | t = (y - P.y) / (Q.y - P.y) 248 | return Point((1.0 - t) * P.x + t * Q.x, y) 249 | 250 | def do_fill(A, B, C, D, do_top): 251 | 252 | x1 = A.x 253 | dx1 = (D.x - A.x) / (D.y - A.y) 254 | x2 = B.x 255 | dx2 = (C.x - B.x) / (C.y - B.y) 256 | ymin = A.y 257 | ymax = C.y 258 | 259 | if do_top: 260 | ymax = ymax + 1.0 261 | 262 | y = math.floor(ymin) 263 | if self._last_y: 264 | y = max(self._last_y, y) 265 | 266 | while y < ymax: 267 | yi = math.trunc(y) 268 | x = math.floor(x1) 269 | while x < (x2 + 1e-7): 270 | xi = math.trunc(x) 271 | 272 | for asp in range(ttd.num_aspects): 273 | M = copy.deepcopy(aspects[asp]) 274 | M[2] += xi * t1.x + yi * t2.x 275 | M[5] += xi * t1.y + yi * t2.y 276 | 277 | yield Shape( 278 | **{ 279 | "T": M, 280 | "id": False, 281 | "shape": False, 282 | "rev": False, 283 | "second": False, 284 | "t1": xi, 285 | "t2": yi, 286 | "aspect": asp, 287 | } 288 | ) 289 | 290 | x += 1.0 291 | 292 | x1 += dx1 293 | x2 += dx2 294 | y += 1.0 295 | 296 | self._last_y = y 297 | 298 | def fill_fix_x(A, B, C, D, do_top): 299 | if A.x > B.x: 300 | yield from do_fill(B, A, D, C, do_top) 301 | else: 302 | yield from do_fill(A, B, C, D, do_top) 303 | 304 | def fill_fix_y(A, B, C, D, do_top): 305 | if A.y > C.y: 306 | yield from do_fill(C, D, A, B, do_top) 307 | else: 308 | yield from do_fill(A, B, C, D, do_top) 309 | 310 | det = 1.0 / (t1.x * t2.y - t2.x * t1.y) 311 | Mbc = [t2.y * det, -t2.x * det, -t1.y * det, t1.x * det] 312 | 313 | pts = [bc(Mbc, A), bc(Mbc, B), bc(Mbc, C), bc(Mbc, D)] 314 | 315 | if det < 0.0: 316 | tmp = pts[1] 317 | pts[1] = pts[3] 318 | pts[3] = tmp 319 | 320 | if abs(pts[0].y - pts[1].y) < 1e-7: 321 | yield from fill_fix_y(pts[0], pts[1], pts[2], pts[3], True) 322 | elif abs(pts[1].y - pts[2].y) < 1e-7: 323 | yield from fill_fix_y(pts[1], pts[2], pts[3], pts[0], True) 324 | else: 325 | lowest = 0 326 | for idx in range(1, 4): 327 | if pts[idx].y < pts[lowest].y: 328 | lowest = idx 329 | 330 | bottom = pts[lowest] 331 | left = pts[(lowest + 1) % 4] 332 | top = pts[(lowest + 2) % 4] 333 | right = pts[(lowest + 3) % 4] 334 | 335 | if left.x > right.x: 336 | # swap 337 | left, right = right, left 338 | 339 | if left.y < right.y: 340 | r1 = sample_at_height(bottom, right, left.y) 341 | l2 = sample_at_height(left, top, right.y) 342 | yield from fill_fix_x(bottom, bottom, r1, left, False) 343 | yield from fill_fix_x(left, r1, right, l2, False) 344 | yield from fill_fix_x(l2, right, top, top, True) 345 | else: 346 | l1 = sample_at_height(bottom, left, right.y) 347 | r2 = sample_at_height(right, top, left.y) 348 | yield from fill_fix_x(bottom, bottom, right, l1, False) 349 | yield from fill_fix_x(l1, right, r2, left, False) 350 | yield from fill_fix_x(left, r2, top, top, True) 351 | 352 | def get_color(self, a, b, asp): 353 | 354 | clrg = self.ttd.coloring 355 | nc = clrg[18] 356 | 357 | mt1 = a % nc 358 | if mt1 < 0: 359 | mt1 += nc 360 | 361 | mt2 = b % nc 362 | if mt2 < 0: 363 | mt2 += nc 364 | 365 | col = clrg[asp] 366 | 367 | for idx in range(mt1): 368 | col = clrg[12 + col] 369 | 370 | for idx in range(mt2): 371 | col = clrg[15 + col] 372 | 373 | return col 374 | -------------------------------------------------------------------------------- /tactile/tiling_data.py: -------------------------------------------------------------------------------- 1 | from .preamble import EdgeShape 2 | from collections import namedtuple 3 | 4 | tiling_types = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 5 | 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 6 | 40, 41, 42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 7 | 61, 62, 64, 66, 67, 68, 69, 71, 72, 73, 74, 76, 77, 78, 79, 81, 82, 83, 84, 8 | 85, 86, 88, 90, 91, 93] 9 | 10 | Tiling = namedtuple('Tiling', 11 | [ 12 | "num_params", 13 | "num_aspects", 14 | "num_vertices", 15 | "num_edge_shapes", 16 | "edge_shapes", 17 | "edge_orientations", 18 | "edge_shape_ids", 19 | "default_params", 20 | "vertex_coeffs", 21 | "translation_coeffs", 22 | "aspect_coeffs", 23 | "coloring" 24 | ] 25 | ) 26 | 27 | class TilingTypeData: 28 | 29 | es_00 = [ EdgeShape.J, EdgeShape.J, EdgeShape.J ] 30 | es_01 = [ EdgeShape.S, EdgeShape.J, EdgeShape.S, EdgeShape.S, EdgeShape.S ] 31 | es_02 = [ EdgeShape.S, EdgeShape.J, EdgeShape.J, EdgeShape.S ] 32 | es_03 = [ EdgeShape.S, EdgeShape.J, EdgeShape.S, EdgeShape.J ] 33 | es_04 = [ EdgeShape.S, EdgeShape.S, EdgeShape.S ] 34 | es_05 = [ EdgeShape.S, EdgeShape.J ] 35 | es_06 = [ EdgeShape.J ] 36 | es_07 = [ EdgeShape.S ] 37 | es_08 = [ EdgeShape.U, EdgeShape.J ] 38 | es_09 = [ EdgeShape.U, EdgeShape.S, EdgeShape.S ] 39 | es_10 = [ EdgeShape.J, EdgeShape.I ] 40 | es_11 = [ EdgeShape.S, EdgeShape.I, EdgeShape.S ] 41 | es_12 = [ EdgeShape.I, EdgeShape.J ] 42 | es_13 = [ EdgeShape.I, EdgeShape.S ] 43 | es_14 = [ EdgeShape.U ] 44 | es_15 = [ EdgeShape.I ] 45 | es_16 = [ EdgeShape.S, EdgeShape.J, EdgeShape.J ] 46 | es_17 = [ EdgeShape.J, EdgeShape.J, EdgeShape.I ] 47 | es_18 = [ EdgeShape.S, EdgeShape.S, EdgeShape.J, EdgeShape.S ] 48 | es_19 = [ EdgeShape.S, EdgeShape.S, EdgeShape.J, EdgeShape.I ] 49 | es_20 = [ EdgeShape.J, EdgeShape.J, EdgeShape.S ] 50 | es_21 = [ EdgeShape.S, EdgeShape.I, EdgeShape.I ] 51 | es_22 = [ EdgeShape.J, EdgeShape.I, EdgeShape.I ] 52 | es_23 = [ EdgeShape.J, EdgeShape.J ] 53 | es_24 = [ EdgeShape.I, EdgeShape.I ] 54 | es_25 = [ EdgeShape.J, EdgeShape.S ] 55 | es_26 = [ EdgeShape.S, EdgeShape.S, EdgeShape.S, EdgeShape.S ] 56 | es_27 = [ EdgeShape.J, EdgeShape.S, EdgeShape.S ] 57 | es_28 = [ EdgeShape.I, EdgeShape.S, EdgeShape.I, EdgeShape.S ] 58 | es_29 = [ EdgeShape.J, EdgeShape.I, EdgeShape.S ] 59 | es_30 = [ EdgeShape.I, EdgeShape.I, EdgeShape.I, EdgeShape.S ] 60 | es_31 = [ EdgeShape.S, EdgeShape.S ] 61 | es_32 = [ EdgeShape.S, EdgeShape.I ] 62 | es_33 = [ EdgeShape.U, EdgeShape.I ] 63 | es_34 = [ EdgeShape.U, EdgeShape.S ] 64 | es_35 = [ EdgeShape.I, EdgeShape.I, EdgeShape.I ] 65 | es_36 = [ EdgeShape.I, EdgeShape.S, EdgeShape.I ] 66 | es_37 = [ EdgeShape.I, EdgeShape.S, EdgeShape.S ] 67 | 68 | esi_00 = [ 0, 1, 2, 0, 1, 2 ] 69 | esi_01 = [ 0, 0, 1, 2, 2, 1 ] 70 | esi_02 = [ 0, 1, 0, 2, 1, 2 ] 71 | esi_03 = [ 0, 1, 2, 3, 1, 4 ] 72 | esi_04 = [ 0, 1, 2, 2, 1, 3 ] 73 | esi_05 = [ 0, 1, 2, 3, 1, 3 ] 74 | esi_06 = [ 0, 0, 1, 1, 2, 2 ] 75 | esi_07 = [ 0, 1, 1, 0, 1, 1 ] 76 | esi_08 = [ 0, 0, 0, 0, 0, 0 ] 77 | esi_09 = [ 0, 1, 2, 0, 2, 1 ] 78 | esi_10 = [ 0, 1, 0, 0, 1, 0 ] 79 | esi_11 = [ 0, 1, 2, 2, 1, 0 ] 80 | esi_12 = [ 0, 1, 1, 1, 1, 0 ] 81 | esi_13 = [ 0, 1, 1, 2, 2 ] 82 | esi_14 = [ 0, 0, 1, 2, 1 ] 83 | esi_15 = [ 0, 1, 2, 3, 2 ] 84 | esi_16 = [ 0, 1, 2, 1, 2 ] 85 | esi_17 = [ 0, 1, 1, 1, 1 ] 86 | esi_18 = [ 0, 1, 2, 0 ] 87 | esi_19 = [ 0, 1, 1, 0 ] 88 | esi_20 = [ 0, 0, 0, 0 ] 89 | esi_21 = [ 0, 1, 0 ] 90 | esi_22 = [ 0, 1, 0, 1 ] 91 | esi_23 = [ 0, 1, 0, 2 ] 92 | esi_24 = [ 0, 0, 1, 1 ] 93 | esi_25 = [ 0, 1, 2, 3 ] 94 | esi_26 = [ 0, 0, 1, 2 ] 95 | esi_27 = [ 0, 1, 2 ] 96 | esi_28 = [ 0, 0, 1 ] 97 | esi_29 = [ 0, 0, 0 ] 98 | 99 | eo_00 = [ False, False, False, False, False, False, False, True, False, True, False, True ] 100 | eo_01 = [ False, False, True, True, False, False, False, False, True, True, False, True ] 101 | eo_02 = [ False, False, False, False, True, True, False, False, False, True, True, True ] 102 | eo_03 = [ False, False, False, False, False, False, False, False, False, True, False, False ] 103 | eo_04 = [ False, False, False, False, False, False, True, True, False, True, False, False ] 104 | eo_05 = [ False, False, False, False, False, False, False, False, True, True, True, True ] 105 | eo_06 = [ False, False, False, True, False, False, False, True, False, False, False, True ] 106 | eo_07 = [ False, False, False, False, False, False, False, False, False, False, False, False ] 107 | eo_08 = [ False, False, False, False, True, True, False, False, False, False, True, True ] 108 | eo_09 = [ False, False, False, False, True, True, False, True, False, True, True, False ] 109 | eo_10 = [ False, False, False, False, False, False, False, True, True, False, True, False ] 110 | eo_11 = [ False, False, False, False, True, True, False, True, True, False, True, False ] 111 | eo_12 = [ False, False, False, False, False, False, True, False, True, False, True, False ] 112 | eo_13 = [ False, False, False, False, False, True, True, True, True, False, True, False ] 113 | eo_14 = [ False, False, False, False, True, False, False, False, False, False, True, False ] 114 | eo_15 = [ False, False, False, False, False, True, False, False, False, True ] 115 | eo_16 = [ False, False, True, True, False, False, False, False, False, True ] 116 | eo_17 = [ False, False, False, False, False, False, False, False, False, True ] 117 | eo_18 = [ False, False, True, False, False, False, False, False, True, False ] 118 | eo_19 = [ False, False, False, False, False, False, True, True, True, True ] 119 | eo_20 = [ False, False, False, False, False, True, True, True, True, False ] 120 | eo_21 = [ False, False, False, False, False, False, False, True ] 121 | eo_22 = [ False, False, False, False, False, True, False, True ] 122 | eo_23 = [ False, False, False, False, True, False, True, False ] 123 | eo_24 = [ False, False, False, True, False, False, False, True ] 124 | eo_25 = [ False, False, True, False, True, True, False, True ] 125 | eo_26 = [ False, False, True, False, False, False, True, False ] 126 | eo_27 = [ False, False, False, False, False, True ] 127 | eo_28 = [ False, False, False, False, True, False ] 128 | eo_29 = [ False, False, False, False, False, True, False, False ] 129 | eo_30 = [ False, False, False, False, False, True, True, True ] 130 | eo_31 = [ False, False, True, True, False, False, True, True ] 131 | eo_32 = [ False, False, False, False, True, True, False, False ] 132 | eo_33 = [ False, False, False, False, False, False, False, False ] 133 | eo_34 = [ False, False, False, False, True, True, True, True ] 134 | eo_35 = [ False, False, True, True, False, False, False, False ] 135 | eo_36 = [ False, False, False, True, False, False, False, False ] 136 | eo_37 = [ False, False, False, False, False, True, True, False ] 137 | eo_38 = [ False, False, False, False, True, False, False, False ] 138 | eo_39 = [ False, False, True, True, False, True, True, False ] 139 | eo_40 = [ False, False, False, True, True, True, True, False ] 140 | eo_41 = [ False, False, False, False, False, False ] 141 | eo_42 = [ False, False, True, True, False, False ] 142 | eo_43 = [ False, False, False, True, False, False ] 143 | eo_44 = [ False, False, True, False, False, False ] 144 | 145 | dp_00 = [ 0.12239750492, 0.5, 0.143395479017, 0.625 ] 146 | dp_01 = [ 0.12239750492, 0.5, 0.225335752741, 0.225335752741 ] 147 | dp_02 = [ 0.12239750492, 0.5, 0.225335752741, 0.625 ] 148 | dp_03 = [ 0.12239750492, 0.5, 0.315470053838, 0.5, 0.315470053838, 0.5 ] 149 | dp_04 = [ 0.12239750492, 0.5, 0.225335752741, 0.225335752741, 0.5 ] 150 | dp_05 = [ 0.12239750492, 0.5, 0.225335752741, 0.625, 0.5 ] 151 | dp_06 = [ 0.6, 0.196416770201 ] 152 | dp_07 = [ 0.12239750492, 0.5, 0.225335752741 ] 153 | dp_08 = [ ] 154 | dp_09 = [ 0.12239750492, 0.225335752741 ] 155 | dp_10 = [ 0.12239750492, 0.225335752741, 0.5 ] 156 | dp_11 = [ 0.12239750492, 0.225335752741, 0.225335752741 ] 157 | dp_12 = [ 0.216506350946 ] 158 | dp_13 = [ 0.104512294489, 0.65 ] 159 | dp_14 = [ 0.230769230769, 0.5, 0.225335752741 ] 160 | dp_15 = [ 0.230769230769, 0.5, 0.225335752741, 0.5 ] 161 | dp_16 = [ 0.230769230769, 0.225335752741 ] 162 | dp_17 = [ 0.141304, 0.465108, 0.534891 ] 163 | dp_18 = [ 0.452827026611, 0.5 ] 164 | dp_19 = [ 0.366873818946 ] 165 | dp_20 = [ 0.230769230769 ] 166 | dp_21 = [ 0.230769230769, 0.5 ] 167 | dp_22 = [ 0.5, 0.102564102564 ] 168 | dp_23 = [ 0.230769230769, 0.869565217391 ] 169 | dp_24 = [ 0.5, 0.230769230769, 0.5, 0.5 ] 170 | dp_25 = [ 0.230769230769, 0.5, 0.230769230769 ] 171 | dp_26 = [ 0.5, 0.5, 0.6 ] 172 | dp_27 = [ 0.5, 0.102564102564, 0.102564102564 ] 173 | dp_28 = [ 0.230769230769, 0.230769230769 ] 174 | dp_29 = [ 0.5 ] 175 | dp_30 = [ 0.105263157895 ] 176 | dp_31 = [ 0.196416770201 ] 177 | dp_32 = [ 0.5, 0.196416770201 ] 178 | 179 | tvc_00 = [ 180 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.9, 0, 0, 0, 0.1, 0, 5, 0, 0, -2.5, 3.9, 0, 5.5, 0, -0.4, 0, 5, 0, -4, 0.5, 3.9, 0, 0, 0, 0.1, 0, 5, 0, 0, -1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -5.5, 0, 0.5, 0, 0, 0, 4, -2 ] 181 | tvc_01 = [ 182 | 3.9, 0, 0, 0, 0.1, 0, 5, 0, 0, -2.5, 3.9, 0, 0, 3.5, -0.4, 0, 5, 0, 0, -2, 3.9, 0, 0, 0, 0.1, 0, 5, 0, 0, -1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -3.5, 0, 0.5, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] 183 | tvc_02 = [ 184 | 0, 0, -3.5, 0, 0.5, 0, 0, 0, 4, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.9, 0, 0, 0, 0.1, 0, 5, 0, 0, -2.5, 3.9, 0, 3.5, 0, -0.4, 0, 5, 0, 4, -4.5, 3.9, 0, 0, 0, 0.1, 0, 5, 0, 0, -1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] 185 | tvc_03 = [ 186 | 0, 0, -2.5, 0, 0, 0, 0.5, 0, 0, 0, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.9, 0, 0, 0, 0, 0, 0.1, 0, 5, 0, 0, 0, 0, -2.5, 3.9, 0, 0, 0, 2.5, 0, -0.4, 0, 5, 0, 0, 0, 3, -3.5, 3.9, 0, 0, 0, 0, 0, 0.1, 0, 5, 0, 0, 0, 0, -1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] 187 | tvc_04 = [ 188 | 3.9, 0, 0, 3.5, 0, -0.4, 0, 5, 0, 0, 5, -4.5, 3.9, 0, 0, 0, 0, 0.1, 0, 5, 0, 0, 0, -1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -3.5, 0, 0, 0.5, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.9, 0, 0, 0, 0, 0.1, 0, 5, 0, 0, 0, -2.5 ] 189 | tvc_05 = [ 190 | 3.9, 0, 3.5, 0, 0, -0.4, 0, -5, 0, 4, 0, 0.5, 3.9, 0, 0, 0, 5, -2.4, 0, 5, 0, 0, 0, -1.5, 0, 0, 0, 0, 5, -2.5, 0, 0, 0, 0, 0, 1, 0, 0, -3.5, 0, 0, 0.5, 0, 0, 0, 4, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.9, 0, 0, 0, 0, 0.1, 0, -5, 0, 0, 0, 2.5 ] 191 | tvc_06 = [ 192 | 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, -0.288675134595, 0, 0, 1, 0, 0, 0, 2.5, 1.12583302492, -0.721132486541, -1.44337567297, 1.95, 1.06036297108, 5, 0, -2.5, 0, 3.9, 0.1, 2.5, -1.12583302492, -1.27886751346, 1.44337567297, 1.95, -0.671687836487 ] 193 | tvc_07 = [ 194 | 0, 0, 0, 0, 0, 0, 0, 0, 3.9, 0, 0, 0.1, 0, 5, 0, -2.5, 3.9, 0, 3.5, -0.4, 0, 5, 0, -2, 3.9, 0, 0, 0.1, 0, 5, 0, -1.5, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -3.5, 0.5, 0, 0, 0, 0.5 ] 195 | tvc_08 = [ 196 | 1, 0, 0.5, 0.866025403784, -0.5, 0.866025403784, -1, 0, -0.5, -0.866025403784, 0.5, -0.866025403784 ] 197 | tvc_09 = [ 198 | 0, 0, 0, 0, 0, 0, 3.9, 0, 0.1, 0, 0, 0, 3.9, 3.5, -0.4, 0, 0, 0.5, 3.9, 0, 0.1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, -3.5, 0.5, 0, 0, 0.5 ] 199 | tvc_10 = [ 200 | 0, 0, 0, 0, 0, 0, 0, 0, 3.9, 0, 0, 0.1, 0, 0, 0, 0, 3.9, 3.5, 0, -0.4, 0, 0, 5, -2, 3.9, 0, 0, 0.1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, -3.5, 0, 0.5, 0, 0, 5, -2 ] 201 | tvc_11 = [ 202 | 3.9, 3.5, -0.4, 0, 0, 0.5, 3.9, 0, 0.1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, -3.5, 0.5, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 3.9, 0, 0.1, 0, 0, 0 ] 203 | tvc_12 = [ 204 | 0, -3.5, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 3.9, 0, 0, 0.1, 0, 0, 0, 0, 3.9, 0, 3.5, -0.4, 0, 0, 0, 0.5, 3.9, 0, 0, 0.1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 ] 205 | tvc_13 = [ 206 | 0, 0.5, 0, -0.288675134595, 0, 1, 0, 0, 1.15470053838, 0.75, 2, 0.144337567297, 0, 0.5, 4, 0, -1.15470053838, 0.25, 2, 0.144337567297, 0, 0, 0, 0 ] 207 | tvc_14 = [ 208 | 0, 0, 1, 0, 0, 0, 0, 5, -2.5, 5.1, 0, -0.1, -1.47224318643, 2.5, -1.22113248654, 2.55, 1.44337567297, -0.771687836487, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, -0.866025403784 ] 209 | tvc_15 = [ 210 | 3.9, 0, 0, 0.1, 0, 5, 0, -2.5, 3.9, 0, 3.5, -0.4, 0, 5, 0, -2, 3.9, 0, 0, 0.1, 0, 5, 0, -1.5, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ] 211 | tvc_16 = [ 212 | 3.9, 0, 0, 0, 0.1, 0, 5, 0, 0, -2.5, 3.9, 0, 3.5, 0, -0.4, 0, 5, 0, 4, -4, 3.9, 0, 0, 0, 0.1, 0, 5, 0, 0, -1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] 213 | tvc_17 = [ 214 | 3.9, 0, 0.1, 0, 0, 0, 3.9, 3.5, -0.4, 0, 0, 0.5, 3.9, 0, 0.1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ] 215 | tvc_18 = [ 216 | 0, 0, 5, -2.5, 0, 0, 0, 1, 0, 0, -5, 2.5, 0, 10, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, 3.9, 0, 0, 0.1, 0, -5, 0, 2.5, 3.9, 0, 5, -2.4, 0, 5, 0, -1.5 ] 217 | tvc_19 = [ 218 | 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1.95, 2.5, -0.95, -1.95, 2.5, -1.05, 3.9, 0, 0.1, 0, 5, -2, 1.95, -2.5, 1.55, 1.95, 2.5, -0.45 ] 219 | tvc_20 = [ 220 | 0, -1, 0, 0, 0, 1, 0, 0, 4.95, 0.55, 4.95, 0.55, 0, 0, 9.9, 0.1, -4.95, -0.55, 4.95, 0.55 ] 221 | tvc_21 = [ 222 | 0, 1, 0, 0, 2.925, 0.075, 1.68874953738, 0.0433012701892, 0, 0, 0, 0, -2.925, 1.425, 1.68874953738, -0.822724133595 ] 223 | tvc_22 = [ 224 | 1, 0, 0.75, 0.433012701892, 0, 0, 0.75, -0.433012701892 ] 225 | tvc_23 = [ 226 | 0.5, 0, 0, 0.866025403784, -0.5, 0, 0, -0.866025403784 ] 227 | tvc_24 = [ 228 | 0, 0.57735026919, -1, 0, 1, 0 ] 229 | tvc_25 = [ 230 | 0, 0, 0, 0, 0, 0, 3.9, 0, 0.1, 0, 5, -2.5, 3.9, 0, 0.1, 0, 5, -1.5, 0, 0, 0, 0, 0, 1 ] 231 | tvc_26 = [ 232 | 5, 0, -2, 0, -3.9, -0.1, 0, 0, 1, 0, 0, 0, 5, 0, -2, 0, 3.9, 0.1, 0, 0, 0, 0, 0, 0 ] 233 | tvc_27 = [ 234 | 0, 0, 1, 0, 0, 0, 0, -3.45, 4, 3.9, 0, 0.1, 0, 3.45, -3, 3.9, 0, 0.1, 0, 0, 0, 0, 0, 0 ] 235 | tvc_28 = [ 236 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 5, 0, 0, 0, -1.5, 0, 3.9, 0, 0, 0.1, 0, 0, 5, 0, -2.5, 0, 0, 0, 5, -1.5 ] 237 | tvc_29 = [ 238 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -5, 3.9, 2.6, 3.9, 0, 0, 0.1, 0, -5, 0, 2.5, 3.9, 0, 0, 0.1 ] 239 | tvc_30 = [ 240 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -10, 0, 0, 5, 0, 10, 0, -4, 10, 0, 10, -10, 0, 10, 0, -5, 0, 0, 10, -5 ] 241 | tvc_31 = [ 242 | 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 3.9, 0.1, 0, 0, 3.9, 0.1 ] 243 | tvc_32 = [ 244 | 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 3.9, 0.1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, -2, 0, -3.9, 0, -0.1 ] 245 | tvc_33 = [ 246 | 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3.9, 0, 0.1, 0, 0, 0, 3.9, 0, 0.1, 0, 3.9, 0.1 ] 247 | tvc_34 = [ 248 | 1, 0, 1, 1, 0, 1, 0, 0 ] 249 | tvc_35 = [ 250 | 1.8, 0.1, 0, 0, 0, 1, 0, 1, 0, 0, -1.8, 1.9, 0, 0, 0, 0 ] 251 | tvc_36 = [ 252 | 3.8, 0.1, 0, 0, 0, 0, -3.8, 0.9, -3.8, -0.1, 0, 0, 0, 0, 3.8, -0.9 ] 253 | tvc_37 = [ 254 | 0, 0, 0.57735026919, 0, 0, 1 ] 255 | tvc_38 = [ 256 | 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3.9, 0.1 ] 257 | tvc_39 = [ 258 | 0.5, 0.5, 0, 0, 1, 0 ] 259 | tvc_40 = [ 260 | 0, 1, 0, 0, 0, 0.5, 3.9, 0.1, 0, 0, 0, 0 ] 261 | tvc_41 = [ 262 | 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, -2, 0, 3.9, 0.1 ] 263 | tvc_42 = [ 264 | 1, 0, -0.5, 0.866025403784, -0.5, -0.866025403784 ] 265 | 266 | tc_00 = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3.9, 0, 5.5, 0, -0.4, 0, 5, 0, -4, -0.5 ] 267 | tc_01 = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7.8, 0, 3.5, 3.5, -0.8, 0, 0, 0, 0, 0 ] 268 | tc_02 = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -7.8, 0, -7, 0, 0.8, 0, 0, 0, 0, -1 ] 269 | tc_03 = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -7.8, 0, -2.5, 0, -2.5, 0, 0.8, 0, -10, 0, 3, 0, -3, 4 ] 270 | tc_04 = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -15.6, 0, -7, -7, 0, 1.6, 0, 0, 0, 0, 0, -2 ] 271 | tc_05 = [ 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, -3, 7.8, 0, 7, 0, 0, -0.8, 0, 0, 0, 0, 0, 0 ] 272 | tc_06 = [ -2.5, -3.37749907476, 0.663397459622, 4.33012701892, -1.95, -3.08108891325, -2.5, 3.37749907476, 2.33660254038, -4.33012701892, -1.95, 2.11506350946 ] 273 | tc_07 = [ 0, 0, 0, 0, 0, 0, 0, -1, 7.8, 0, 7, -0.8, 0, 0, 0, 0 ] 274 | tc_08 = [ 1.5, 0.866025403784, 1.5, -0.866025403784 ] 275 | tc_09 = [ 1.5, 0.866025403784, 0, 1.73205080757 ] 276 | tc_10 = [ 0, 0, 0, 0, 0, -1, 3.9, 3.5, -0.4, 0, 0, -0.5 ] 277 | tc_11 = [ 0, 0, 0, 0, 0, 0, 0, -1, 7.8, 7, 0, -0.8, 0, 0, 0, 0 ] 278 | tc_12 = [ 3.9, 3.5, -0.4, 0, 0, 0.5, 3.9, 3.5, -0.4, 0, 0, -0.5 ] 279 | tc_13 = [ 0, 0, 0, 0, 0, 0, 0, -1, -7.8, -3.5, -3.5, 0.8, 0, 0, 0, 0 ] 280 | tc_14 = [ 0, 0, -4, -0.866025403784, 3.46410161514, 0.75, -2, -0.433012701892 ] 281 | tc_15 = [ 4.4167295593, -2.5, 2.66339745962, -2.55, -4.33012701892, 1.34903810568, 0, -5, 2.5, -5.1, 0, -1.63205080757 ] 282 | tc_16 = [ -7.8, 0, -3.5, 0.3, 0, 0, 0, -0.5, -7.8, 0, -3.5, 0.3, 0, 0, 0, 0.5 ] 283 | tc_17 = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7.8, 0, 3.5, 0, -0.3, 0, 10, 0, 4, -7.5 ] 284 | tc_18 = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 15.6, 0, 7, 0, -0.6, 0, 0, 0, 0, 0 ] 285 | tc_19 = [ 0, 0, 0, 0, 0, 0, 0, 1, -15.6, 0, -7, 0.6, 0, 0, 0, 0 ] 286 | tc_20 = [ 0, 0, 0, 0, 0, 1, -7.8, -3.5, 0.3, 0, 0, 0.5 ] 287 | tc_21 = [ 0, 0, 0, 0, 0, 10, 0, -3, -7.8, 0, -10, 4.8, 0, 0, 0, 0 ] 288 | tc_22 = [ -3.9, 5, -3.1, -3.9, -5, 1.9, -3.9, -5, 1.9, 3.9, -5, 3.1 ] 289 | tc_23 = [ 9.9, 1.1, -9.9, -1.1, -9.9, -1.1, -9.9, -1.1 ] 290 | tc_24 = [ 0, 0, 0, 1.73205080757, 0, 1.5, 0, -0.866025403784 ] 291 | tc_25 = [ -1.5, 0.866025403784, -1.5, -0.866025403784 ] 292 | tc_26 = [ 0, 1.73205080757, 1.5, -0.866025403784 ] 293 | tc_27 = [ -1, 1.73205080757, 1, 1.73205080757 ] 294 | tc_28 = [ 1, 1.73205080757, -1, 1.73205080757 ] 295 | tc_29 = [ 1, 1.73205080757, 2, 0 ] 296 | tc_30 = [ 0, 0, 0, 0, 0, -1, 3.9, 0, 0.1, 0, 5, -2.5 ] 297 | tc_31 = [ 0, 0, 0, 0, 0, -1, 7.8, 0, 0.2, 0, 0, 0 ] 298 | tc_32 = [ 0, 0, 0, 0, -7.8, -0.2, 0, 0, 1, 0, 0, 0 ] 299 | tc_33 = [ 0, -6.9, 8, 0, 0, 0, 0, -3.45, 4, -3.9, 0, -0.1 ] 300 | tc_34 = [ -5, 0, -5, 0, 5, 0, -3.9, 0, -5, 1.4, -5, 0, 0, 0, 1.5, 0, -3.9, 0, 0, -0.1 ] 301 | tc_35 = [ 0, 0, 0, 0, 0, -1, 7.8, 0, 0.2, 0, 10, -5 ] 302 | tc_36 = [ 0, 0, 0, 0, -7.8, 0, 0, -0.2, 0, 0, 3.9, 1.1, 0, 0, 0, 0 ] 303 | tc_37 = [ -15.6, 0, -0.4, 0, 0, 0, 0, 0, 0, 0, 0, -1 ] 304 | tc_38 = [ 0, 0, 0, 0, -20, 0, -20, 20, 0, 0, 0, -2, 0, 0, 0, 0 ] 305 | tc_39 = [ 0, 2, 0, 0, 0, 0, -7.8, -0.2 ] 306 | tc_40 = [ 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.8, -7.8, -0.4 ] 307 | tc_41 = [ -7.8, 0, -0.2, 0, 0, 0, -3.9, 0, -0.1, 0, 3.9, 1.1 ] 308 | tc_42 = [ 0, 2, 2, 0 ] 309 | tc_43 = [ 0, 0, 0, 4, 0, -2, 0, 2 ] 310 | tc_44 = [ 0, 0, -7.6, 1.8, 7.6, 0.2, -7.6, 1.8 ] 311 | tc_45 = [ 1, 1, 1, -1 ] 312 | tc_46 = [ 1, 0, 0, 1 ] 313 | tc_47 = [ 0, 0, -3.9, -0.1, 0, 1, 0, 0 ] 314 | tc_48 = [ 0, 0, -3.9, -0.1, 0, 2, 0, 0 ] 315 | tc_49 = [ 0, -3.45, 4, -3.9, 0, -0.1, 0, -3.45, 4, 3.9, 0, 0.1 ] 316 | tc_50 = [ 3.8, 0.1, -3.8, 0.9, -3.8, -0.1, -3.8, 0.9 ] 317 | tc_51 = [ 0, 2, -1.73205080757, 1 ] 318 | tc_52 = [ 0, 2, 0, 0, 0, 1, 3.9, 0.1 ] 319 | tc_53 = [ 0, 1, -1, 0 ] 320 | tc_54 = [ -1, 1, -2, 0 ] 321 | tc_55 = [ 0, 1, 1, 0 ] 322 | tc_56 = [ 0, 0.5, -3.9, -0.1, 0, -0.5, -3.9, -0.1 ] 323 | tc_57 = [ -5, 0, 2, 0, -3.9, -0.1, -5, 0, 3, 0, -3.9, -0.1 ] 324 | tc_58 = [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7.8, 0.2 ] 325 | tc_59 = [ 0, 1, 0, 0, 0, 0, 7.8, 0.2 ] 326 | tc_60 = [ -1.5, 2.59807621135, -3, 0 ] 327 | tc_61 = [ 0, -0.5, -3.9, -0.1, 0, 0.5, -3.9, -0.1 ] 328 | 329 | ac_00 = [ 330 | 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ] 331 | ac_01 = [ 332 | 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 7.8, 0, 0, 3.5, -0.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -0.5 ] 333 | ac_02 = [ 334 | 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -3.9, 0, -3.5, 0, 0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 5, 0, 4, -4.5 ] 335 | ac_03 = [ 336 | 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.5, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 3, 0, 0, -1 ] 337 | ac_04 = [ 338 | 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 7.8, 0, 0, 3.5, 0, -0.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 10, 0, 0, 5, -6, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -3.5, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -0.5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -7.8, 0, -3.5, -3.5, 0, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 10, 0, 0, 5, -7.5 ] 339 | ac_05 = [ 340 | 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 7.8, 0, 3.5, 0, 5, -2.8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 4, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 3.9, 0, 0, 0, 5, -2.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, -1.5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3.9, 0, 3.5, 0, 0, -0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -5, 0, 4, 0, 0.5 ] 341 | ac_06 = [ 342 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -0.5, 0, 0, -0.866025403784, 0, 0, 0.5, 0, 0, 0.866025403784, 0, 0, -0.5, 0, 0, -0.866025403784, 0, 0, -0.5, 0, 0, 0.866025403784, 0, 0, 1, 0, 0, -0.866025403784, 0, 0, -0.5, 0, 0, 0 ] 343 | ac_07 = [ 344 | 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 7.8, 0, 3.5, -0.3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -0.5 ] 345 | ac_08 = [ 346 | 1, 0, 0, 0, 1, 0 ] 347 | ac_09 = [ 348 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ] 349 | ac_10 = [ 350 | 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 7.8, 3.5, 0, -0.3, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 5, -2 ] 351 | ac_11 = [ 352 | 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -3.5, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0.5 ] 353 | ac_12 = [ 354 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0.5, 0, 0.866025403784, 0, 0.5, 0, 0.866025403784, 0, -0.5, 0, -0.866025403784, 0, -0.5, 0, -0.866025403784, 0, 0.5, 0, 0.866025403784, 0, -0.5, 0, -0.866025403784 ] 355 | ac_13 = [ 356 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0.5, 0, 0, 0.866025403784, 0, 0, 1, 0, 0, -0.866025403784, 0, 0, 0.5, 0, 0, 0, 0, 0, -0.5, 0, 0, 0.866025403784, 0, 0, 1.5, 0, 0, -0.866025403784, 0, 0, -0.5, 0, 0, -0.866025403784, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, -1.73205080757, 0, 0, -0.5, 0, 0, -0.866025403784, 0, 0, 0, 0, 0, 0.866025403784, 0, 0, -0.5, 0, 0, -1.73205080757, 0, 0, 0.5, 0, 0, -0.866025403784, 0, 0, -0.5, 0, 0, 0.866025403784, 0, 0, 0.5, 0, 0, -0.866025403784 ] 357 | ac_14 = [ 358 | 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ] 359 | ac_15 = [ 360 | 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 7.8, 0, 3.5, 0, -0.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 10, 0, 4, -6.5 ] 361 | ac_16 = [ 362 | 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 7.8, 0, 3.5, 0, -0.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 10, 0, 4, -6.5, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 15.6, 0, 7, 0, -0.6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 7.8, 0, 3.5, 0, -0.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 10, 0, 4, -6.5 ] 363 | ac_17 = [ 364 | 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, -7.8, 0, -3.5, 0.3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -0.5, 0, 0, 0, 1, 0, 0, 0, 0, -7.8, 0, -3.5, 0.3, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0.5 ] 365 | ac_18 = [ 366 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1 ] 367 | ac_19 = [ 368 | 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 10, 0, -3, 0, 0, 0, 1, 0, 0, 0, 0, -3.9, 0, -5, 2.4, 0, 0, 0, 0, 0, 0, 0, -1, 0, 5, 0, -1.5, 0, 0, 0, -1, 0, 0, 0, 0, 3.9, 0, 5, -2.4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, -1.5 ] 369 | ac_20 = [ 370 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, -1, -3.9, 0, -0.1, 0, 0, 1, 0, 0, 0, 0, -5, 3, 0, 0, 0, 0, 0, 1, -3.9, 0, -1.1, 0, 0, -1, 0, 0, 0, 0, -5, 3 ] 371 | ac_21 = [ 372 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 9.9, 1.1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, -9.9, -1.1, 0, 1, 0, 0, 0, 0 ] 373 | ac_22 = [ 374 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -0.5, 0, 0.866025403784, 0, 1.5, 0, -0.866025403784, 0, -0.5, 0, 0.866025403784, 0, -0.5, 0, -0.866025403784, 0, 1.5, 0, 0.866025403784, 0, -0.5, 0, -0.866025403784, 0, 0.5, 0, 0.866025403784, 0, 0, 0, 0.866025403784, 0, -0.5, 0, 0, 0, -1, 0, 0, 0, 1.5, 0, 0, 0, 1, 0, 0.866025403784, 0, 0.5, 0, -0.866025403784, 0, 0, 0, -0.866025403784, 0, -0.5, 0, 1.73205080757 ] 375 | ac_23 = [ 376 | 1, 0, 0, 0, 1, 0, 0.5, -0.866025403784, 0, 0.866025403784, 0.5, 0, -0.5, -0.866025403784, 0, 0.866025403784, -0.5, 0, -1, 0, 0, 0, -1, 0, -0.5, 0.866025403784, 0, -0.866025403784, -0.5, 0, 0.5, 0.866025403784, 0, -0.866025403784, 0.5, 0 ] 377 | ac_24 = [ 378 | 1, 0, 0, 0, 1, 0, -0.5, -0.866025403784, 1.5, 0.866025403784, -0.5, -0.866025403784, -0.5, 0.866025403784, 1.5, -0.866025403784, -0.5, 0.866025403784, 0.5, 0.866025403784, 0, 0.866025403784, -0.5, 0, 0.5, -0.866025403784, 0, -0.866025403784, -0.5, 1.73205080757, -1, 0, 1.5, 0, 1, 0.866025403784 ] 379 | ac_25 = [ 380 | 1, 0, 0, 0, 1, 0, -0.5, 0.866025403784, 0.75, -0.866025403784, -0.5, 0.433012701892, -0.5, -0.866025403784, 0.75, 0.866025403784, -0.5, -0.433012701892 ] 381 | ac_26 = [ 382 | 1, 0, 0, 0, 1, 0, 0.5, -0.866025403784, 0.75, 0.866025403784, 0.5, 0.433012701892, -0.5, -0.866025403784, 0.75, 0.866025403784, -0.5, 1.29903810568 ] 383 | ac_27 = [ 384 | 1, 0, 0, 0, 1, 0, 0.5, 0.866025403784, 0.75, 0.866025403784, -0.5, 0.433012701892, -0.5, -0.866025403784, 0.75, 0.866025403784, -0.5, -0.433012701892 ] 385 | ac_28 = [ 386 | 1, 0, 0, 0, 1, 0, -0.5, -0.866025403784, 0.75, -0.866025403784, 0.5, 0.433012701892, -0.5, 0.866025403784, 0.75, 0.866025403784, 0.5, -0.433012701892 ] 387 | ac_29 = [ 388 | 1, 0, 0, 0, 1, 0, -0.5, 0.866025403784, -0.5, -0.866025403784, -0.5, 0.866025403784, -0.5, -0.866025403784, 0.5, 0.866025403784, -0.5, 0.866025403784, -0.5, 0.866025403784, -1.5, 0.866025403784, 0.5, 0.866025403784, -0.5, -0.866025403784, -0.5, -0.866025403784, 0.5, 0.866025403784, 1, 0, -1, 0, -1, 1.73205080757 ] 389 | ac_30 = [ 390 | 1, 0, 0, 0, 1, 0, -0.5, 0.866025403784, -0.5, -0.866025403784, -0.5, 0.866025403784, -0.5, -0.866025403784, 0.5, 0.866025403784, -0.5, 0.866025403784, 0.5, -0.866025403784, -0.5, 0.866025403784, 0.5, 0.866025403784, 0.5, 0.866025403784, -1.5, -0.866025403784, 0.5, 0.866025403784, -1, 0, -1, 0, -1, 1.73205080757 ] 391 | ac_31 = [ 392 | 1, 0, 0, 0, 1, 0, -0.5, -0.866025403784, 0.5, 0.866025403784, -0.5, 0.866025403784, -0.5, 0.866025403784, -0.5, -0.866025403784, -0.5, 0.866025403784, 0.5, 0.866025403784, 0.5, -0.866025403784, 0.5, 0.866025403784, 0.5, -0.866025403784, 1.5, 0.866025403784, 0.5, 0.866025403784, -1, 0, 1, 0, -1, 1.73205080757 ] 393 | ac_32 = [ 394 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 7.8, 0, 0.2, 0, 0, 0, 0, 0, 1, 0, 0, 0 ] 395 | ac_33 = [ 396 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3.9, 0, 0.1, 0, 0, 0, 0, 0, -1, 0, 5, -1.5 ] 397 | ac_34 = [ 398 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 5, 0, -1, 0, 0, 0, 0, 0, 1, 0, -3.9, -0.1 ] 399 | ac_35 = [ 400 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -3.45, 4, 0, 0, 0, 0, 0, -1, 3.9, 0, 0.1 ] 401 | ac_36 = [ 402 | 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0 ] 403 | ac_37 = [ 404 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 7.8, 0, 0.2, 0, 0, 0, 0, 0, -1, 0, 10, -4 ] 405 | ac_38 = [ 406 | 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -5, 3.9, 3.6, 0, 0, 0, 0, 0, 0, 0, -1, 3.9, 0, 0, 0.1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -5, 3.9, 3.6, 0, 0, 0, 0, 0, 0, 0, 1, 3.9, 0, 0, 0.1 ] 407 | ac_39 = [ 408 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 7.8, 0, 0.2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, -7.8, 0, -0.2, 0, 0, 0, 0, 0, -1, 0, 0, 1 ] 409 | ac_40 = [ 410 | 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 10, 0, -5, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 10, -5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 10, 0, -4, 0, 0, 0, 0, 0, 0, 0, 1, -10, 0, -10, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, -10, 0, 0, 5 ] 411 | ac_41 = [ 412 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 2, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9, -0.1, 0, 1, 0, 0, 0, 1, 0, 0, 0, -1, 3.9, 0.1 ] 413 | ac_42 = [ 414 | 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 5, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, -1, 0, -3.9, 0, -0.1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 3.9, 0.1, 0, 0, 0, -1, 0, 0, 0, 0, 5, 0, 0, -2.5, 0, 0, 0, 0, 0, 0, 0, 1, 0, -3.9, -3.9, -0.2 ] 415 | ac_43 = [ 416 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 3.9, 0, 0.1, 0, 0, 0, 0, 0, -1, 0, 3.9, 1.1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, -3.9, 0, -0.1, 0, 0, 0, 0, 0, -1, 0, 3.9, 1.1 ] 417 | ac_44 = [ 418 | 1, 0, 0, 0, 1, 0, 0, 1, 0, -1, 0, 2, -1, 0, 2, 0, -1, 2, 0, -1, 2, 1, 0, 0 ] 419 | ac_45 = [ 420 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 2, 0, -1, 0, 0, 0, 2, 0, 0, 0, -1, 0, 2, 0, 0, 0, -1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, -1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, -1, 0, 2, 0, -1, 0, 0, 0, 4 ] 421 | ac_46 = [ 422 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 3.8, 0.1, 0, 0, 0, -1, -3.8, 0.9 ] 423 | ac_47 = [ 424 | 1, 0, 0, 0, 1, 0, 0, -1, 2, 1, 0, 0 ] 425 | ac_48 = [ 426 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ] 427 | ac_49 = [ 428 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 2, 0, 0, 0, -1, 3.9, 0.1 ] 429 | ac_50 = [ 430 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -3.45, 5, 0, 0, 0, 0, 0, -1, 3.9, 0, 0.1 ] 431 | ac_51 = [ 432 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 5, 0, -1, 0, 0, 0, 0, 0, -1, 0, -3.9, -0.1 ] 433 | ac_52 = [ 434 | 1, 0, 0, 0, 1, 0, 0, -1, 2, 1, 0, 0, -1, 0, 2, 0, -1, 2, 0, 1, 0, -1, 0, 2 ] 435 | ac_53 = [ 436 | 1, 0, 0, 0, 1, 0, 0.5, 0.866025403784, -0.866025403784, -0.866025403784, 0.5, 0.5, -0.5, 0.866025403784, -0.866025403784, -0.866025403784, -0.5, 1.5, -1, 0, 0, 0, -1, 2, -0.5, -0.866025403784, 0.866025403784, 0.866025403784, -0.5, 1.5, 0.5, -0.866025403784, 0.866025403784, 0.866025403784, 0.5, 0.5, -1, 0, 0, 0, 1, 0, -0.5, 0.866025403784, -0.866025403784, 0.866025403784, 0.5, 0.5, 0.5, 0.866025403784, -0.866025403784, 0.866025403784, -0.5, 1.5, 1, 0, 0, 0, -1, 2, 0.5, -0.866025403784, 0.866025403784, -0.866025403784, -0.5, 1.5, -0.5, -0.866025403784, 0.866025403784, -0.866025403784, 0.5, 0.5 ] 437 | ac_54 = [ 438 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, -1, 3.9, 0.1, 0, -1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, -1, 3.9, 0.1 ] 439 | ac_55 = [ 440 | 1, 0, 0, 0, 1, 0, 0, 1, 0, -1, 0, 1, -1, 0, 1, 0, -1, 1, 0, -1, 1, 1, 0, 0 ] 441 | ac_56 = [ 442 | 1, 0, 0, 0, 1, 0, 0, 1, 0, -1, 0, 1, -1, 0, 1, 0, -1, 1, 0, -1, 1, 1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0, -1, 0, 1, 1, 0, -1, 0, -1, 1, 0, 1, -1, 1, 0, 0 ] 443 | ac_57 = [ 444 | 1, 0, 0, 0, 1, 0, 0, -1, 1, 1, 0, 0, -1, 0, 1, 0, -1, 1, 0, 1, 0, -1, 0, 1 ] 445 | ac_58 = [ 446 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0 ] 447 | ac_59 = [ 448 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0 ] 449 | ac_60 = [ 450 | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 5, 0, -1, 0, 0, 0, 0, 0, -1, 0, 3.9, 0.1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 7.8, 0.2, 0, 0, -1, 0, 0, 0, 5, 0, -1, 0, 0, 0, 0, 0, 1, 0, 3.9, 0.1 ] 451 | ac_61 = [ 452 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, -1, 7.8, 0.2, 0, 1, 0, 0, 0, 0.5, 0, 0, 0, -1, 3.9, 0.1, 0, -1, 0, 0, 0, 1.5, 0, 0, 0, 1, 3.9, 0.1 ] 453 | ac_62 = [ 454 | 1, 0, 0, 0, 1, 0, 0.5, -0.866025403784, 0.5, 0.866025403784, 0.5, 0.866025403784, -0.5, -0.866025403784, 0, 0.866025403784, -0.5, 1.73205080757, -1, 0, -1, 0, -1, 1.73205080757, -0.5, 0.866025403784, -1.5, -0.866025403784, -0.5, 0.866025403784, 0.5, 0.866025403784, -1, -0.866025403784, 0.5, 0 ] 455 | ac_63 = [ 456 | 1, 0, 0, 0, 1, 0, -1, 0, 0.5, 0, -1, 0.866025403784 ] 457 | ac_64 = [ 458 | 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0 ] 459 | 460 | c_00 = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 2, 0, 1, 3 ] 461 | c_01 = [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 2, 3 ] 462 | c_02 = [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 2, 0, 1, 3 ] 463 | c_03 = [ 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 2, 0, 1, 3 ] 464 | c_04 = [ 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 2, 3 ] 465 | c_05 = [ 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 3 ] 466 | c_06 = [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 1, 2, 3 ] 467 | c_07 = [ 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 2, 0, 1, 3 ] 468 | c_08 = [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 2, 0, 1, 3 ] 469 | c_09 = [ 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 1, 2, 0, 3 ] 470 | c_10 = [ 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 1, 2, 3 ] 471 | c_11 = [ 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 0, 3 ] 472 | c_12 = [ 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 2, 3 ] 473 | c_13 = [ 0, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 2, 0, 1, 3 ] 474 | c_14 = [ 0, 1, 2, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 3 ] 475 | c_15 = [ 0, 2, 1, 1, 0, 2, 0, 0, 0, 0, 0, 0, 1, 2, 0, 2, 0, 1, 3 ] 476 | c_16 = [ 0, 2, 1, 0, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 1, 1, 2, 0, 3 ] 477 | c_17 = [ 1, 0, 2, 2, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 2, 0, 1, 3 ] 478 | c_18 = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 1, 0, 2, 2 ] 479 | c_19 = [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 2, 2 ] 480 | c_20 = [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 2 ] 481 | c_21 = [ 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 2 ] 482 | c_22 = [ 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 2, 2 ] 483 | c_23 = [ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 2 ] 484 | c_24 = [ 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 2 ] 485 | c_25 = [ 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 2 ] 486 | c_26 = [ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 2, 0, 1, 2, 2 ] 487 | c_27 = [ 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 1, 0, 2, 2 ] 488 | c_28 = [ 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 2 ] 489 | 490 | _data = [ 491 | # IH00 is undefined 492 | None, 493 | 494 | # IH01 495 | { 496 | "num_params": 4, 497 | "num_aspects": 1, 498 | "num_vertices": 6, 499 | "num_edge_shapes": 3, 500 | "edge_shapes": es_00, 501 | "edge_orientations": eo_00, 502 | "edge_shape_ids": esi_00, 503 | "default_params": dp_00, 504 | "vertex_coeffs": tvc_00, 505 | "translation_coeffs": tc_00, 506 | "aspect_coeffs": ac_00, 507 | "coloring": c_00 508 | }, 509 | 510 | # IH02 511 | { 512 | "num_params": 4, 513 | "num_aspects": 2, 514 | "num_vertices": 6, 515 | "num_edge_shapes": 3, 516 | "edge_shapes": es_00, 517 | "edge_orientations": eo_01, 518 | "edge_shape_ids": esi_01, 519 | "default_params": dp_01, 520 | "vertex_coeffs": tvc_01, 521 | "translation_coeffs": tc_01, 522 | "aspect_coeffs": ac_01, 523 | "coloring": c_01 524 | }, 525 | 526 | # IH03 527 | { 528 | "num_params": 4, 529 | "num_aspects": 2, 530 | "num_vertices": 6, 531 | "num_edge_shapes": 3, 532 | "edge_shapes": es_00, 533 | "edge_orientations": eo_02, 534 | "edge_shape_ids": esi_02, 535 | "default_params": dp_02, 536 | "vertex_coeffs": tvc_02, 537 | "translation_coeffs": tc_02, 538 | "aspect_coeffs": ac_02, 539 | "coloring": c_02 540 | }, 541 | 542 | # IH04 543 | { 544 | "num_params": 6, 545 | "num_aspects": 2, 546 | "num_vertices": 6, 547 | "num_edge_shapes": 5, 548 | "edge_shapes": es_01, 549 | "edge_orientations": eo_03, 550 | "edge_shape_ids": esi_03, 551 | "default_params": dp_03, 552 | "vertex_coeffs": tvc_03, 553 | "translation_coeffs": tc_03, 554 | "aspect_coeffs": ac_03, 555 | "coloring": c_02 556 | }, 557 | 558 | # IH05 559 | { 560 | "num_params": 5, 561 | "num_aspects": 4, 562 | "num_vertices": 6, 563 | "num_edge_shapes": 4, 564 | "edge_shapes": es_02, 565 | "edge_orientations": eo_04, 566 | "edge_shape_ids": esi_04, 567 | "default_params": dp_04, 568 | "vertex_coeffs": tvc_04, 569 | "translation_coeffs": tc_04, 570 | "aspect_coeffs": ac_04, 571 | "coloring": c_03 572 | }, 573 | 574 | # IH06 575 | { 576 | "num_params": 5, 577 | "num_aspects": 4, 578 | "num_vertices": 6, 579 | "num_edge_shapes": 4, 580 | "edge_shapes": es_03, 581 | "edge_orientations": eo_05, 582 | "edge_shape_ids": esi_05, 583 | "default_params": dp_05, 584 | "vertex_coeffs": tvc_05, 585 | "translation_coeffs": tc_05, 586 | "aspect_coeffs": ac_05, 587 | "coloring": c_04 588 | }, 589 | 590 | # IH07 591 | { 592 | "num_params": 2, 593 | "num_aspects": 3, 594 | "num_vertices": 6, 595 | "num_edge_shapes": 3, 596 | "edge_shapes": es_00, 597 | "edge_orientations": eo_06, 598 | "edge_shape_ids": esi_06, 599 | "default_params": dp_06, 600 | "vertex_coeffs": tvc_06, 601 | "translation_coeffs": tc_06, 602 | "aspect_coeffs": ac_06, 603 | "coloring": c_05 604 | }, 605 | 606 | # IH08 607 | { 608 | "num_params": 4, 609 | "num_aspects": 1, 610 | "num_vertices": 6, 611 | "num_edge_shapes": 3, 612 | "edge_shapes": es_04, 613 | "edge_orientations": eo_07, 614 | "edge_shape_ids": esi_00, 615 | "default_params": dp_00, 616 | "vertex_coeffs": tvc_00, 617 | "translation_coeffs": tc_00, 618 | "aspect_coeffs": ac_00, 619 | "coloring": c_00 620 | }, 621 | 622 | # IH09 623 | { 624 | "num_params": 3, 625 | "num_aspects": 2, 626 | "num_vertices": 6, 627 | "num_edge_shapes": 2, 628 | "edge_shapes": es_05, 629 | "edge_orientations": eo_08, 630 | "edge_shape_ids": esi_07, 631 | "default_params": dp_07, 632 | "vertex_coeffs": tvc_07, 633 | "translation_coeffs": tc_07, 634 | "aspect_coeffs": ac_07, 635 | "coloring": c_06 636 | }, 637 | 638 | # IH10 639 | { 640 | "num_params": 0, 641 | "num_aspects": 1, 642 | "num_vertices": 6, 643 | "num_edge_shapes": 1, 644 | "edge_shapes": es_06, 645 | "edge_orientations": eo_06, 646 | "edge_shape_ids": esi_08, 647 | "default_params": dp_08, 648 | "vertex_coeffs": tvc_08, 649 | "translation_coeffs": tc_08, 650 | "aspect_coeffs": ac_08, 651 | "coloring": c_00 652 | }, 653 | 654 | # IH11 655 | { 656 | "num_params": 0, 657 | "num_aspects": 1, 658 | "num_vertices": 6, 659 | "num_edge_shapes": 1, 660 | "edge_shapes": es_07, 661 | "edge_orientations": eo_07, 662 | "edge_shape_ids": esi_08, 663 | "default_params": dp_08, 664 | "vertex_coeffs": tvc_08, 665 | "translation_coeffs": tc_09, 666 | "aspect_coeffs": ac_08, 667 | "coloring": c_00 668 | }, 669 | 670 | # IH12 671 | { 672 | "num_params": 2, 673 | "num_aspects": 1, 674 | "num_vertices": 6, 675 | "num_edge_shapes": 2, 676 | "edge_shapes": es_08, 677 | "edge_orientations": eo_09, 678 | "edge_shape_ids": esi_07, 679 | "default_params": dp_09, 680 | "vertex_coeffs": tvc_09, 681 | "translation_coeffs": tc_10, 682 | "aspect_coeffs": ac_09, 683 | "coloring": c_00 684 | }, 685 | 686 | # IH13 687 | { 688 | "num_params": 3, 689 | "num_aspects": 2, 690 | "num_vertices": 6, 691 | "num_edge_shapes": 3, 692 | "edge_shapes": es_09, 693 | "edge_orientations": eo_10, 694 | "edge_shape_ids": esi_09, 695 | "default_params": dp_10, 696 | "vertex_coeffs": tvc_10, 697 | "translation_coeffs": tc_11, 698 | "aspect_coeffs": ac_10, 699 | "coloring": c_06 700 | }, 701 | 702 | # IH14 703 | { 704 | "num_params": 2, 705 | "num_aspects": 1, 706 | "num_vertices": 6, 707 | "num_edge_shapes": 2, 708 | "edge_shapes": es_10, 709 | "edge_orientations": eo_11, 710 | "edge_shape_ids": esi_10, 711 | "default_params": dp_09, 712 | "vertex_coeffs": tvc_11, 713 | "translation_coeffs": tc_12, 714 | "aspect_coeffs": ac_09, 715 | "coloring": c_00 716 | }, 717 | 718 | # IH15 719 | { 720 | "num_params": 3, 721 | "num_aspects": 2, 722 | "num_vertices": 6, 723 | "num_edge_shapes": 3, 724 | "edge_shapes": es_11, 725 | "edge_orientations": eo_12, 726 | "edge_shape_ids": esi_11, 727 | "default_params": dp_11, 728 | "vertex_coeffs": tvc_12, 729 | "translation_coeffs": tc_13, 730 | "aspect_coeffs": ac_11, 731 | "coloring": c_06 732 | }, 733 | 734 | # IH16 735 | { 736 | "num_params": 1, 737 | "num_aspects": 3, 738 | "num_vertices": 6, 739 | "num_edge_shapes": 2, 740 | "edge_shapes": es_12, 741 | "edge_orientations": eo_13, 742 | "edge_shape_ids": esi_12, 743 | "default_params": dp_12, 744 | "vertex_coeffs": tvc_13, 745 | "translation_coeffs": tc_14, 746 | "aspect_coeffs": ac_12, 747 | "coloring": c_05 748 | }, 749 | 750 | # IH17 751 | { 752 | "num_params": 2, 753 | "num_aspects": 1, 754 | "num_vertices": 6, 755 | "num_edge_shapes": 2, 756 | "edge_shapes": es_13, 757 | "edge_orientations": eo_14, 758 | "edge_shape_ids": esi_07, 759 | "default_params": dp_09, 760 | "vertex_coeffs": tvc_09, 761 | "translation_coeffs": tc_10, 762 | "aspect_coeffs": ac_09, 763 | "coloring": c_00 764 | }, 765 | 766 | # IH18 767 | { 768 | "num_params": 0, 769 | "num_aspects": 1, 770 | "num_vertices": 6, 771 | "num_edge_shapes": 1, 772 | "edge_shapes": es_14, 773 | "edge_orientations": eo_06, 774 | "edge_shape_ids": esi_08, 775 | "default_params": dp_08, 776 | "vertex_coeffs": tvc_08, 777 | "translation_coeffs": tc_09, 778 | "aspect_coeffs": ac_08, 779 | "coloring": c_00 780 | }, 781 | 782 | # IH19 is undefined 783 | None, 784 | 785 | # IH20 786 | { 787 | "num_params": 0, 788 | "num_aspects": 1, 789 | "num_vertices": 6, 790 | "num_edge_shapes": 1, 791 | "edge_shapes": es_15, 792 | "edge_orientations": eo_07, 793 | "edge_shape_ids": esi_08, 794 | "default_params": dp_08, 795 | "vertex_coeffs": tvc_08, 796 | "translation_coeffs": tc_09, 797 | "aspect_coeffs": ac_08, 798 | "coloring": c_00 799 | }, 800 | 801 | # IH21 802 | { 803 | "num_params": 2, 804 | "num_aspects": 6, 805 | "num_vertices": 5, 806 | "num_edge_shapes": 3, 807 | "edge_shapes": es_16, 808 | "edge_orientations": eo_15, 809 | "edge_shape_ids": esi_13, 810 | "default_params": dp_13, 811 | "vertex_coeffs": tvc_14, 812 | "translation_coeffs": tc_15, 813 | "aspect_coeffs": ac_13, 814 | "coloring": c_07 815 | }, 816 | 817 | # IH22 818 | { 819 | "num_params": 3, 820 | "num_aspects": 2, 821 | "num_vertices": 5, 822 | "num_edge_shapes": 3, 823 | "edge_shapes": es_17, 824 | "edge_orientations": eo_16, 825 | "edge_shape_ids": esi_14, 826 | "default_params": dp_14, 827 | "vertex_coeffs": tvc_15, 828 | "translation_coeffs": tc_16, 829 | "aspect_coeffs": ac_14, 830 | "coloring": c_06 831 | }, 832 | 833 | # IH23 834 | { 835 | "num_params": 4, 836 | "num_aspects": 2, 837 | "num_vertices": 5, 838 | "num_edge_shapes": 4, 839 | "edge_shapes": es_18, 840 | "edge_orientations": eo_17, 841 | "edge_shape_ids": esi_15, 842 | "default_params": dp_15, 843 | "vertex_coeffs": tvc_16, 844 | "translation_coeffs": tc_17, 845 | "aspect_coeffs": ac_15, 846 | "coloring": c_08 847 | }, 848 | 849 | # IH24 850 | { 851 | "num_params": 4, 852 | "num_aspects": 4, 853 | "num_vertices": 5, 854 | "num_edge_shapes": 4, 855 | "edge_shapes": es_19, 856 | "edge_orientations": eo_17, 857 | "edge_shape_ids": esi_15, 858 | "default_params": dp_15, 859 | "vertex_coeffs": tvc_16, 860 | "translation_coeffs": tc_18, 861 | "aspect_coeffs": ac_16, 862 | "coloring": c_09 863 | }, 864 | 865 | # IH25 866 | { 867 | "num_params": 3, 868 | "num_aspects": 4, 869 | "num_vertices": 5, 870 | "num_edge_shapes": 3, 871 | "edge_shapes": es_20, 872 | "edge_orientations": eo_16, 873 | "edge_shape_ids": esi_14, 874 | "default_params": dp_14, 875 | "vertex_coeffs": tvc_15, 876 | "translation_coeffs": tc_19, 877 | "aspect_coeffs": ac_17, 878 | "coloring": c_10 879 | }, 880 | 881 | # IH26 882 | { 883 | "num_params": 2, 884 | "num_aspects": 2, 885 | "num_vertices": 5, 886 | "num_edge_shapes": 3, 887 | "edge_shapes": es_21, 888 | "edge_orientations": eo_18, 889 | "edge_shape_ids": esi_14, 890 | "default_params": dp_16, 891 | "vertex_coeffs": tvc_17, 892 | "translation_coeffs": tc_20, 893 | "aspect_coeffs": ac_18, 894 | "coloring": c_01 895 | }, 896 | 897 | # IH27 898 | { 899 | "num_params": 3, 900 | "num_aspects": 4, 901 | "num_vertices": 5, 902 | "num_edge_shapes": 3, 903 | "edge_shapes": es_16, 904 | "edge_orientations": eo_19, 905 | "edge_shape_ids": esi_16, 906 | "default_params": dp_17, 907 | "vertex_coeffs": tvc_18, 908 | "translation_coeffs": tc_21, 909 | "aspect_coeffs": ac_19, 910 | "coloring": c_11 911 | }, 912 | 913 | # IH28 914 | { 915 | "num_params": 2, 916 | "num_aspects": 4, 917 | "num_vertices": 5, 918 | "num_edge_shapes": 3, 919 | "edge_shapes": es_16, 920 | "edge_orientations": eo_15, 921 | "edge_shape_ids": esi_13, 922 | "default_params": dp_18, 923 | "vertex_coeffs": tvc_19, 924 | "translation_coeffs": tc_22, 925 | "aspect_coeffs": ac_20, 926 | "coloring": c_12 927 | }, 928 | 929 | # IH29 930 | { 931 | "num_params": 1, 932 | "num_aspects": 4, 933 | "num_vertices": 5, 934 | "num_edge_shapes": 2, 935 | "edge_shapes": es_12, 936 | "edge_orientations": eo_20, 937 | "edge_shape_ids": esi_17, 938 | "default_params": dp_19, 939 | "vertex_coeffs": tvc_20, 940 | "translation_coeffs": tc_23, 941 | "aspect_coeffs": ac_21, 942 | "coloring": c_04 943 | }, 944 | 945 | # IH30 946 | { 947 | "num_params": 1, 948 | "num_aspects": 6, 949 | "num_vertices": 4, 950 | "num_edge_shapes": 3, 951 | "edge_shapes": es_22, 952 | "edge_orientations": eo_21, 953 | "edge_shape_ids": esi_18, 954 | "default_params": dp_20, 955 | "vertex_coeffs": tvc_21, 956 | "translation_coeffs": tc_24, 957 | "aspect_coeffs": ac_22, 958 | "coloring": c_13 959 | }, 960 | 961 | # IH31 962 | { 963 | "num_params": 0, 964 | "num_aspects": 6, 965 | "num_vertices": 4, 966 | "num_edge_shapes": 2, 967 | "edge_shapes": es_23, 968 | "edge_orientations": eo_22, 969 | "edge_shape_ids": esi_19, 970 | "default_params": dp_08, 971 | "vertex_coeffs": tvc_22, 972 | "translation_coeffs": tc_25, 973 | "aspect_coeffs": ac_23, 974 | "coloring": c_14 975 | }, 976 | 977 | # IH32 978 | { 979 | "num_params": 0, 980 | "num_aspects": 6, 981 | "num_vertices": 4, 982 | "num_edge_shapes": 2, 983 | "edge_shapes": es_24, 984 | "edge_orientations": eo_23, 985 | "edge_shape_ids": esi_19, 986 | "default_params": dp_08, 987 | "vertex_coeffs": tvc_22, 988 | "translation_coeffs": tc_26, 989 | "aspect_coeffs": ac_24, 990 | "coloring": c_15 991 | }, 992 | 993 | # IH33 994 | { 995 | "num_params": 0, 996 | "num_aspects": 3, 997 | "num_vertices": 4, 998 | "num_edge_shapes": 2, 999 | "edge_shapes": es_23, 1000 | "edge_orientations": eo_22, 1001 | "edge_shape_ids": esi_19, 1002 | "default_params": dp_08, 1003 | "vertex_coeffs": tvc_23, 1004 | "translation_coeffs": tc_08, 1005 | "aspect_coeffs": ac_25, 1006 | "coloring": c_05 1007 | }, 1008 | 1009 | # IH34 1010 | { 1011 | "num_params": 0, 1012 | "num_aspects": 3, 1013 | "num_vertices": 4, 1014 | "num_edge_shapes": 1, 1015 | "edge_shapes": es_06, 1016 | "edge_orientations": eo_24, 1017 | "edge_shape_ids": esi_20, 1018 | "default_params": dp_08, 1019 | "vertex_coeffs": tvc_23, 1020 | "translation_coeffs": tc_09, 1021 | "aspect_coeffs": ac_26, 1022 | "coloring": c_05 1023 | }, 1024 | 1025 | # IH35 is undefined 1026 | None, 1027 | 1028 | # IH36 1029 | { 1030 | "num_params": 0, 1031 | "num_aspects": 3, 1032 | "num_vertices": 4, 1033 | "num_edge_shapes": 1, 1034 | "edge_shapes": es_06, 1035 | "edge_orientations": eo_25, 1036 | "edge_shape_ids": esi_20, 1037 | "default_params": dp_08, 1038 | "vertex_coeffs": tvc_23, 1039 | "translation_coeffs": tc_08, 1040 | "aspect_coeffs": ac_27, 1041 | "coloring": c_05 1042 | }, 1043 | 1044 | # IH37 1045 | { 1046 | "num_params": 0, 1047 | "num_aspects": 3, 1048 | "num_vertices": 4, 1049 | "num_edge_shapes": 1, 1050 | "edge_shapes": es_15, 1051 | "edge_orientations": eo_26, 1052 | "edge_shape_ids": esi_20, 1053 | "default_params": dp_08, 1054 | "vertex_coeffs": tvc_23, 1055 | "translation_coeffs": tc_08, 1056 | "aspect_coeffs": ac_28, 1057 | "coloring": c_05 1058 | }, 1059 | 1060 | # IH38 1061 | { 1062 | "num_params": 0, 1063 | "num_aspects": 6, 1064 | "num_vertices": 3, 1065 | "num_edge_shapes": 2, 1066 | "edge_shapes": es_10, 1067 | "edge_orientations": eo_27, 1068 | "edge_shape_ids": esi_21, 1069 | "default_params": dp_08, 1070 | "vertex_coeffs": tvc_24, 1071 | "translation_coeffs": tc_27, 1072 | "aspect_coeffs": ac_29, 1073 | "coloring": c_15 1074 | }, 1075 | 1076 | # IH39 1077 | { 1078 | "num_params": 0, 1079 | "num_aspects": 6, 1080 | "num_vertices": 3, 1081 | "num_edge_shapes": 2, 1082 | "edge_shapes": es_25, 1083 | "edge_orientations": eo_27, 1084 | "edge_shape_ids": esi_21, 1085 | "default_params": dp_08, 1086 | "vertex_coeffs": tvc_24, 1087 | "translation_coeffs": tc_28, 1088 | "aspect_coeffs": ac_30, 1089 | "coloring": c_16 1090 | }, 1091 | 1092 | # IH40 1093 | { 1094 | "num_params": 0, 1095 | "num_aspects": 6, 1096 | "num_vertices": 3, 1097 | "num_edge_shapes": 2, 1098 | "edge_shapes": es_24, 1099 | "edge_orientations": eo_28, 1100 | "edge_shape_ids": esi_21, 1101 | "default_params": dp_08, 1102 | "vertex_coeffs": tvc_24, 1103 | "translation_coeffs": tc_29, 1104 | "aspect_coeffs": ac_31, 1105 | "coloring": c_17 1106 | }, 1107 | 1108 | # IH41 1109 | { 1110 | "num_params": 2, 1111 | "num_aspects": 1, 1112 | "num_vertices": 4, 1113 | "num_edge_shapes": 2, 1114 | "edge_shapes": es_23, 1115 | "edge_orientations": eo_22, 1116 | "edge_shape_ids": esi_22, 1117 | "default_params": dp_21, 1118 | "vertex_coeffs": tvc_25, 1119 | "translation_coeffs": tc_30, 1120 | "aspect_coeffs": ac_09, 1121 | "coloring": c_18 1122 | }, 1123 | 1124 | # IH42 1125 | { 1126 | "num_params": 2, 1127 | "num_aspects": 2, 1128 | "num_vertices": 4, 1129 | "num_edge_shapes": 3, 1130 | "edge_shapes": es_22, 1131 | "edge_orientations": eo_29, 1132 | "edge_shape_ids": esi_23, 1133 | "default_params": dp_21, 1134 | "vertex_coeffs": tvc_25, 1135 | "translation_coeffs": tc_31, 1136 | "aspect_coeffs": ac_32, 1137 | "coloring": c_19 1138 | }, 1139 | 1140 | # IH43 1141 | { 1142 | "num_params": 2, 1143 | "num_aspects": 2, 1144 | "num_vertices": 4, 1145 | "num_edge_shapes": 2, 1146 | "edge_shapes": es_23, 1147 | "edge_orientations": eo_30, 1148 | "edge_shape_ids": esi_22, 1149 | "default_params": dp_21, 1150 | "vertex_coeffs": tvc_25, 1151 | "translation_coeffs": tc_31, 1152 | "aspect_coeffs": ac_33, 1153 | "coloring": c_19 1154 | }, 1155 | 1156 | # IH44 1157 | { 1158 | "num_params": 2, 1159 | "num_aspects": 2, 1160 | "num_vertices": 4, 1161 | "num_edge_shapes": 2, 1162 | "edge_shapes": es_23, 1163 | "edge_orientations": eo_31, 1164 | "edge_shape_ids": esi_24, 1165 | "default_params": dp_22, 1166 | "vertex_coeffs": tvc_26, 1167 | "translation_coeffs": tc_32, 1168 | "aspect_coeffs": ac_34, 1169 | "coloring": c_20 1170 | }, 1171 | 1172 | # IH45 1173 | { 1174 | "num_params": 2, 1175 | "num_aspects": 2, 1176 | "num_vertices": 4, 1177 | "num_edge_shapes": 3, 1178 | "edge_shapes": es_22, 1179 | "edge_orientations": eo_32, 1180 | "edge_shape_ids": esi_23, 1181 | "default_params": dp_23, 1182 | "vertex_coeffs": tvc_27, 1183 | "translation_coeffs": tc_33, 1184 | "aspect_coeffs": ac_35, 1185 | "coloring": c_20 1186 | }, 1187 | 1188 | # IH46 1189 | { 1190 | "num_params": 4, 1191 | "num_aspects": 2, 1192 | "num_vertices": 4, 1193 | "num_edge_shapes": 4, 1194 | "edge_shapes": es_26, 1195 | "edge_orientations": eo_33, 1196 | "edge_shape_ids": esi_25, 1197 | "default_params": dp_24, 1198 | "vertex_coeffs": tvc_28, 1199 | "translation_coeffs": tc_34, 1200 | "aspect_coeffs": ac_36, 1201 | "coloring": c_20 1202 | }, 1203 | 1204 | # IH47 1205 | { 1206 | "num_params": 2, 1207 | "num_aspects": 2, 1208 | "num_vertices": 4, 1209 | "num_edge_shapes": 3, 1210 | "edge_shapes": es_27, 1211 | "edge_orientations": eo_29, 1212 | "edge_shape_ids": esi_23, 1213 | "default_params": dp_21, 1214 | "vertex_coeffs": tvc_25, 1215 | "translation_coeffs": tc_35, 1216 | "aspect_coeffs": ac_37, 1217 | "coloring": c_19 1218 | }, 1219 | 1220 | # IH48 is undefined 1221 | None, 1222 | 1223 | # IH49 1224 | { 1225 | "num_params": 3, 1226 | "num_aspects": 4, 1227 | "num_vertices": 4, 1228 | "num_edge_shapes": 4, 1229 | "edge_shapes": es_28, 1230 | "edge_orientations": eo_33, 1231 | "edge_shape_ids": esi_25, 1232 | "default_params": dp_25, 1233 | "vertex_coeffs": tvc_29, 1234 | "translation_coeffs": tc_36, 1235 | "aspect_coeffs": ac_38, 1236 | "coloring": c_21 1237 | }, 1238 | 1239 | # IH50 1240 | { 1241 | "num_params": 2, 1242 | "num_aspects": 4, 1243 | "num_vertices": 4, 1244 | "num_edge_shapes": 3, 1245 | "edge_shapes": es_29, 1246 | "edge_orientations": eo_29, 1247 | "edge_shape_ids": esi_23, 1248 | "default_params": dp_21, 1249 | "vertex_coeffs": tvc_25, 1250 | "translation_coeffs": tc_37, 1251 | "aspect_coeffs": ac_39, 1252 | "coloring": c_22 1253 | }, 1254 | 1255 | # IH51 1256 | { 1257 | "num_params": 3, 1258 | "num_aspects": 4, 1259 | "num_vertices": 4, 1260 | "num_edge_shapes": 3, 1261 | "edge_shapes": es_27, 1262 | "edge_orientations": eo_32, 1263 | "edge_shape_ids": esi_23, 1264 | "default_params": dp_26, 1265 | "vertex_coeffs": tvc_30, 1266 | "translation_coeffs": tc_38, 1267 | "aspect_coeffs": ac_40, 1268 | "coloring": c_21 1269 | }, 1270 | 1271 | # IH52 1272 | { 1273 | "num_params": 1, 1274 | "num_aspects": 4, 1275 | "num_vertices": 4, 1276 | "num_edge_shapes": 2, 1277 | "edge_shapes": es_23, 1278 | "edge_orientations": eo_34, 1279 | "edge_shape_ids": esi_22, 1280 | "default_params": dp_20, 1281 | "vertex_coeffs": tvc_31, 1282 | "translation_coeffs": tc_39, 1283 | "aspect_coeffs": ac_41, 1284 | "coloring": c_23 1285 | }, 1286 | 1287 | # IH53 1288 | { 1289 | "num_params": 3, 1290 | "num_aspects": 4, 1291 | "num_vertices": 4, 1292 | "num_edge_shapes": 3, 1293 | "edge_shapes": es_27, 1294 | "edge_orientations": eo_35, 1295 | "edge_shape_ids": esi_26, 1296 | "default_params": dp_27, 1297 | "vertex_coeffs": tvc_32, 1298 | "translation_coeffs": tc_40, 1299 | "aspect_coeffs": ac_42, 1300 | "coloring": c_21 1301 | }, 1302 | 1303 | # IH54 1304 | { 1305 | "num_params": 2, 1306 | "num_aspects": 4, 1307 | "num_vertices": 4, 1308 | "num_edge_shapes": 4, 1309 | "edge_shapes": es_30, 1310 | "edge_orientations": eo_33, 1311 | "edge_shape_ids": esi_25, 1312 | "default_params": dp_28, 1313 | "vertex_coeffs": tvc_33, 1314 | "translation_coeffs": tc_41, 1315 | "aspect_coeffs": ac_43, 1316 | "coloring": c_22 1317 | }, 1318 | 1319 | # IH55 1320 | { 1321 | "num_params": 0, 1322 | "num_aspects": 4, 1323 | "num_vertices": 4, 1324 | "num_edge_shapes": 2, 1325 | "edge_shapes": es_23, 1326 | "edge_orientations": eo_24, 1327 | "edge_shape_ids": esi_24, 1328 | "default_params": dp_08, 1329 | "vertex_coeffs": tvc_34, 1330 | "translation_coeffs": tc_42, 1331 | "aspect_coeffs": ac_44, 1332 | "coloring": c_24 1333 | }, 1334 | 1335 | # IH56 1336 | { 1337 | "num_params": 1, 1338 | "num_aspects": 8, 1339 | "num_vertices": 4, 1340 | "num_edge_shapes": 3, 1341 | "edge_shapes": es_22, 1342 | "edge_orientations": eo_36, 1343 | "edge_shape_ids": esi_26, 1344 | "default_params": dp_29, 1345 | "vertex_coeffs": tvc_35, 1346 | "translation_coeffs": tc_43, 1347 | "aspect_coeffs": ac_45, 1348 | "coloring": c_25 1349 | }, 1350 | 1351 | # IH57 1352 | { 1353 | "num_params": 2, 1354 | "num_aspects": 1, 1355 | "num_vertices": 4, 1356 | "num_edge_shapes": 2, 1357 | "edge_shapes": es_31, 1358 | "edge_orientations": eo_33, 1359 | "edge_shape_ids": esi_22, 1360 | "default_params": dp_21, 1361 | "vertex_coeffs": tvc_25, 1362 | "translation_coeffs": tc_30, 1363 | "aspect_coeffs": ac_09, 1364 | "coloring": c_18 1365 | }, 1366 | 1367 | # IH58 1368 | { 1369 | "num_params": 2, 1370 | "num_aspects": 2, 1371 | "num_vertices": 4, 1372 | "num_edge_shapes": 2, 1373 | "edge_shapes": es_32, 1374 | "edge_orientations": eo_33, 1375 | "edge_shape_ids": esi_22, 1376 | "default_params": dp_21, 1377 | "vertex_coeffs": tvc_25, 1378 | "translation_coeffs": tc_31, 1379 | "aspect_coeffs": ac_32, 1380 | "coloring": c_19 1381 | }, 1382 | 1383 | # IH59 1384 | { 1385 | "num_params": 1, 1386 | "num_aspects": 2, 1387 | "num_vertices": 4, 1388 | "num_edge_shapes": 1, 1389 | "edge_shapes": es_06, 1390 | "edge_orientations": eo_31, 1391 | "edge_shape_ids": esi_20, 1392 | "default_params": dp_30, 1393 | "vertex_coeffs": tvc_36, 1394 | "translation_coeffs": tc_44, 1395 | "aspect_coeffs": ac_46, 1396 | "coloring": c_20 1397 | }, 1398 | 1399 | # IH60 is undefined 1400 | None, 1401 | 1402 | # IH61 1403 | { 1404 | "num_params": 0, 1405 | "num_aspects": 2, 1406 | "num_vertices": 4, 1407 | "num_edge_shapes": 1, 1408 | "edge_shapes": es_06, 1409 | "edge_orientations": eo_24, 1410 | "edge_shape_ids": esi_20, 1411 | "default_params": dp_08, 1412 | "vertex_coeffs": tvc_34, 1413 | "translation_coeffs": tc_45, 1414 | "aspect_coeffs": ac_47, 1415 | "coloring": c_20 1416 | }, 1417 | 1418 | # IH62 1419 | { 1420 | "num_params": 0, 1421 | "num_aspects": 1, 1422 | "num_vertices": 4, 1423 | "num_edge_shapes": 1, 1424 | "edge_shapes": es_07, 1425 | "edge_orientations": eo_33, 1426 | "edge_shape_ids": esi_20, 1427 | "default_params": dp_08, 1428 | "vertex_coeffs": tvc_34, 1429 | "translation_coeffs": tc_46, 1430 | "aspect_coeffs": ac_08, 1431 | "coloring": c_18 1432 | }, 1433 | 1434 | # IH63 is undefined 1435 | None, 1436 | 1437 | # IH64 1438 | { 1439 | "num_params": 1, 1440 | "num_aspects": 1, 1441 | "num_vertices": 4, 1442 | "num_edge_shapes": 2, 1443 | "edge_shapes": es_33, 1444 | "edge_orientations": eo_37, 1445 | "edge_shape_ids": esi_22, 1446 | "default_params": dp_20, 1447 | "vertex_coeffs": tvc_31, 1448 | "translation_coeffs": tc_47, 1449 | "aspect_coeffs": ac_48, 1450 | "coloring": c_18 1451 | }, 1452 | 1453 | # IH65 is undefined 1454 | None, 1455 | 1456 | # IH66 1457 | { 1458 | "num_params": 1, 1459 | "num_aspects": 2, 1460 | "num_vertices": 4, 1461 | "num_edge_shapes": 2, 1462 | "edge_shapes": es_34, 1463 | "edge_orientations": eo_37, 1464 | "edge_shape_ids": esi_22, 1465 | "default_params": dp_20, 1466 | "vertex_coeffs": tvc_31, 1467 | "translation_coeffs": tc_48, 1468 | "aspect_coeffs": ac_49, 1469 | "coloring": c_19 1470 | }, 1471 | 1472 | # IH67 1473 | { 1474 | "num_params": 2, 1475 | "num_aspects": 2, 1476 | "num_vertices": 4, 1477 | "num_edge_shapes": 3, 1478 | "edge_shapes": es_21, 1479 | "edge_orientations": eo_38, 1480 | "edge_shape_ids": esi_23, 1481 | "default_params": dp_23, 1482 | "vertex_coeffs": tvc_27, 1483 | "translation_coeffs": tc_49, 1484 | "aspect_coeffs": ac_50, 1485 | "coloring": c_20 1486 | }, 1487 | 1488 | # IH68 1489 | { 1490 | "num_params": 1, 1491 | "num_aspects": 1, 1492 | "num_vertices": 4, 1493 | "num_edge_shapes": 1, 1494 | "edge_shapes": es_06, 1495 | "edge_orientations": eo_39, 1496 | "edge_shape_ids": esi_20, 1497 | "default_params": dp_30, 1498 | "vertex_coeffs": tvc_36, 1499 | "translation_coeffs": tc_50, 1500 | "aspect_coeffs": ac_48, 1501 | "coloring": c_18 1502 | }, 1503 | 1504 | # IH69 1505 | { 1506 | "num_params": 2, 1507 | "num_aspects": 2, 1508 | "num_vertices": 4, 1509 | "num_edge_shapes": 2, 1510 | "edge_shapes": es_31, 1511 | "edge_orientations": eo_26, 1512 | "edge_shape_ids": esi_24, 1513 | "default_params": dp_22, 1514 | "vertex_coeffs": tvc_26, 1515 | "translation_coeffs": tc_32, 1516 | "aspect_coeffs": ac_51, 1517 | "coloring": c_20 1518 | }, 1519 | 1520 | # IH70 is undefined 1521 | None, 1522 | 1523 | # IH71 1524 | { 1525 | "num_params": 0, 1526 | "num_aspects": 4, 1527 | "num_vertices": 4, 1528 | "num_edge_shapes": 1, 1529 | "edge_shapes": es_06, 1530 | "edge_orientations": eo_40, 1531 | "edge_shape_ids": esi_20, 1532 | "default_params": dp_08, 1533 | "vertex_coeffs": tvc_34, 1534 | "translation_coeffs": tc_42, 1535 | "aspect_coeffs": ac_52, 1536 | "coloring": c_24 1537 | }, 1538 | 1539 | # IH72 1540 | { 1541 | "num_params": 1, 1542 | "num_aspects": 1, 1543 | "num_vertices": 4, 1544 | "num_edge_shapes": 2, 1545 | "edge_shapes": es_24, 1546 | "edge_orientations": eo_33, 1547 | "edge_shape_ids": esi_22, 1548 | "default_params": dp_20, 1549 | "vertex_coeffs": tvc_31, 1550 | "translation_coeffs": tc_47, 1551 | "aspect_coeffs": ac_48, 1552 | "coloring": c_18 1553 | }, 1554 | 1555 | # IH73 1556 | { 1557 | "num_params": 0, 1558 | "num_aspects": 2, 1559 | "num_vertices": 4, 1560 | "num_edge_shapes": 1, 1561 | "edge_shapes": es_14, 1562 | "edge_orientations": eo_24, 1563 | "edge_shape_ids": esi_20, 1564 | "default_params": dp_08, 1565 | "vertex_coeffs": tvc_34, 1566 | "translation_coeffs": tc_45, 1567 | "aspect_coeffs": ac_47, 1568 | "coloring": c_20 1569 | }, 1570 | 1571 | # IH74 1572 | { 1573 | "num_params": 1, 1574 | "num_aspects": 1, 1575 | "num_vertices": 4, 1576 | "num_edge_shapes": 1, 1577 | "edge_shapes": es_07, 1578 | "edge_orientations": eo_26, 1579 | "edge_shape_ids": esi_20, 1580 | "default_params": dp_30, 1581 | "vertex_coeffs": tvc_36, 1582 | "translation_coeffs": tc_50, 1583 | "aspect_coeffs": ac_48, 1584 | "coloring": c_18 1585 | }, 1586 | 1587 | # IH75 is undefined 1588 | None, 1589 | 1590 | # IH76 1591 | { 1592 | "num_params": 0, 1593 | "num_aspects": 1, 1594 | "num_vertices": 4, 1595 | "num_edge_shapes": 1, 1596 | "edge_shapes": es_15, 1597 | "edge_orientations": eo_33, 1598 | "edge_shape_ids": esi_20, 1599 | "default_params": dp_08, 1600 | "vertex_coeffs": tvc_34, 1601 | "translation_coeffs": tc_46, 1602 | "aspect_coeffs": ac_08, 1603 | "coloring": c_18 1604 | }, 1605 | 1606 | # IH77 1607 | { 1608 | "num_params": 0, 1609 | "num_aspects": 12, 1610 | "num_vertices": 3, 1611 | "num_edge_shapes": 3, 1612 | "edge_shapes": es_35, 1613 | "edge_orientations": eo_41, 1614 | "edge_shape_ids": esi_27, 1615 | "default_params": dp_08, 1616 | "vertex_coeffs": tvc_37, 1617 | "translation_coeffs": tc_51, 1618 | "aspect_coeffs": ac_53, 1619 | "coloring": c_26 1620 | }, 1621 | 1622 | # IH78 1623 | { 1624 | "num_params": 1, 1625 | "num_aspects": 4, 1626 | "num_vertices": 3, 1627 | "num_edge_shapes": 3, 1628 | "edge_shapes": es_36, 1629 | "edge_orientations": eo_41, 1630 | "edge_shape_ids": esi_27, 1631 | "default_params": dp_20, 1632 | "vertex_coeffs": tvc_38, 1633 | "translation_coeffs": tc_52, 1634 | "aspect_coeffs": ac_54, 1635 | "coloring": c_22 1636 | }, 1637 | 1638 | # IH79 1639 | { 1640 | "num_params": 0, 1641 | "num_aspects": 4, 1642 | "num_vertices": 3, 1643 | "num_edge_shapes": 2, 1644 | "edge_shapes": es_25, 1645 | "edge_orientations": eo_27, 1646 | "edge_shape_ids": esi_21, 1647 | "default_params": dp_08, 1648 | "vertex_coeffs": tvc_39, 1649 | "translation_coeffs": tc_53, 1650 | "aspect_coeffs": ac_55, 1651 | "coloring": c_27 1652 | }, 1653 | 1654 | # IH80 is undefined 1655 | None, 1656 | 1657 | # IH81 1658 | { 1659 | "num_params": 0, 1660 | "num_aspects": 8, 1661 | "num_vertices": 3, 1662 | "num_edge_shapes": 2, 1663 | "edge_shapes": es_10, 1664 | "edge_orientations": eo_27, 1665 | "edge_shape_ids": esi_21, 1666 | "default_params": dp_08, 1667 | "vertex_coeffs": tvc_39, 1668 | "translation_coeffs": tc_54, 1669 | "aspect_coeffs": ac_56, 1670 | "coloring": c_25 1671 | }, 1672 | 1673 | # IH82 1674 | { 1675 | "num_params": 0, 1676 | "num_aspects": 4, 1677 | "num_vertices": 3, 1678 | "num_edge_shapes": 2, 1679 | "edge_shapes": es_24, 1680 | "edge_orientations": eo_28, 1681 | "edge_shape_ids": esi_21, 1682 | "default_params": dp_08, 1683 | "vertex_coeffs": tvc_39, 1684 | "translation_coeffs": tc_55, 1685 | "aspect_coeffs": ac_57, 1686 | "coloring": c_27 1687 | }, 1688 | 1689 | # IH83 1690 | { 1691 | "num_params": 1, 1692 | "num_aspects": 2, 1693 | "num_vertices": 3, 1694 | "num_edge_shapes": 2, 1695 | "edge_shapes": es_10, 1696 | "edge_orientations": eo_42, 1697 | "edge_shape_ids": esi_28, 1698 | "default_params": dp_31, 1699 | "vertex_coeffs": tvc_40, 1700 | "translation_coeffs": tc_56, 1701 | "aspect_coeffs": ac_58, 1702 | "coloring": c_20 1703 | }, 1704 | 1705 | # IH84 1706 | { 1707 | "num_params": 2, 1708 | "num_aspects": 2, 1709 | "num_vertices": 3, 1710 | "num_edge_shapes": 3, 1711 | "edge_shapes": es_04, 1712 | "edge_orientations": eo_41, 1713 | "edge_shape_ids": esi_27, 1714 | "default_params": dp_32, 1715 | "vertex_coeffs": tvc_41, 1716 | "translation_coeffs": tc_57, 1717 | "aspect_coeffs": ac_59, 1718 | "coloring": c_20 1719 | }, 1720 | 1721 | # IH85 1722 | { 1723 | "num_params": 2, 1724 | "num_aspects": 4, 1725 | "num_vertices": 3, 1726 | "num_edge_shapes": 3, 1727 | "edge_shapes": es_37, 1728 | "edge_orientations": eo_41, 1729 | "edge_shape_ids": esi_27, 1730 | "default_params": dp_32, 1731 | "vertex_coeffs": tvc_41, 1732 | "translation_coeffs": tc_58, 1733 | "aspect_coeffs": ac_60, 1734 | "coloring": c_21 1735 | }, 1736 | 1737 | # IH86 1738 | { 1739 | "num_params": 1, 1740 | "num_aspects": 4, 1741 | "num_vertices": 3, 1742 | "num_edge_shapes": 2, 1743 | "edge_shapes": es_25, 1744 | "edge_orientations": eo_42, 1745 | "edge_shape_ids": esi_28, 1746 | "default_params": dp_31, 1747 | "vertex_coeffs": tvc_40, 1748 | "translation_coeffs": tc_59, 1749 | "aspect_coeffs": ac_61, 1750 | "coloring": c_21 1751 | }, 1752 | 1753 | # IH87 is undefined 1754 | None, 1755 | 1756 | # IH88 1757 | { 1758 | "num_params": 0, 1759 | "num_aspects": 6, 1760 | "num_vertices": 3, 1761 | "num_edge_shapes": 2, 1762 | "edge_shapes": es_25, 1763 | "edge_orientations": eo_43, 1764 | "edge_shape_ids": esi_28, 1765 | "default_params": dp_08, 1766 | "vertex_coeffs": tvc_42, 1767 | "translation_coeffs": tc_60, 1768 | "aspect_coeffs": ac_62, 1769 | "coloring": c_28 1770 | }, 1771 | 1772 | # IH89 is undefined 1773 | None, 1774 | 1775 | # IH90 1776 | { 1777 | "num_params": 0, 1778 | "num_aspects": 2, 1779 | "num_vertices": 3, 1780 | "num_edge_shapes": 1, 1781 | "edge_shapes": es_07, 1782 | "edge_orientations": eo_41, 1783 | "edge_shape_ids": esi_29, 1784 | "default_params": dp_08, 1785 | "vertex_coeffs": tvc_42, 1786 | "translation_coeffs": tc_09, 1787 | "aspect_coeffs": ac_63, 1788 | "coloring": c_20 1789 | }, 1790 | 1791 | # IH91 1792 | { 1793 | "num_params": 1, 1794 | "num_aspects": 2, 1795 | "num_vertices": 3, 1796 | "num_edge_shapes": 2, 1797 | "edge_shapes": es_32, 1798 | "edge_orientations": eo_44, 1799 | "edge_shape_ids": esi_28, 1800 | "default_params": dp_31, 1801 | "vertex_coeffs": tvc_40, 1802 | "translation_coeffs": tc_61, 1803 | "aspect_coeffs": ac_64, 1804 | "coloring": c_20 1805 | }, 1806 | 1807 | # IH92 is undefined 1808 | None, 1809 | 1810 | # IH93 1811 | { 1812 | "num_params": 0, 1813 | "num_aspects": 2, 1814 | "num_vertices": 3, 1815 | "num_edge_shapes": 1, 1816 | "edge_shapes": es_15, 1817 | "edge_orientations": eo_41, 1818 | "edge_shape_ids": esi_29, 1819 | "default_params": dp_08, 1820 | "vertex_coeffs": tvc_42, 1821 | "translation_coeffs": tc_09, 1822 | "aspect_coeffs": ac_63, 1823 | "coloring": c_20 1824 | } 1825 | 1826 | ] 1827 | 1828 | _data = [Tiling(**datum) if datum is not None else None for datum in _data] 1829 | 1830 | @staticmethod 1831 | def get_data(key): 1832 | 1833 | return TilingTypeData._data[key] 1834 | --------------------------------------------------------------------------------