예제 #1
0
def main():
    parser = argparse.ArgumentParser(description=DESCRIPTION, epilog=EPILOG)
    parser.add_argument("filename", nargs='?', help=FILENAME)
    parser.add_argument("-a", help=FREQ_A, default=2, type=posint)
    parser.add_argument("-b", help=FREQ_B, default=0,
                        type=nonnegativeint)
    parser.add_argument("-m", '--mapping', default='flat', help=PROJ,
                        choices=projection.PROJECTIONS)
    parser.add_argument("-n", "--no_normalize", action="store_true",
                        help="Don't normalize vertices onto the unit sphere")
    parser.add_argument("-k", default=1, help=ADJ, type=kparser)
    parser.add_argument("-t", "--tweak", action="store_true", help=TWEAK)
    parser.add_argument("-f", "--factor", action="store_true", help=FACTOR)

    args = parser.parse_args()
    frequency = (args.a, args.b)
    file = open(args.filename) if args.filename else stdin
    if frequency == (1, 0):#identity, just give input back as output
        with file as f:
            print(f.read())
    else:
        with file as f:
            vertices, faces, fc, _e, _ec, _v, _vc = off.load_off(f)
        base = tiling.Tiling(vertices, faces)
        classIlist = ['edges', 'aspect', 'angle', 'angle_aspect']
        is_tri_grid = all(base.face_size <= 3)
        if args.b == 0 and args.k in classIlist and is_tri_grid:
            warnings.warn(args.k + " is optimal for a large range of k for "
                          "class I subdivision on triangle grid. "
                          "using -k=energy instead.")
            k = 'energy'
        elif args.k == 'bent' and is_tri_grid:
            warnings.warn("bentness always == 0 for triangular faces. "
                          "Using -k=energy instead.")
            k = 'energy'
        else:
            k = args.k
        if args.factor:
            poly = gcopoly.build_gco_rep(base, frequency, args.projection,
                                     tweak=args.tweak, k=k,
                                     normalize=not args.no_normalize)
        else:
            poly = gcopoly.build_gco(base, frequency, args.projection,
                                 tweak=args.tweak, k=k,
                                 normalize=not args.no_normalize)
        vertcolor = poly.group.astype(int)
        facecolor = poly.face_group.astype(int)
        result = off.write_off(poly.vertices, poly.faces,
                               facecolors=facecolor,
                               vertexcolors=vertcolor)
        result += '#frequency = {}\n'.format(frequency)
        if args.filename:
            result += '#input file = {}\n'.format(args.filename)
        result += '#projection = {}\n'.format(args.projection)
        if args.projection in projection.PARALLEL:
            result += '#k = {}\n'.format(poly.k)
        if args.projection in projection.PARALLEL + ['gc']:
            result += '#tweak = {}\n'.format(args.tweak)
        result += '#normalized = {}\n'.format(not args.no_normalize)
        print(result)
예제 #2
0
def main():
    parser = argparse.ArgumentParser(description="Create OFF files for each "
                                     "method and a range of frequencies")
    parser.add_argument("filename", help="filename")
    parser.add_argument("-a", default=9, help="max frequency", type=int)

    args = parser.parse_args()
    file = open(args.filename)
    with file as f:
        vertices, faces, _fc, _e, _ec, _v, _vc = off.load_off(f)
    base = tiling.Tiling(vertices, faces)
    methods = METHODS_3
    for a in range(1, args.a + 1):
        for b in range(a + 1):
            for proj, tweak in methods:
                all_SGS(
                    args.filename.split('/')[-1], base, (a, b), proj, tweak)
