def create_tiles(self, depth: int): if depth == 0: self._draw(depth) return self.create_tiles(depth=depth - 1) print(f"Populating depth {depth}...") new_boundary = [ self._build_new_tile(self._boundary[0], self._boundary[-1]) ] index = 0 counter = 0 num_tiles = (3 * sqrt(3) * ((2 + sqrt(3))**depth - (2 - sqrt(3))**depth)).as_int() while True: new_vertex = self._build_new_tile(new_boundary[-1], self._boundary[index]) counter += 1 print(f"created {counter} / {num_tiles} tiles...", end="\r") if new_vertex in self._boundary: index += 1 elif new_vertex in new_boundary: break else: new_boundary.append(new_vertex) self._boundary = new_boundary self._draw(depth) print(f"Populated, found {len(self._tiles)} tiles")
def r_euclid(self) -> float: assert self.z != 0 return (((self.x / self.z)**2 + (self.y / self.z)**2) * sqrt(2) - 1).value**0.5
def from_points(point_1: Point, point_2: Point) -> "Line": return Line( x=point_1.y * point_2.z - point_1.z * point_2.y, y=point_1.z * point_2.x - point_1.x * point_2.z, z=(point_1.y * point_2.x - point_1.x * point_2.y) * sqrt(2), )
def product(self, point: Point) -> QuadraticRational: return self.z * point.z - (self.x * point.x + self.y * point.y) * sqrt(2)
def norm(self) -> QuadraticRational: return (self.x**2 + self.y**2) * sqrt(2) - self.z**2
def main(): point_1 = Vertex(0 * sqrt(2) / 1, sqrt(2) / sqrt(3), (sqrt(2) + 1) / sqrt(3)) point_2 = Vertex(-sqrt(2) / 2, -1 / sqrt(6), (sqrt(2) + 1) / sqrt(3)) point_3 = Vertex(sqrt(2) / 2, -1 / sqrt(6), (sqrt(2) + 1) / sqrt(3)) tiling = Tiling(point_1, point_2, point_3) tiling.create_tiles(depth=6)
def cosh_distance(point_1: Point, point_2: Point) -> QuadraticRational: return point_1.z * point_2.z - (point_1.x * point_2.x + point_1.y * point_2.y) * sqrt(2)