예제 #1
0
def main():

  from differentialMesh import DifferentialMesh
  from iutils.render import Render
  from time import time
  from modules.helpers import print_stats
  from numpy import array

  from modules.utils import get_exporter
  exporter = get_exporter(NMAX)

  DM = DifferentialMesh(NMAX, 2*FARL, NEARL, FARL, PROCS)

  DM.new_faces_in_ngon(MID, MID, H, 6, 0.0)

  render = Render(SIZE, BACK, FRONT)
  render.set_line_width(LINEWIDTH)

  fn = Fn(prefix='./res/')


  # st = named_sub_timers()

  tsum = 0


  for i in range(10000000):

    t1 = time()
    for _ in range(STEPS_ITT):

      # st.start()
      DM.optimize_position(
        ATTRACT_STP,
        REJECT_STP,
        TRIANGLE_STP,
        ALPHA,
        DIMINISH,
        -1
      )
      # st.t('opt')

      henum = DM.get_henum()
      # st.t('rnd')

      surface_edges = array(
        [DM.is_surface_edge(e)>0
        for e in range(henum)],
        'bool').nonzero()[0]

      # st.t('surf')

      rnd = random(size=len(surface_edges)*2)
      the = (1.-2*rnd[::2])*pi
      rad = rnd[1::2]*0.5*H
      dx = cos(the)*rad
      dy = sin(the)*rad
      # st.t('rnd2')

      DM.new_triangles_from_surface_edges(
        surface_edges,
        len(surface_edges),
        H,
        dx,
        dy,
        MINIMUM_LENGTH,
        MAXIMUM_LENGTH,
        1
      )
      # st.t('tri')

      # st.start()
      DM.optimize_edges(
        SPLIT_LIMIT,
        FLIP_LIMIT
      )
      # st.t('opte')

      tsum += time() - t1

    print_stats(i*STEPS_ITT, tsum, DM)
    name = fn.name()

    ## export png
    show(render, DM, name+'.png')

    ## export obj
    exporter(
      DM,
      name + '.2obj',
      {
        'procs': PROCS,
        'nearl': NEARL,
        'farl': FARL,
        'reject_stp': 0,
        'attract_stp': 0,
        'triangle_stp': 0,
        'size': SIZE
      },
      i*STEPS_ITT
    )
    tsum = 0
예제 #2
0
def main():

  from differentialMesh3d import DifferentialMesh3d
  from modules.ioOBJ import load_move_scale as load_obj
  from modules.random import random_unit_vec
  from modules.geometry import get_show_geometry
  from modules.utils import get_seed_selector
  from modules.utils import print_stats
  from modules.utils import get_exporter

  from fn import Fn
  fn = Fn(prefix='./res/', postfix='.obj')

  DM = DifferentialMesh3d(
      nmax=NMAX,
      zonewidth=ZONEWIDTH,
      nearl=NEARL,
      farl=FARL,
      procs=PROCS
      )

  data = load_obj(
      OBJ,
      s=SCALE,
      mx=[0.5] * 3
      )
  info = DM.initiate_faces(list(data['vertices']), list(data['faces']))

  if info['min_edge'] < NEARL:
    print('all edges are too short. try scaling up initial size.')
    return

  seed_selector = get_seed_selector(DM, SEEDTYPE, SEEDRATIO)

  noise = random_unit_vec(DM.get_vnum(), STP*100.)
  DM.position_noise(noise, scale_intensity=-1)

  DM.optimize_edges(SPLIT_LIMIT, FLIP_LIMIT, FLIP_CURVATURE)

  for he in range(DM.get_henum()):
    DM.set_edge_intensity(he, 1.0)

  show_geometry = get_show_geometry(DM, NMAX)

  def geometry_generator():
    seeds = seed_selector()
    i = 0
    k = 0
    box = array((-1, -1, -1, 1, 1), 'float')
    while True:
      i += 1
      for _ in range(SPEEDUP):
        k += 1
        DM.optimize_position(
            REJECT,
            ATTRACT,
            DIMINISH,
            SMOOTH,
            scale_intensity=1
            )

        DM.optimize_edges(SPLIT_LIMIT, FLIP_LIMIT, FLIP_CURVATURE)

        if len(seeds) > 0:
          DM.set_vertices_intensity(seeds, 1.0)

        if k%SEED_FREQ == 0:
          seeds = seed_selector()

      print_stats(k, DM, meta='alive v: {:d}'.format(len(seeds)))

      box = show_geometry()

      yield box

  from view3d import View3d
  v3d = View3d(
      size=SCREEN_SIZE,
      initial_scale=INITIAL_SCALE,
      autorotate=AUTOROTATE,
      save_img=SAVE_IMG
      )
  v3d.start(geometry_generator)

  export = get_exporter(DM, fn, NMAX)
  export()
def main():

  from time import time
  from itertools import count

  from numpy import pi
  from numpy.random import random

  from modules.growth import spawn_curl
  from modules.utils import get_exporter
  from modules.helpers import env_or_default
  from modules.helpers import print_stats

  from differentialLine import DifferentialLine


  comm = MPI.COMM_WORLD
  nodes = comm.Get_size()
  rank = comm.Get_rank()

  if rank == 0:

    size = env_or_default('SIZE', SIZE)
    nmax = env_or_default('NMAX', NMAX)
    one = 1.0/size

    export_itt = env_or_default('EXPORT_ITT', EXPORT_ITT)
    stat_itt = env_or_default('STAT_ITT', STAT_ITT)

    data = {
      'size': size,
      'nmax': nmax,
      'vmax': env_or_default('VMAX', NMAX),
      'procs': env_or_default('PROCS', PROCS),
      'nodes': nodes,
      'prefix': env_or_default('PREFIX', PREFIX),
      'ninit': env_or_default('NINIT', NINIT),
      'rad': env_or_default('RAD', RAD),
      'one': one,
      'stp': env_or_default('STP', STP)*one,
      'nearl': env_or_default('NEARL', NEARL)*one,
      'farl': env_or_default('FARL', FARL)*one
    }

  else:
    data = None

  data = comm.bcast(data, root=0)

  DF = DifferentialLine(
    data['nmax'],
    zonewidth = data['farl'],
    nearl = data['nearl'],
    farl = data['farl'],
    procs = data['procs'],
    nodes = data['nodes']
  )

  if rank == 0:

    angles = sorted(random(data['ninit'])*pi*2)

    DF.init_circle_segment(0.5, 0.5, data['rad'], angles)

    t_start = time()
    do_export = get_exporter(nmax, t_start)

  for i in count():

    DF.optimize_position(data['stp'])

    if DF.get_vnum()>data['vmax']:
      if rank == 0:
        do_export(DF, data, i, final=True)
      return

    if rank == 0:

      spawn_curl(DF,data['nearl'])

      if i % stat_itt == 0:
        print_stats(i,time()-t_start,DF)
      if i % export_itt == 0:
          do_export(DF, data, i)