예제 #3
0
def main():
    desc = "Statistics of a tiling that are relevant to use as a grid"
    parser = argparse.ArgumentParser(description=desc)
    parser.add_argument("filename", nargs='*',
                        help="Input files. Reads from stdin if not given.")
    parser.add_argument("-s", action="store_true",
                        help="Suppress spherical measures")
    parser.add_argument("-c", help="Write to csv file")

    args = parser.parse_args()
    header = ['filename', 'n_v', 'n_f', 'energy', 'cog', 'bent_min',
              'bent_max', 'edge_min', 'edge_max', 'aspect_ratio_min',
              'aspect_ratio_max', 'faces_min', 'faces_max']
    if not args.s:
        header += ['angle_min', 'angle_max', 'angle_aspect_min',
                   'angle_aspect_max', 'solid_angle_min', 'solid_angle_max']

    lines = [header]
    if len(args.filename) == 1 and '*' in args.filename[0]:
        handles = ((fn, open(fn)) for fn in glob.iglob(args.filename[0]))
    elif args.filename:
        handles = ((fn, open(fn)) for fn in args.filename)
    else:
        handles = [('stdin', stdin)]
    for fn, h in handles:
        with h as handle:
            vertices, faces, fc, e, ec, v, vc = off.load_off(handle)
        poly = tiling.Tiling(vertices, faces)
        n_v = len(vertices)
        n_f = len(faces)
        energy = tiling.energy(vertices)
        norm_cog = tiling.center_of_gravity(vertices)
        bentness = tiling.bentness(vertices, poly)
        bent_min, bent_max = bentness.min(), bentness.max()
        edges = tiling.edge_length(vertices, poly.edges)
        edge_min, edge_max = edges.min(), edges.max()
        aspect = tiling.aspect_ratio(vertices, poly)
        aspect_min, aspect_max = aspect.min(), aspect.max()
        faces = tiling.face_area(vertices, poly)
        face_min, face_max = faces.min(), faces.max()
        values = [fn, n_v, n_f, energy, norm_cog,
                  bent_min, bent_max,
                  edge_min, edge_max,
                  aspect_min, aspect_max,
                  face_min, face_max]
        print('---')
        print('File: ', fn)
        print('Vertices, faces: {}, {}'.format(n_v, n_f))
        print('Thomson energy: ', energy)
        if not np.isclose(0, norm_cog):
            print('Distance of center of gravity from center:\t', norm_cog)
        print('\t\t\t    minimum |maximum |ratio')
        print('Edge length:\t\t    {:<,F}|{:<,F}|{:<,F}'.format(
            edge_min, edge_max, edge_max/edge_min))
        print('Aspect ratio:\t\t    {:<,F}|{:<,F}|{:<,F}'.format(
            aspect_min, aspect_max, aspect_max/aspect_min))
        if np.isclose(0, bent_max, atol=1E-6):
            print('Face area:\t\t    {:<,F}|{:<,F}|{:<,F}'.format(
                face_min, face_max, face_max/face_min))
        else:
            print('Face bentness: \t\t    {:<,F}|{:<,F}|{:<,F}'.format(
                bent_min, bent_max, bent_max/bent_min))
        if not args.s:
            edges = tiling.edge_length(vertices, poly.edges, spherical=True)
            edge_min, edge_max = edges.min(), edges.max()
            aspect = tiling.aspect_ratio(vertices, poly, spherical=True)
            aspect_min, aspect_max = aspect.min(), aspect.max()
            faces = tiling.face_area(vertices, poly, spherical=True)
            face_min, face_max = faces.min(), faces.max()
            values += [edge_min, edge_max, aspect_min, aspect_max,
                       face_min, face_max]
            print('Central angle:\t\t    {:<,F}|{:<,F}|{:<,F}'.format(
                edge_min, edge_max, edge_max/edge_min))
            print('Central angle aspect ratio: {:<,F}|{:<,F}|{:<,F}'.format(
                aspect_min, aspect_max, aspect_max/aspect_min))
            print('Solid angle:\t\t    {:<,F}|{:<,F}|{:<,F}'.format(
                face_min, face_max, face_max/face_min))
        lines.append(values)

    if args.c:
        with open(args.c, 'w', newline='') as f:
            writer = csv.writer(f)
            writer.writerows(lines)
예제 #4
0
파일: cellular.py 프로젝트: ye-man/antitile
def main():
    parser = argparse.ArgumentParser(description=DESCRIPTION)
    parser.add_argument("filename",
                        nargs='?',
                        help="Input file. Reads from stdin if not given.")
    parser.add_argument("-n", help="Number of steps", default=100, type=int)
    parser.add_argument("-b",
                        help="Birth rule, comma-separated",
                        default=[1, 5, 6],
                        type=ruleparse)
    parser.add_argument("-s",
                        help="Survival rule, comma-separated",
                        default=[1, 2],
                        type=ruleparse)
    parser.add_argument("-l", help="Lookback", type=int, default=12)
    parser.add_argument("-v", help=NEIGHBOR, action='store_true')
    parser.add_argument("-d",
                        action='store_true',
                        help="Color the vertices "
                        "as if the cellular automata were operating on "
                        "the dual polyhedron/tiling")
    parser.add_argument("-o", help="Output prefix.", default="cellular")
    args = parser.parse_args()
    file = open(args.filename) if args.filename else stdin
    with file as f:
        vertices, faces, fc, e, ec, verts, vc = off.load_off(f)
    init = vc if args.d else fc
    if init is None or np.ptp(init) == 0:
        init = np.random.randint(2, size=len(faces))
    init = np.asarray(init)
    if len(init.shape) > 1:
        raise ValueError("Need color indexes, not color values")
    elif np.any(init > 1):
        init = init > (init.max() + init.min()) / 2
    poly = tiling.Tiling(vertices, faces)
    if args.d:
        adj = poly.vertex_f_adjacency if args.v else poly.vertex_adjacency
    else:
        adj = poly.face_v_adjacency if args.v else poly.face_adjacency
    rule = np.array(args.b + [i - 128 for i in args.s], dtype=np.int8)
    state = np.zeros((args.n + 1, len(init)), dtype=bool)
    state[0] = init
    lookback = args.l
    width = int(np.ceil(np.log10(args.n + 2)))
    file_template = args.o + "{:0" + str(width) + "d}" + ".off"
    for i in range(args.n):
        this_state = ca_step(state[i], rule, adj)
        state[i + 1] = this_state
        result = this_state.astype(int)
        if args.d:
            string = off.write_off(vertices,
                                   faces,
                                   facecolors=fc,
                                   edges=e,
                                   edgecolors=ec,
                                   vertexcolors=result)
        else:
            string = off.write_off(vertices,
                                   faces,
                                   facecolors=result,
                                   edges=e,
                                   edgecolors=ec,
                                   vertexcolors=vc)
        fn = file_template.format(i + 1)
        with open(fn, 'w') as f:
            f.write(string)
        start = max(i - lookback, 0)
        if np.any(np.all(this_state == state[start:i + 1], axis=-1)):
            string = "reached steady state at {}, breaking out early"
            warnings.warn(string.format(i + 1))
            break