#######################
#-*- coding: utf-8 -*-


######## DM*
######## agruber@tugraz.at and iam@richdank.com
######## library



################
######## basic library data and functions
################

######## credits
lib_cc = "    DM LIBRARY ~~~~~~~~~~~~~~~X"
lib_cc += "\n    2023-12-15       ver w23_03"
lib_cc += "\n    CC by-nc-sa "
lib_cc += "diag & richDank" 

#######################

######## import
import rhinoscriptsyntax as rs
import scriptcontext as sc
import Rhino
import RhinoPython.Host as _host
from datetime import datetime
import random
import time
import math
from itertools import combinations
from itertools import permutations
from itertools import product
import System, System.DateTime
import scriptcontext



#####################################################################
#####################################################################
rs.UnitAbsoluteTolerance(tolerance=0.00001, in_model_units=True)


pi = math.pi
global timeX
timeX = time.time()

def setTime():
    global timeX
    timeX = time.time()
#setTime()


def getTime(verbose=0, prenull=0):
    global timeX
    tim = float(time.time())
    tim -=  float(timeX)
    if verbose: print str(round(tim,2))+"secs"
    #return preNull( round(tim,1), prenull)
    return round(tim,2)
################
######## functions / setUPs
################

######## DM2_w21

### hu_02 PARALL.EL.EPIPED
lenX = 10       
lenY = random.randint(lenX, lenX*4)
lenZ = random.randint(lenX, lenX*9)
#print "\t _____________/################"
#print "\t my randomized para.llel.epiped"
#print "\t X/Y/Z =", str(lenX)+"/"+str(lenY)+"/"+str(lenZ)+" _____________"
#print "\t ################/  "

def getParalellEpipedCoords(randVec=0, drawPoints=0):
    lenX = 10       
    lenY = random.randint(lenX, lenX*4)
    lenZ = random.randint(lenX, lenX*9)

    print "\t _____________/################"
    print "\t my randomized para.llel.epiped"
    print "\t X/Y/Z =", str(lenX)+"/"+str(lenY)+"/"+str(lenZ)+" _____________"
    print "\t ################/  "


    #______base vectors
    vecX = [1, 0, 0]
    vecY = rs.VectorUnitize([ random.uniform(0,0.5), random.uniform(0.5,1), 0 ])
    vecZ = rs.VectorUnitize([ random.uniform(-0.5,0.5), random.uniform(-0.5,0.5), 1 ])
    rs.ObjectColor( rs.AddCurve([ [0,0,0], rs.VectorScale(vecX, lenX) ] ), [200,0,0] )
    rs.ObjectColor( rs.AddCurve([ [0,0,0], rs.VectorScale(vecY, lenY) ] ), [0,200,0] )
    rs.ObjectColor( rs.AddCurve([ [0,0,0], rs.VectorScale(vecZ, lenZ) ] ), [0,0,200] )
    rs.AddPoints( [rs.VectorScale(vecX, lenX), rs.VectorScale(vecY, lenY), rs.VectorScale(vecZ, lenZ)] )
    #______here comes my para.llel.epiped:
    allCoords = []
    for x in range(lenX+1):
        for y in range(lenY+1):
            for z in range (lenZ+1):
                if randVec:
                    x=random.uniform(0, lenX)
                    y=random.uniform(0, lenY)
                    z=random.uniform(0, lenZ)
                cor = rs.VectorAdd( rs.VectorAdd( rs.VectorScale( vecX, x), rs.VectorScale( vecY, y)), rs.VectorScale( vecZ, z) )  
                allCoords.append( cor )
    if drawPoints:
        rs.AddPoints( allCoords )
    return allCoords
    

### hu_03 SPHERI.FICATION
#print "\t   _____      ____"
#print "\t  |     | >  /   .\\"
#print "\t  |     | < /    . \\   sphere"
#print "\t  |     | > |    . |       if"
#print "\t  |     | > \\      /  ication"
#print "\t  |_____| <  \____/"
def coords2sphere ( coords, center, radius, makePts=1, makeCrv=0, makeProjectCrv=0 ):


    if center in coords:
        coords.remove( center )
    coordsOnSphere=[]
    for vec in coords:
        cor = vec
        if not rs.Distance( vec, center ):
            continue
        vec = rs.VectorSubtract( vec, center ) # == vec center..cor
        vec = rs.VectorUnitize( vec )
        vec = rs.VectorScale( vec, radius )
        vec = rs.VectorAdd( center, vec)
        coordsOnSphere.append( vec )
        if makeProjectCrv==1:
            rs.AddLine( center, vec )
        if makeProjectCrv==2:
            rs.AddLine( cor, vec )
    if makePts:
        rs.ObjectColor(rs.AddPoints( coordsOnSphere ), [10,10,10] )
    if makeCrv:
        rs.AddCurve( coordsOnSphere, makeCrv )
    return coordsOnSphere


### hu_04 TETRAEDER
#print "                            /\\       "
#print "                           /_|\\      "
#print "                      TETR/__|_\\EDER _01"
#print "........................./   |  \\....... h = a/3.0*(6.0**0.5)\n"

pointsX = [ [0, 30, 0], [50, 0, 0], [30, 20, 0] ]
pointsX = [ [0, random.uniform(10,50), 0], [random.uniform(10,50), random.uniform(10,50), random.uniform(10,50)], [random.uniform(10,50), random.uniform(10,50), 0] ]
points = ["x","y","z"]
def getTetraCoords( points=points, flipH=0, flipAB=0, drawTetra=1, drawAll=1 ):
    ptA=points[0+flipAB]
    ptB=points[1-flipAB]
    ptX=points[2]
    normVec = rs.VectorCrossProduct( rs.VectorSubtract(ptX, ptA), rs.VectorSubtract(ptX, ptB) )
    a = rs.Distance(ptA, ptB)
    h = a/3.0*(6.0**0.5)*(1-2*flipH)       ### "a drittel mal wurzel aus 6"
    vecH = rs.VectorScale( rs.VectorUnitize( normVec ), h )
    vec_AC = rs.VectorRotate(rs.VectorSubtract( ptB, ptA ), 60.0, vecH)
    ptC = rs.VectorAdd(ptA, rs.VectorRotate(rs.VectorSubtract( ptB, ptA ), 60.0, vecH))
    ptH = pntCentroid( [ptA, ptB, ptC] )
    ptT = rs.VectorAdd( ptH, vecH )
    tetraCoords = [ [ptA, ptB, list(ptC)], [ptA, ptB, list(ptT)], [ptB, list(ptC), list(ptT)], [list(ptC), ptA, list(ptT)] ]
    if drawTetra:
        for coords in tetraCoords:
            rs.AddCurve( coords, 1 )
    if drawAll:
        rs.AddPoints( [ptA, ptB, ptX, ptH] )
        rs.AddLine( ptH, ptT )
        rs.ObjectColor( rs.AllObjects()[0:5], [100,100,0] )
        print "***************"
        print "*** points     ",points
        print "*** edgeLength ", rs.Distance(ptA, ptB)
        print "*** tetraHeight", h
        print "***************"
    if drawAll==2:
        textDots([ptA], "A", 1)
        textDots([ptB], "B", 1)
        textDots([ptX], "X", 1)
        rs.ObjectColor( rs.AllObjects()[0:3], [100,100,0] )
    return tetraCoords

def getUnoCoord( l, d, h ):
    if l >= L or d >= D or h >= H or l<0 or d<0 or h<0:
        print "*** getUnoCoord: any parameter too big or neg:",l,d,h,"? ______________***"
        #return UnoGridCoords[ 0 ]
        return [0,0,0]
    else:
        #print "index :", l + d*L + h*D*L 
        return UnoGridCoords[ l + d*L + h*D*L ]

UnoGridCoords = []  # just 4 check in hu_05_basic_script_structure
                    # diag 201107_00:00

################
######## functions 4duerer 2020
######## functions cage 4_corona 2021
################



def getLodge( p_width=1.2, l_dist=10, d_dist=8, h_dist=6, pos_x=0, pos_y=0, d_grid=0, d_distord=1, demo=0, verbose=0 ) :
    """
    Generate a small archetypal house, distorted along perspective algorithms
    A setup for the development of individual panels
    Inspired by
      Albrecht Duerer's "Underweysung" (1525)
      https://de.wikipedia.org/wiki/Perspektive#Geschichte
      https://en.wikipedia.org/wiki/Albrecht_Duerer
    And
      MVRDVs "Porterlodges for the National Park De Hoge Veluwe" (1996)
      https://mvrdv.com/projects/167/hoenderloo-lodge?photo=15877
      https://www.miesarch.com/work/2994
    Parameters:
      p_width (float, optional): Approx. panel width in units
      l_dist (float, optional): Approx. length of the lodge in units
      d_dist (float, optional): Approx. depth of the lodge in units
      h_dist (float, optional): Approx. height of the lodge in units
      x_pos (float, optional): Move origin of the lodge in x
      y_pos (float, optional): Move origin of the lodge in y
      d_grid (boolean, optional): Fixed depth grid on the the small sides
      d_distord (boolean, optional): Distord basic section of the house
      demo (boolean, optional): Run demo to get an object
      verbose (int, optional): talk & sleep / Print and depict generation of the lodge
    Returns:
      list(float): list[][][] of all panels, containing groups of 4 points
      list(float): list[][][] of just the sleeve's panels
      list(float): list[][][] of just the right section's panels
      list(float): list[][][] of just the left section's panels
      list(float): list[][][] of the sections, containing groups of 5 points
      list(float): list[][] of all the cvs on the sleeve
      list(float): list[][] of all the cvs on the right section
      list(float): list[][] of all the cvs on the left section
    Example:
      import dm2_lib as dm2
      all_data = dm2.getLodge( verbose=1000, demo=1 )
      panels = all_data[0]
      panels_sleeve = all_data[1]
      panels_right = all_data[2]
      panels_left = all_data[3]
      sections = all_data[4]
      cvs_sleeve= all_data[5]
      cvs_right= all_data[6]
      cvs_left= all_data[7]
    """
    if 0 or verbose:
        print "                      ________"
        print "                     /_/_/_|__\\"
        print "### dmLODGE          |_|_|_|__|\n###########################2022 all data returned 2 allLodgeData[]"
        print "*** allLodgeData  = [ panels, panels_sleeve, panels_right, panels_left, sections, cvs_sleeve, cvs_right, cvs_left ]"
    if verbose:
        rs.ObjectColor( rs.AddCurve( [[0,0,0], [pos_x, pos_y, 0]] ), [200,0,20] )
        #rs.ZoomExtents()
    ######## focal point
    focus = [ 
        (-1)**random.randint(0,1) * random.uniform( l_dist*4, l_dist*6 )
        , random.uniform( -d_dist*2, d_dist*2 )
        , 0 
        ]
    ######## planes to project on
    plane0 = rs.PlaneFromNormal(
        [ random.uniform(l_dist/2,l_dist/3), 0, 0 ]
        , [ 3, random.uniform(-1,1), random.uniform(-1,1) ]
        )
    plane1 = rs.PlaneFromNormal(
        [ -random.uniform(l_dist/2,l_dist/3), 0, 0 ]
        , [ 3, random.uniform(-1,1), random.uniform(-1,1) ]
        )

    ######## standard section
    section0 = []
    section1 = []
    if d_distord :
        a = [ 0, random.uniform(-d_dist/2,-d_dist/3), 0 ]
        b = [ 0, random.uniform(-d_dist/2,-d_dist/3), random.uniform(h_dist/3,h_dist/2) ]
        c = [ 0, random.uniform(-d_dist/6,d_dist/6), random.uniform(h_dist/2,h_dist) ]
        d = [ 0, random.uniform(d_dist/3,d_dist/2), random.uniform(h_dist/3,h_dist/2) ]
        e = [ 0, random.uniform(d_dist/3,d_dist/2), 0 ]
    else :
        a = [ 0, -d_dist/2, 0 ]
        b = [ 0, -d_dist/2, random.uniform(h_dist/3,h_dist/2) ]
        c = [ 0, 0, random.uniform(h_dist/2,h_dist) ]
        d = [ 0, d_dist/2, random.uniform(h_dist/3,h_dist/2) ]
        e = [ 0, d_dist/2, 0 ]
    section = [ a, b, c, d, e ]
    ### section_id = rs.AddCurve( section, 1 );
    if verbose : rs.Sleep( verbose )
    ######## get all the cvs alongside (sleeve)
    cvs_sleeve = []
    subdiv_l = int( rs.Distance(plane0[0],plane1[0]) / p_width )
    if verbose : print "the long sides / the sleeve will be separated in", subdiv_l, "segments."

    for pnt in section :
        ######## optic rays
        vec = rs.VectorSubtract( pnt, focus )
        end = rs.VectorAdd( pnt, vec )
        crv_id = rs.AddLine( focus, end )
        ######## projected on the planes
        pierce0 = rs.PlaneCurveIntersection( plane0, crv_id )[0][1]
        pierce1 = rs.PlaneCurveIntersection( plane1, crv_id )[0][1]
        section0.append( pierce0 )
        section1.append( pierce1 )
        #if verbose : rs.ZoomExtents()
        if verbose :
            foc_id = rs.AddPoint( focus )
            pnt_id = rs.AddPoint( pnt )
            ##rs.AddCircle( plane0, max(d_dist,l_dist,h_dist) )
            ##rs.AddCircle( plane1, max(d_dist,l_dist,h_dist) )
            section0_ids = rs.AddPoints( section0 )
            section1_ids = rs.AddPoints( section1 )
            rs.Sleep( verbose )
            rs.DeleteObjects( section0_ids )
            rs.DeleteObjects( section1_ids )
            rs.DeleteObject( foc_id )
            rs.DeleteObject( pnt_id )
            #rs.ZoomExtents() ###
        #if verbose : rs.ZoomExtents() ###
        rs.DeleteObject( crv_id )
        ######## subdivide the edges alongside (sleeve)
        for s in range(subdiv_l+1):
            fac = float(s) / subdiv_l
            coord = pntInbetween( pierce0, pierce1, fac )
            cvs_sleeve.append( coord )
    #if verbose : rs.ZoomExtents() ###
    sections = [ section0, section1 ]
    ######## get the sections alongside (sleeve)
    sections = []
    for u in range( subdiv_l+1 ) :
        pnts = []
        for v in range( 5 ) :
            pnts.append( cvs_sleeve[(v+0)*(subdiv_l+1)+(u+0)] )
        sections.append( pnts )
    ######## get the panels alongside (sleeve)
    panels_sleeve = []
    for u in range( subdiv_l ) :
        for v in range( 5-1 ) :
            pnt0 = cvs_sleeve[ (v+0)*(subdiv_l+1)+(u+0) ]
            pnt1 = cvs_sleeve[ (v+0)*(subdiv_l+1)+(u+1) ]
            pnt2 = cvs_sleeve[ (v+1)*(subdiv_l+1)+(u+1) ]
            pnt3 = cvs_sleeve[ (v+1)*(subdiv_l+1)+(u+0) ]
            panel = [ pnt0, pnt1, pnt2, pnt3 ]
            panels_sleeve.append( panel )
    ######## general subdivision for the sections
    subdiv_d = int(round( rs.Distance(a,e) / p_width / 2 )) * 2
    ######## end section right cvs
    cvs_right = []
    subdiv_d0 = int( rs.Distance(section0[0],section0[4]) / p_width )
    fac_d0a = rs.Distance(section0[1],section0[2])/(rs.Distance(section0[1],section0[2])+rs.Distance(section0[3],section0[2]))
    subdiv_d0a = int(round( subdiv_d0 * fac_d0a ))
    subdiv_d0b = subdiv_d0 - subdiv_d0a
    if d_grid :
        subdiv_d0 = subdiv_d
        subdiv_d0a = int( subdiv_d/2 )
        subdiv_d0b = int( subdiv_d/2 )
    if verbose : print "the section on the right is devided in", subdiv_d0a, "and", subdiv_d0b, "panels."
    for p in range(subdiv_d0+1) :
        fac = float(p) / subdiv_d0
        coord = pntInbetween( section0[4], section0[0], fac )
        cvs_right.append( coord )
    for p in range(subdiv_d0+1) :
        if ( p<subdiv_d0b ) :
            fac = float(p) / subdiv_d0b
            coord = pntInbetween( section0[3], section0[2], fac )
            cvs_right.append( coord )
        else :
            fac = (float(p)-subdiv_d0b) / subdiv_d0a
            coord = pntInbetween( section0[2], section0[1], fac )
            cvs_right.append( coord )
    ######## get the panels on end section right
    panels_right = []
    for p in range(subdiv_d0) :
        pnt0 = cvs_right[ (p+0) ]
        pnt1 = cvs_right[ (p+1) ]
        pnt2 = cvs_right[ (p+1)+(subdiv_d0+1) ]
        pnt3 = cvs_right[ (p+0)+(subdiv_d0+1) ]
        panel = [ pnt0, pnt1, pnt2, pnt3 ]
        panels_right.append( panel )
    ######## end section left cvs
    cvs_left = []
    subdiv_d1 = int( rs.Distance(section1[0],section1[4]) / p_width )
    fac_d1a = rs.Distance(section1[3],section1[2])/(rs.Distance(section1[1],section1[2])+rs.Distance(section1[3],section1[2]))
    subdiv_d1a = int(round( subdiv_d1 * fac_d1a ))
    subdiv_d1b = subdiv_d1 - subdiv_d1a
    if d_grid :
        subdiv_d1 = subdiv_d
        subdiv_d1a = int( subdiv_d/2 )
        subdiv_d1b = int( subdiv_d/2 )
    if verbose : print "the section on the other end is split in", subdiv_d1a, "and", subdiv_d1b, "panels."
    for p in range(subdiv_d1+1) :
        fac = float(p) / subdiv_d1
        coord = pntInbetween( section1[0], section1[4], fac )
        cvs_left.append( coord )
    for p in range(subdiv_d1+1) :
        if ( p<subdiv_d1b ) :
            fac = float(p) / subdiv_d1b
            coord = pntInbetween( section1[1], section1[2], fac )
            cvs_left.append( coord )
        else :
            fac = (float(p)-subdiv_d1b) / subdiv_d1a
            coord = pntInbetween( section1[2], section1[3], fac )
            cvs_left.append( coord )
    ######## get the panels on end section right
    panels_left = []
    for p in range(subdiv_d1) :
        pnt0 = cvs_left[ (p+0) ]
        pnt1 = cvs_left[ (p+1) ]
        pnt2 = cvs_left[ (p+1)+(subdiv_d1+1) ]
        pnt3 = cvs_left[ (p+0)+(subdiv_d1+1) ]
        panel = [ pnt0, pnt1, pnt2, pnt3 ]
        panels_left.append( panel )
    ######## all the panels
    panels = []
    panels.extend( panels_sleeve )
    panels.extend( panels_right )
    panels.extend( panels_left )
    ######## display features
    if verbose: section0_id = rs.AddCurve( section0, 1 );
    if verbose: section1_id = rs.AddCurve( section1, 1 );
    
    #if verbose : rs.ZoomExtents() ###
    ### rs.ObjectColor( rs.AllObjects()[:2], [100,200,100])
    ### rs.DeleteObject( section_id )
    if verbose : 
        rs.Sleep( verbose )
        cvs_ids = rs.AddPoints( cvs_sleeve )
        rs.Sleep( verbose*1 ) ## was *2 ag
        rs.DeleteObjects( cvs_ids )
        cvs_ids = rs.AddPoints( cvs_right )
        rs.Sleep( verbose*1 ) ## was *2 ag
        rs.DeleteObjects( cvs_ids )
        cvs_ids = rs.AddPoints( cvs_left )
        rs.Sleep( verbose*1 ) ## was *2 ag
        rs.DeleteObjects( cvs_ids )
        rs.DeleteObjects( [section0_id,section1_id] )
    ######## move lodge, if desired
    if pos_x or pos_y:
        movVec = [pos_x, pos_y, 0]
        if verbose :
            print "new origin position =", movVec
            rs.ObjectColor(rs.AddCurve( [[0,0,0],movVec] ), [200,0,200]) 
        for i,panel in enumerate(panels):        panels[i]        = [ rs.VectorAdd(cor, movVec) for cor in panel ]
        for i,panel in enumerate(panels_sleeve): panels_sleeve[i] = [ rs.VectorAdd(cor, movVec) for cor in panel ]
        for i,panel in enumerate(panels_right):  panels_right[i]  = [ rs.VectorAdd(cor, movVec) for cor in panel ]
        for i,panel in enumerate(panels_left):   panels_left[i]   = [ rs.VectorAdd(cor, movVec) for cor in panel ]
        for i,section in enumerate(sections):    sections[i]      = [ rs.VectorAdd(cor, movVec) for cor in section ]
        cvs_sleeve = [rs.VectorAdd(crv, movVec) for crv in cvs_sleeve]
        cvs_right  = [rs.VectorAdd(crv, movVec) for crv in cvs_right]
        cvs_left   = [rs.VectorAdd(crv, movVec) for crv in cvs_left]
    ######## depict demo
    if demo :
        ######## the sections
        if 1 :
            for section in sections :
                rs.AddCurve( section, 1 )
                rs.Sleep( verbose/10 )
        ######## default panels
    else: # if not demo
        pass
        #rs.AddCurve( sections[0], 1 )
        #rs.AddCurve( sections[-1], 1 )
        #rs.ObjectColor(rs.AllObjects()[:2], [100,100,120])
        #rs.ObjectName( rs.AllObjects()[:2], "lodgeSections")
        #rs.ZoomExtents()

    return [ panels, panels_sleeve, panels_right, panels_left, sections, cvs_sleeve, cvs_right, cvs_left ]



################
######## functions 4giza & ra
################
##################
# list of pyramids
# list_name    "name"      height*)  OSM_ID         *)lt wiki
cheops    =  [ "cheops",    146.60, "4420397"] 
chefren   =  [ "chefren",   143.50, "4420396"]
mykerinos =  [ "mykerinos",  65.00, "4420398"]
henutsen   = [ "henutsen",   29.60, "219797726"]    # Princess: King's daughter: Said to be a daughter of Khufu on a stela placed in the temple during the 26th dynasty, but more likely to be a wife
meritetis  = [ "meritetis",  30.00, "219797724"]   # King's wife: Wife of Khufu
hetepheres = [ "hetepheres", 30.25, "198032492"]  # Queen HetepheresKing's wife, king's daughter: Wife of Sneferu and mother of Khufu 
khentkawes = [ "khentkawes", 18.50, "73174154"]  # Queen 
queen_A = [ "queen_A", 21.2, "25416060"]        # Queen A
queen_B = [ "queen_B", 21.2, "25416067"]       # Queen B
queen_C = [ "queen_C", 21.2, "25416093"]      # Queen C

#################################################
# collect all pyramid_list into one pyramids_list
pyramids = [ cheops, chefren, mykerinos
            ,henutsen, meritetis, hetepheres
            ,khentkawes
            ,queen_A, queen_B, queen_C
           ]
######## generate the pyramids @ giza / egypt / africa
def makePyramid (NameOrNumber=2, SrfsOrCrvs=0, verbose = 0):
    rs.CurrentLayer("Default")
    rs.LayerLocked ("OSM", 1)
    if verbose: rs.Redraw()
    for p, pyra in enumerate(pyramids):
        if type(NameOrNumber)==int and p==NameOrNumber:# or pyramids[i][0] == str(NameOrNumber):
            break
        if type(NameOrNumber)==str and pyra[0]==NameOrNumber:
            break
    print "pyramids["+str(p)+"][0]", pyramids[p][0]
    pyraNam    = pyramids[p][0]
    height     = pyramids[p][1]
    osmID      = pyramids[p][2]
    baseCrv = rs.ObjectsByName("_bldg3D_crv_"+osmID)
    if not baseCrv: baseCrv = rs.ObjectsByName("Wcrv_"+osmID)
    baseCrv = baseCrv[0]        # ObjectsByName() always returns list !
    baseCoords = rs.CurveEditPoints( baseCrv )[0:4]
    #dm.textDots( baseCoords )
    cen = pntCentroid( baseCoords )
    top = rs.VectorAdd( cen, [0, 0, height] )
    #rs.AddPoint( center )
    #rs.AddCurve( [center, top] )
    #########################################################
    # sort baseCoords radially - so that face_0 facing south:
    baseCoords = [ cor[1] for cor in sorted( [ [rs.Angle(cen, cor)[0], cor] for cor in baseCoords ] )]
    if len(pyramids[p]) < 5:
        pyramids.append( top )
        pyramids.append( baseCoords )
    else:
        pyramids[3]=top
        pyramids[4]=baseCoords
    #########################################################
    if 1:
        rs.CurrentLayer("GIZA::pyramids")
        if not rs.ObjectsByName(pyraNam+"_base"):
            rs.ObjectName(rs.AddCurve( baseCoords, 1), pyraNam+"_base" )
        for i in range(4):
            p0 = baseCoords[i]                      # some rocket science :
            p1 = baseCoords[i + 1 - 4*(i==3)]       # need last + first pnt of baseCoords
            if SrfsOrCrvs==0: obj = rs.AddSrfPt( [p0, p1, top] )  # surface - or..
            else: obj = rs.AddCurve( [p0, p1, top], 1 )         # .. just curves
            rs.ObjectName( obj, pyraNam+"_face_"+str(i) )# name it for later adressing
        pyra.append( top )                          # top coord appended to each single pyramid_list..
        pyra.append( baseCoords )                   # ..same with baseCoords 
        #### we respect the sad problems of rhino@mac:
        #rs.ZoomBoundingBox(rs.BoundingBox(rs.ObjectsByName("*_pyramid")))
        rs.CurrentLayer("Default")
        rs.LayerLocked ("OSM", 0)
        rs.DeleteObjects (rs.ObjectsByName("_bldg3D_higBy_hig_"+osmID))
        rs.HideObject (baseCrv)
    rs.CurrentLayer("Default")
    rs.LayerLocked ("OSM", 1)
    return pyraNam

######################### 4 pyramids mit_ohne OSM
########## action directe / 2020 12 15 / diag / sorry dafuer :)
rs.EnableRedraw(0)
pyras=[
["cheops", 146.6, 4420397, [1248.52044692,1177.13508851,146.6],
[[1119.11710484,1044.36437918,0.0],[1378.68076153,1045.09689965,0.0],[1377.91265704,1309.92508270,0.0],[1118.37126425,1309.15399252,0.0]]],
["chefren", 143.5, 4420396, [863.452413325,765.592578692,143.5],
[[739.094627173,642.396896715,0.0],[988.160855873,642.743869166,0.0],[987.804633503,888.788264014,0.0],[738.749536751,888.441284875,0.0]]],
["mykerinos", 65.0, 4420398, [592.158465300,320.622683574,65.0],
[[534.010729284,264.613746413,0.0],[650.128090131,264.420989649,0.0],[650.306201316,376.631619887,0.0],[534.188840470,376.824378347,0.0]]],
["henutsen", 29.6, 219797726, [1472.76242917,1010.17695143,29.6],
[[1446.28508828,984.182182777,0.0],[1498.62751285,983.578177545,0.0],[1499.23977005,1036.16529323,0.0],[1446.89734548,1036.78215218,0.0]]],
["meritetis", 30.0, 219797724, [1472.74294826,1069.51108927,30.0],
[[1446.34074803,1042.51380133,0.0],[1498.47166557,1041.87123964,0.0],[1499.13958251,1096.51480147,0.0],[1447.01979692,1097.14451462,0.0]]],
["hetepheres", 30.25, 198032492, [1471.22622020,1137.33379761,30.25],
[[1446.04018540,1111.85924919,0.0],[1496.12282431,1111.57652051,0.0],[1496.41225499,1162.80191979,0.0],[1446.32961608,1163.09750096,0.0]]],
["khentkawes", 18.5, 73174154, [1392.15876887,434.391845831,18.5],
[[1369.09615337,407.048940709,0.0],[1420.91537633,413.114422728,0.0],[1415.21581840,461.741187826,0.0],[1363.40772739,455.662832060,0.0]]],
["queen_A", 21.2, 25416060, [588.713127060,209.858105857,21.2],
[[570.234091589,190.903771808,0.0],[607.047447194,190.903771808,0.0],[607.047447194,228.812439906,0.0],[570.523522264,228.812439906,0.0]]],
["queen_B", 21.2, 25416067, [534.712042076,207.590007688,21.2],
[[519.650514972,191.212180857,0.0],[549.628853842,191.083677085,0.0],[549.762437231,223.967834353,0.0],[519.806362259,224.096338458,0.0]]],
["queen_C", 21.2, 25416093, [482.467022060,206.526636076,21.2],
[[468.554868698,191.263582365,0.0],[496.573984530,191.456338026,0.0],[496.373609447,221.783264813,0.0],[468.365625564,221.603359102,0.0]]]
]

#pyras = pyramids[:]
pyramids = pyras
#########################################
############### make pyramid mit_ohne OSM / 2020 12 15 / diag
def makePyramid (NameOrNumber=2, SrfsOrCrvs=0, verbose = 0):
    pyramids = pyras
    rs.UnitSystem(4) # meters
    if "GIZA::pyramids" not in rs.LayerNames():
        newEmptyLayer( "GIZA::pyramids", [240,230,110] )
    if verbose: rs.Redraw()
    for p, pyra in enumerate(pyramids):
        if type(NameOrNumber)==int and p==NameOrNumber:break# or pyramids[i][0] == str(NameOrNumber):
        if type(NameOrNumber)==str and pyra[0]==NameOrNumber:break
    if verbose: print "pyramids["+str(p)+"] :", pyramids[p][0]
    pyraNam     = pyramids[p][0]
    top         = pyramids[p][3]
    baseCoords  = pyramids[p][4]
    ############################

    rs.CurrentLayer("GIZA::pyramids")
    rs.DeleteObjects(rs.ObjectsByName(pyraNam+"_face_*"))
    rs.DeleteObjects(rs.ObjectsByName(pyraNam+"_base"))
    rs.ObjectName(rs.AddCurve( baseCoords, 1), pyraNam+"_base" )
    if verbose: rs.Redraw()
    for i in range(4):
        p0 = baseCoords[i]                      # some rocket science :
        p1 = baseCoords[i + 1 - 4*(i==3)]       # need last + first pnt of baseCoords
        if SrfsOrCrvs==0: obj = rs.AddSrfPt( [p0, p1, top] )  # surface - or..
        else: obj = rs.AddCurve( [p0, p1, top], 1 )           # .. just curves
        rs.ObjectName( obj, pyraNam+"_face_"+str(i) )         # name it for later adressing
        if verbose: rs.Redraw()
    if verbose: rs.Redraw()
    pyramids = pyras
    rs.CurrentLayer("Default")
    return pyraNam


################
######## functions for interaction
################

######## break if you need to
def esc(wo=""):
    if _host.EscapePressed(0):
        raise Exception(wo+'***ESCape*Key*Pressed***')
        #print rs.CommandHistory()


def TimeConsumingTask():
    scriptcontext = dm.scriptcontext    
    for i in range(10000):
        # Was escape key pressed?
        if (scriptcontext.escape_test(False)):
            print "TimeConsumingTask cancelled."
            break
        print i




################
######## text and display functions
################

######## adding leading zeros
def textPre0( val, sign="0", sollLen=1 ):
    # eng leading zero
    anz = sollLen-len(str(val))
    if anz>0:# and val < pow(10, anz):
        for i in range(anz): val = sign+str(val)
    return str(val)

######## adding leading zeros
def textDots(coordList, strX="", justName=0):
    state = rs.EnableRedraw(0)
    ids = []
    if len(coordList):
        for i, pt in enumerate(coordList):
            if not justName: 
                ids.append(rs.AddTextDot(str(i)+strX, pt))
            else:
                ids.append(rs.AddTextDot(strX, pt))
    else:
        print "***________no list > no textDots"
    rs.EnableRedraw(state)
    return ids




################
######## timing functions
################

######## timing variables

######## set time
def timeSet():
    global timeX
    timeX = time.time()

######## get time
def timeGet(verbose=0, prenull=0):
    '''
    timeGet(verbose=0, prenull=0)
    Parameters:
        verbose: int 0/1 print
        prenull: int, textPre0(tim, "0", prenull)
    Returns:
        round(tim,2)
    '''
    global timeX
    tim = float(time.time())
    tim -=  float(timeX)
    tim = round(tim,2)
    txt = str(tim)
    if prenull:
        txt = textPre0(tim, sign="0", sollLen=prenull)
        print "txt", txt
    if verbose:
        print str(txt)+"s"
    return round(tim,2)


######## transpose seconds to minutes
def timeSec2Min( secs ):
    min = int(secs/60.0)
    sec = int(secs-min*60)
    if min > 59:
        hor = int(min/60.0)
        min = int(min-hor*60)
        return textPre0(hor,1)+":"+textPre0(min,1)+":"+textPre0(sec,1)+" "
    min = textPre0(min,1)
    sec = textPre0(sec,1)
    return textPre0(min,1)+"min"+textPre0(sec,1)+"s"



################
######## date/time/location- and osm-related functions
################

def ortX(ortX):
    ort = "guinea"
    lat = 0#
    lon = 0#
    timeZone = 0#
    ### graz
    if ortX == "graz": 
        ort = "graz"
        lat = 47.0654 #=kronesgasse / opernring 47.07086780
        lon = 15.4486 #                         15.43827860
        timeZone = 1
    
    if ortX == "kollerweg":
        ort = "kollerweg"
        lat = 47.130380844984266 # lt google maps
        lon = 15.518638635469191 
        timeZone = 1
    ### NYC, UN headquaters
    if ortX == "NYC UN": 
        lat = 40.7492161
        lon = -73.96867250
        timeZone = -5
    ### stonehenge, UK
    if ortX == "stonehenge": 
        lat = 51.178889
        lon = -1.826111
        timeZone = 0
    ### gizeh, egypt
    if ortX == "giza": ### cairo 30 2 N .. 31 14 E
        ort == "giza"
        lat = 31.1241000
        lon = 29.9694000
        timeZone = 2
    if ortX == "koenigsberg": 
        ort == "koenigsberg"
        lat = 54.6969000
        lon = 20.4943000
        timeZone = 2
    if ortX == "shepperton": 
        ort == "shepperton"
        lat = 51.3928000
        lon = -0.4964000
        timeZone = 0
    if ortX == "barcelona": 
        ort == "barcelona"
        lat = 41.3737000
        lon = 2.1133000
        timeZone = 1
    return [lat, lon, timeZone]

def daysInMonth(year):
    return [31, 28+(int(year)%4==0), 31,30,31,30,31,31,30,31,30,31]

def number2date( number=31, year=2021):
    months = daysInMonth(year)
    for i in range(0, 11):
        if number <= months[i]:
            return [i+1, number]
        number -= months[i]
        if number <= months[i+1]:
            return [i+2, number]
#print number2date( number=32+28, year=2020)
def date2number( year=2020, mon=12, day=30, verbose=0 ):
    months = daysInMonth(year)
    if day > daysInMonth(year)[int(mon)-1]:
        if verbose: print "*** ________no good date: date2number("+str(year)+(", ")+str(mon)+", "+str(day)+") | return =",
        return 0
    number = 0
    for m in range(1, int(mon)): number += months[m-1]
    return number+int(day)
#print date2number(year=2020, mon=2, day=31)
# diag 20 12 18 21:00:
def date2number( year=2020, mon=12, day=30, verbose=0 ):
    if type(year)==list:
        return date2number( year[0], year[1], year[2], verbose=0 )
    months = daysInMonth(year)
    if day > daysInMonth(year)[int(mon)-1]:
        if verbose: print "*** ________no good date: date2number("+str(year)+(", ")+str(mon)+", "+str(day)+") | return =",
        return 0
    number = 0
    for m in range(1, int(mon)): number += months[m-1]
    return number+int(day)
#print date2number(year=2020, mon=2, day=31)

def getDateNow():
    now = datetime.now()
    #print "day :", type(now.day), now.day
    return [now.year, now.month, now.day, now.hour, now.minute, now.second]

_2day = getDateNow()
dayNumber2day = date2number(_2day[0], _2day[1], _2day[2])


dlSaving=0 # sommerzeit o.a.
dat = getDateNow()
ort = "graz" # default
ort = "giza" # default
#ort = "koenigsberg" # default
#ort = "shepperton" # default

def setSun ( year=dat[0], mon=dat[1], day=dat[2], hour=dat[3], min=dat[4], sec=dat[5], verbose=0):
    sun = sc.doc.Lights.Sun
    sun.Enabled = 1
    sun.TimeZone = ortX(ort)[2]
    sun.DaylightSavingMinutes = dlSaving
    if day <= daysInMonth(year)[mon-1]:
        sun.SetPosition(System.DateTime(year, mon, day, hour, min, sec), ortX(ort)[0],ortX(ort)[1])
        if verbose:
            print "    setSun @", year, textPre0(mon, sign="0", sollLen=2), textPre0(day, sign="0", sollLen=2), "(day# "+str(date2number(year,mon,day))+")","@", str(hour)+":"+str(min)+":"+str(sec)+" @ "+ort.upper()+" @ lat/lon =",str(round(ortX(ort)[0],4))+"Â°/"+str(round(ortX(ort)[1],4))+"Â°", "| tZ = "+str(ortX(ort)[2]),
            print "| azi/alti =", str(round(sun.Azimuth,4))+"Â°/"+str(round(sun.Altitude,4))+"Â°\n"#,":"
            #print "*** [ azimut", round(sun.Azimuth,2), " / altitude",round(sun.Altitude,2),"/ sunVector [", sun.Vector, "] ]"
        #return [ sun.Azimuth, sun.Altitude, [sun.Vector[0], sun.Vector[1], sun.Vector[2]] ]
        sunVec = sun.Vector
        return [ sun.Azimuth, sun.Altitude, sun.Vector ]
    else:
        print "*** ________no good date: setSun("+str(year)+(", ")+str(mon)+", "+str(day)+") | return =",
        return [0,0,[0,0,0]]



################
######## delete functions
################

######## delete selected
def eS() :
    rs.DeleteObjects( rs.SelectedObjects() )

######## delete visible
def eV() :
    rs.SelectObjects( rs.AllObjects() )
    eS()

######## erase all
def eA() :
    rs.DeleteObjects( rs.AllObjects() )
    rs.Redraw()

######## delete AbsolutelyAll
def eAA():
    """Deletes Absolutely All objects, incl hidden and locked
    """
    rs.UnlockObjects(rs.AllObjects())
    rs.ShowObjects  (rs.AllObjects())
    eA()
    rs.Redraw()
    #print ("''' all objects deleted")

def eDup(verbose=1):
    selected = rs.SelectedObjects()
    rs.UnselectAllObjects()
    vorher = len(rs.AllObjects())
    rs.Command("_selDup", 0)
    if selected and rs.SelectedObjects():
        for obj in rs.SelectedObjects():
            if obj in selected: selected.remove( obj )
    rs.DeleteObjects( rs.SelectedObjects() )
    if selected: rs.SelectObjects(selected)
    if verbose: print "*** dm.eDup() deleted", vorher - len(rs.AllObjects()), "objects ***\n"
#eDup()
################
######## display functions
################

######## zoom all
def zA( proz=0.95 ) :
    rs.ZoomExtents( all=1 )
    rs.Command("-_zoom Factor "+str(proz)+" _enter", 0) ### diag 2021 11 07
    rs.Redraw()

######## zoom selected
def zS() :
    rs.ZoomSelected( all=1 )

def printDisplay(state=1):
    if state: rs.Command("_PrintDisplay State=On Color=Display Thickness=40 _enter", 0)
    else: rs.Command("_PrintDisplay State=Off _enter", 0)




def mathRound(number, nachkomma):
    return math.floor(number*pow(10, nachkomma))/pow(10, nachkomma)


def getCameraTarget(view=rs.CurrentView(), verbose=1):
    if verbose==2: print "***\nview: \"%s\" : [camPos], [targetPos], lens \n" % (rs.CurrentView()),
    #print "***       lens:", rs.ViewCameraLens(rs.CurrentView(), length=None)
    #print "*** camera pos: [%s, %s, %s]" % (mathRound(rs.ViewCameraTarget(rs.CurrentView())[0][0], 2),mathRound(rs.ViewCameraTarget(rs.CurrentView())[0][1], 2),mathRound(rs.ViewCameraTarget(rs.CurrentView())[0][2], 2))
    #print "*** target pos: [%s, %s, %s]" % (mathRound(rs.ViewCameraTarget(rs.CurrentView())[1][0], 2),mathRound(rs.ViewCameraTarget(rs.CurrentView())[1][1], 2),mathRound(rs.ViewCameraTarget(rs.CurrentView())[1][2], 2)),
    cam   = rs.ViewCameraTarget(rs.CurrentView())
    plane = rs.ViewCameraPlane(rs.CurrentView())
    camPos    = "%s, %s, %s" % (mathRound(cam[0][0], 8),mathRound(cam[0][1], 8),mathRound(cam[0][2], 8))
    targetPos = "%s, %s, %s" % (mathRound(cam[1][0], 8),mathRound(cam[1][1], 8),mathRound(cam[1][2], 8))
    lensVal   = mathRound( rs.ViewCameraLens(rs.CurrentView()), 8)
    upVec = rs.ViewCameraUp(rs.CurrentView(), up_vector=None)
    #viewRotation = rs.RotateView( rs.CurrentView() )
    #camRotation = rs.RotateCamera( rs.CurrentView() )
    if verbose: print "dm.setCameraTarget( [%s], [%s], lens=%s, rota=0, upVec=[%s] ) # ... danke, andi !" % (camPos, targetPos, lensVal, upVec)
    return [rs.ViewCameraTarget(rs.CurrentView())[0], rs.ViewCameraTarget(rs.CurrentView())[1], lensVal, upVec]


def setCameraTarget(camera=[0, 0, 0], target=[0, 0, 1], lens=50, rota=0, upVec=0, verbose=0 ):
    rs.ViewCameraTarget(rs.CurrentView(), camera, target )
    if lens : rs.ViewCameraLens(rs.CurrentView(), lens)
    if upVec: rs.ViewCameraUp(rs.CurrentView(), upVec)
    if 1 or rota : 
        #rs.RotateView(rs.CurrentView(), direction=0, angle=rota)
        #rs.RotateCamera(view=None, direction=0, angle=rota)
        rs.Command("-_viewportproperties rotation "+str(rota)+" enter enter", 0)
    if verbose :
        rs.Redraw()
        getCameraTarget(view=rs.CurrentView(), verbose=verbose)
    #rs.Command("-ViewportProperties Rotation 0 -enter",1)



################
######## math and array functions
################

######## very simple remapping of a value
def reMap(i, iMin, iMax, oMin, oMax):
    '''

    '''
    inFac  = float(i-iMin)/float(iMax-iMin)# 
    outFac = (oMax-oMin)
    return (oMin + outFac*inFac)

######## list mixxing  / diag
def permutate( list, num):
    return [ perm for perm in permutations(list, num) ]
    
def combinate( list, num):
    return [ comb for comb in combinations(list, num) ]


################
######## basic point and vector functions
################

######## get a point between two points
def pntInbetween( coord0, coord1, fac=.5 ) :
    vec = rs.VectorSubtract( coord1, coord0 )
    vec = rs.VectorScale( vec, fac )
    coord = rs.VectorAdd( coord0, vec )
    
    return coord

def normVec3pnts( p0, p1,p2):
    return rs.VectorUnitize(rs.VectorCrossProduct( rs.VectorSubtract(p0,p1), rs.VectorSubtract(p0,p2) ))

### _diag 2021 11 13
######## get segmets+1 points between two points
######## similar 2 rs.DivideCurve(..)
def pntsInbetween( coord0, coord1, segments, create_points=False, create_line=False):
    '''
    return = coords
    '''
    coords = []
    vec = rs.VectorSubtract( coord1, coord0 )
    for i in range(segments+1):
        coords.append(rs.VectorAdd( coord0, rs.VectorScale(vec, float(i)/segments) ) )
        print i/segments
    if create_points: rs.AddPoints( coords )
    if create_line  : rs.AddLine( coord1, coord0 )
    print len(coords)
    return coords



def circumcircleOfTriangle(p0, p1, p2, verbose = 1):
    lineA = symmetryLine(p0, p1)
    lineB = symmetryLine(p1, p2)
    center= rs.LineLineIntersection(lineA, lineB)[0]
    if verbose:
        rs.AddCircle(center, rs.Distance(center,p0) )
    return [center, rs.Distance(center,p0)]

### diag 2022 12 11 / for delaunay_3D

def circumcircleOfTriangle(p0, p1, p2, verbose = 0):
    '''
    arguments:
        p0, p1, p2 .. 3 coords
        verbose 0/1 generate circle
    returns:
        list [center, radius]
    '''
    p2N = rs.LineClosestPoint([p0,p1], p2)
    p2Nvec = rs.VectorSubtract(p2, p2N)
    p0p1M = rs.VectorAdd( p0, rs.VectorScale( rs.VectorSubtract( p1, p0 ), .5 ) )
    p0p1N = rs.VectorAdd(p0p1M, rs.VectorScale(p2Nvec, 100000) )
    p0p1_N = rs.VectorAdd(p0p1M, rs.VectorScale(p2Nvec, -100000) )
    
    p1p2M = rs.VectorAdd( p1, rs.VectorScale( rs.VectorSubtract( p2, p1 ), .5 ) )
    p1p2N = rs.VectorAdd(p1p2M, rs.VectorScale(rs.VectorSubtract(p0, rs.LineClosestPoint([p1,p2], p0)), 100000)  )
    p1p2_N = rs.VectorAdd(p1p2M, rs.VectorScale(rs.VectorSubtract(p0, rs.LineClosestPoint([p1,p2], p0)), -100000)  )
    
    line01 = [p0p1_N, p0p1N]
    line02 = [p1p2_N, p1p2N]
    #rs.ObjectColor(rs.AddLine( p0p1M, p0p1N ), [0,200,0])
    #rs.ObjectColor(rs.AddLine( p1p2M, p1p2N ), [220,100,0])
    #print line01,"---",line02, "///",
    print rs.Distance(p0p1M, p0p1N),"---",  rs.Distance(p1p2M, p1p2N)
    center = rs.LineLineIntersection(line01, line02)[0]
    #rs.AddPoint( center )
    if 0 or verbose:
        rs.ObjectColor(rs.AddCurve( [center,p0,p1,p2,p0], 1), [100,200,100])
        pln = rs.PlaneFromPoints(center,p0,p1)
        rs.AddCircle(pln, rs.Distance(center,p0) )
    return [center, rs.Distance(center,p0)]
    

######## get a point in center/centroid/mitte von coords/points/pointcloud
def pntCentroid( coords ) :
    x_sum = 0
    y_sum = 0
    z_sum = 0
    for coord in coords :
        x_sum += coord[ 0 ]
        y_sum += coord[ 1 ]
        z_sum += coord[ 2 ]
    num = len( coords )
    x = x_sum / num
    y = y_sum / num
    z = z_sum / num
    coord = [ x, y, z ]
    return coord

######## sort a li^st of coordinates depending on their distance to one point
def pntsSortDistancePnt( origin, coords ) :
    dists = []
    for coord in coords :
        dist = rs.Distance( origin, coord )
        dists.append( abs(dist) )
    zipped_lists = zip( *sorted( zip(dists,coords) ) )
    return list(zipped_lists[1])

######## sort a list of coordinates depending on their distance to one plane
def pntsSortDistancePln( plane, coords ) :
    dists = []
    for coord in coords :
        dist = rs.DistanceToPlane( plane, coord )
        dists.append( abs(dist) )
    zipped_lists = zip( *sorted( zip(dists,coords) ) )
    return zipped_lists[1]



################
######## point and vector functions for curves
################

######## perpendicular frame with normalized parameters
### ?? fehler diag 2021 11 21 ??
def plnCurvePerp( crv, crv_parameter=0.5 ) :
    ###crv_parameter = rs.CurveParameter( crv, crv_parameter ) 
    #pln = rs.CurvePerpFrame( crv, crv_parameter )
    return rs.CurvePerpFrame( crv, crv_parameter )

######## perpendicular distance ("normalabstand") point..curve
def pntCurveDist( pnt, crv  ):
    # para = rs.CurveClosestPoint(crv, pnt)
    # poin = rs.EvaluateCurve(crv, param)
    # dist = rs.Distance(pnt, poin)
    return rs.Distance(pnt, rs.EvaluateCurve(crv, rs.CurveClosestPoint(crv, pnt)))

######## perpendicular distance ("normalabstand") point..Line / _diag 2021 11 04
def pntLineDist( pnt, line):
    '''
    arguments:  pnt: [x,y,z]
               line: [point, point] 
       return: distance of nearest point on LINE from tst_pnt
    '''
    #line = [point0, point1]
    #poin = rs.LineClosestPoint(line, pnt)
    #dist = rs.Distance(pnt, poin)
    return rs.Distance(pnt, rs.LineClosestPoint(line, pnt))

######## perpendicular distance ("normalabstand") point..curve
def pntCurveClosest( pnt, crv  ):
    '''
    arguments: pnt: [x,y,z]
               crv: ID of curve
       return: pnt [x,y,z] on curve that is closest to pnt
    '''
    para = rs.CurveClosestPoint(crv, pnt)
    return rs.EvaluateCurve( crv, rs.CurveClosestPoint(crv, pnt) )

######## origin of the perpendicular frame
def pntCurvePerp( crv, crv_parameter=0.5 ) :
    prepframe = plnCurvePerp( crv, crv_parameter )
    pnt = prepframe[0]
    return pnt

######## axis of the perpendicular frame
def vecCurvePerpX( crv, crv_parameter=0.5 ) :
    prepframe = plnCurvePerp( crv, crv_parameter )
    vec = rs.VectorUnitize( prepframe[1] )
    return vec
def vecCurvePerpY( crv, crv_parameter=0.5 ) :
    prepframe = plnCurvePerp( crv, crv_parameter )
    vec = rs.VectorUnitize( prepframe[2] )
    return vec
def vecCurvePerpZ( crv, crv_parameter=0.5 ) :
    prepframe = plnCurvePerp( crv, crv_parameter )
    vec = rs.VectorUnitize( prepframe[3] )
    return vec

######## projection of the curve direction onto a plane
def vecCurvePerpNormal( crv, crv_parameter=0.5, nor=[pi,pi,pi] ) :
    prepframe = plnCurvePerp( crv, crv_parameter )
    dir = rs.VectorUnitize( prepframe[3] )
    vec = rs.VectorCrossProduct( dir, nor )
    ### vec = rs.VectorRotate( vec, 90, nor ) ### korr diag 2022 11 04
    vec = rs.VectorUnitize( vec )
    return vec

######## projections of the curve direction onto default planes
def vecCurvePerpXY( crv, crv_parameter=0.5 ) :
    vec = vecCurvePerpNormal( crv, crv_parameter, [0,0,1] )
    return vec
def vecCurvePerpXZ( crv, crv_parameter=0.5 ) :
    vec = vecCurvePerpNormal( crv, crv_parameter, [0,1,0] )
    return vec
def vecCurvePerpYZ( crv, crv_parameter=0.5 ) :
    vec = vecCurvePerpNormal( crv, crv_parameter, [1,0,0] )
    return vec

### new 2020 12 15 / diag
def pnt2str( pnt ): # [x,y,z] > "x,y,z" | useful at rs.command(..)
    return str(pnt[0])+","+str(pnt[1])+","+str(pnt[2])

def pnt2XY0( pnt ): # [x,y,z] > [x,y,0]
    return [pnt[0], pnt[1], 0]
def pnt2XZ0( pnt ): # [x,y,z] > [x,y,0]
    return [pnt[0],0, pnt[2]]
def pnt2YZ0( pnt ): # [x,y,z] > [x,y,0]
    return [0, pnt[1],pnt[2]]

def pnt2cor( pnt ): # [<Rhino.Geometry.Point3d object at 0x0000000000000104 [x,y,z]>] or 'vector' etc > [x,y,z]
    return [ val for val in pnt ]

def pnts2cors( pnts ): # [<Rhino.Geometry.Point3d object at 0x0000000000000104 [x,y,z]>] or 'vector' etc > [x,y,z]
    return [ [pnt[0],pnt[1],pnt[2]] for pnt in pnts]

def cPlane3pts( p0, p1, p2):
    p0 = pnt2str(p0) 
    p1 = pnt2str(p1) 
    p2 = pnt2str(p2)
    cmd = "cPlane 3Point "+p0+" "+p1+" "+p2+" enter"
    rs.Command(cmd, 0)

# cPlane3pts( [0,0,0], [0,0,1], [0,1,0] )

#########################
### new 2022 11 29 / diag

def pnts2XY0( coords ):
    return [ pnt2XY0(cor) for cor in coords]

#########################
### new 2022 12 08 / diag
coords=[]
def pntRemoveByDist(coords=coords, minDist=1.0, randomize=1, verbose=1):
    lenVorher = len(coords)
    for i in range(1001):
        if randomize:
            random.shuffle(coords)
        distList = sorted( [ [pair, rs.Distance(pair[0],pair[1])] for pair in combinate( coords, 2) ], key=lambda sortKey: (sortKey[1]) )
        if verbose: print i, "len(coords)", len(coords), "min ",distList[0][1]
        if distList[0][1] < minDist:
            coords.remove(distList[0][0][0] )
            #rs.AddCurve( distList[0][0] )
            #rs.AddPoint( distList[0][0][0] )
        else:
            print "XXX pntRemoveByDist done ",
            if 1 or verbose: print ": cnt =", i,  "len(coords) vorher/nachher "+str(lenVorher)+"/"+str(len(coords))+" - minDist", distList[0][1], "\nXXXXXXXXXXXXXXXXXXXXXXXX"
            break
    return coords

'''
USAge
anz=100
a=10
coords = [ [random.uniform(0,a),random.uniform(0,a),0] for i in range(anz) ]
#pnts = rs.AddPoints( coords )
coords = pntRemoveByDist(coords=coords, minDist=0.5, verbose=0)
'''
    
##########
# ConvHull
# worx @ xy_plane only
def pntConvHull(coordList, verbose=0):
    avg=pntCentroid(coordList)
    start = a = min(coordList)
    coords = [start]
    for i in range(1,10001):
        esc()
        o = a
        a = avg
        for b in coordList:
            if (a[0]-o[0])*(b[1]-o[1])-(a[1]-o[1])*(b[0]-o[0]) < 0:
                a = b
        coords.append(a)
        if a == start:
            break
    if a == start:# or i == 1000:
        if verbose: print "*** convHull: i=",i,": len convCoords=", len(coords), "(from "+str(len(coordList))+"coords)"

    return coords

### new 2022 12 09 ff / diag
#########################
def pntRandVec (a=-1, b=1, anzahl=1):
    return  [[random.uniform(a,b) for i in range(3) ] for j in range(anzahl)]

def pntRandCoords (a=-1, b=1, anzahl=100):
    return  [[random.uniform(a,b) for i in range(3) ] for j in range(anzahl)]

def getSurfacePoints( objID ): 
    rs.UnselectAllObjects()
    if rs.ObjectType(objID)==16:
        rs.Command("_solidPtOn _selID "+str(objID)+" _enter _enter", 0)
        coords = rs.ObjectGripLocations( objID )
        rs.Command("_pointsOff _enter", 0)
    rs.UnselectAllObjects()
    if rs.ObjectType(objID)==8:
        rs.EnableObjectGrips(objID, 1)
        coords = rs.ObjectGripLocations( objID )
        rs.EnableObjectGrips(objID, 0)
    return coords ### danke, andi !

################
######## layer and material functions
################

def getObjsLayerAndSubs(layer):
    """ 
    get - recursively - objects on sub_layers
    """
    objs = rs.ObjectsByLayer(layer)
    subLayers = rs.LayerChildren(layer)
    if(subLayers):
        #layer has one or more sublayers
        for sLayer in subLayers:
            #recurse
            objs.extend(getObjsLayerAndSubs(sLayer))
    return objs


######## set up an empty new layer in rhino
def newEmptyLayer( lay, color=[105,105,105], parent="", transe=0.0, gloss=0.0, refl=0.0 ):
    #rs.CurrentLayer( "Default")
    layX = lay
    if parent: layX = parent+"::"+lay
    rs.AddLayer( lay, color, parent=parent )
    if rs.IsLayer( layX ) :
        rs.ShowObjects( rs.ObjectsByLayer( layX ) )
        rs.DeleteObjects( rs.ObjectsByLayer( layX ) )
        #rs.PurgeLayer( layX )
    rs.LayerColor(layX, color)
    rgbMat2Lay( layX, *color, T=transe, Gloss=gloss, Refl=refl, matNam=layX+"_layMat" )
    rs.Redraw()
    rs.CurrentLayer( lay )

######## assign a material to an object 
def rgbMat2Obj(obj_id = "", R=127, G=127, B=127, T=0.0, Gloss=0, Refl=0.0, matNam="none"):
    """ Adds Material to Objects.
    Parameters:
      obj_id = Guid of Geometry in RhinoDoc
      Red[opt] = 0-255
      Green[opt] = 0-255
      Blue[opt] = 0-255
      Transparency[opt] = 0.0 - 1.0, 1.0 being transparent
      Glossiness[opt] = 0.0 - 255.0, 255.0 being glossy
      Reflectivity[opt] = 0.0 - 1.0, 1.0 being fully reflectant
      matName[opt] = Materialname as String
    Returns:
      Material index
    """
    if obj_id: index = rs.AddMaterialToObject(obj_id)
    else: index = sc.doc.Materials.Add()
    R=int(R)
    G=int(G)
    B=int(B)
    rs.MaterialColor( index, (R, G, B) )
    rs.MaterialTransparency( index, T-0.000001 ) # T 0.0..1.0
    rs.MaterialShine( index, Gloss*255 )         # Gloss 0.0..1.0 // diag 2022 01 28
    #rs.MaterialReflectiveColor( index, (191, 191, 255) )
    newMat = sc.doc.Materials[index]
    newMat.Reflectivity=Refl
    sc.doc.Materials.Modify(newMat,index,1)
    if matNam == "none": matNam = "mat_%s_%s_%s_%s_ind_%s" % (R, G, B, int(T*100), index)
    #print "***", matNam#, #" .. created (ind", index, ")"
    rs.MaterialName (index, matNam)
    return index

######## assign a material to a layer 
def rgbMat2Lay(lay_nam = "", R=127, G=127, B=127, T=0.0, Gloss=0.0, Refl=0.0, matNam="none"):
    """ Adds Material to LAYER.
    Parameters:
      lay_nam = layerName
      Red[opt] = 0-255
      Green[opt] = 0-255
      Blue[opt] = 0-255
      Transparency[opt] = 0.0 - 1.0, 1.0 being transparent
      Glossiness[opt] = 0.0 - 1.0, 1.0 being glossy
      Reflectivity[opt] = 0.0 - 1.0, 1.0 being fully reflectant
      matName[opt] = Materialname as String
    Returns:
      Material index
    """
    if lay_nam: index = rs.AddMaterialToLayer(lay_nam)
    else: index = sc.doc.Materials.Add()
    rs.ResetMaterial(index)
    R=int(R)
    G=int(G)
    B=int(B)
    #rs.MaterialReflectiveColor( index, (191, 191, 255) )
    newMat = sc.doc.Materials[index]
    newMat.Reflectivity=Refl
    sc.doc.Materials.Modify(newMat, index, 1)
    if matNam == "none": matNam = "mat_%s_%s_%s_%s_ind_%s" % (R, G, B, int(T*100), index)
    #print "***", matNam#, #" .. created (ind", index, ")"
    rs.MaterialColor( index, (R, G, B) )
    rs.MaterialTransparency( index, T-0.000001 ) # T 0.0..1.0
    rs.MaterialShine( index, Gloss*255 )             # Gloss 0.0..1.0
    rs.MaterialName (index, matNam)
    return index


### experimental
def PointRadius(displayModeX=0, rad=3, styl=3,  verbose=0 ):
    '''
        arguments:
                displayModeX: int .. number of displayMode
                rad  = 3 : point radius
                styl = 3 : point style
                verbose : quasselig
                point style:
                    https://developer.rhino3d.com/api/rhinocommon/rhino.display.pointstyle
                    0 ControlPoint "square with center"
                    1 RoundControlPoint "round with center"
                    2 Simple "solid square"
                    3 RoundSimple "solid circle"
        Standard displayModes_numbers
        0 Wireframe
        1 Shaded
        2 Rendered
        3 Ghosted
        4 XRay
        5 Technical
        6 Artistic
        7 Pen
        8 Arctic
        9 Raytraced
        10 etc ! 
    '''
    display_modes = Rhino.Display.DisplayModeDescription.GetDisplayModes()
    if styl>12:
        print "!!! print nix style>12 > set_2 \"3\""
        styl = 3
    if styl==0: styx = Rhino.Display.PointStyle.ControlPoint
    if styl==1: styx = Rhino.Display.PointStyle.RoundControlPoint
    if styl==2: styx = Rhino.Display.PointStyle.Simple
    if styl==3: styx = Rhino.Display.PointStyle.RoundSimple
    if styl==4: styx = Rhino.Display.PointStyle.ActivePoint
    if styl==5: styx = Rhino.Display.PointStyle.RoundActivePoint
    if styl==6: styx = Rhino.Display.PointStyle.ArrowTip
    if styl==7: styx = Rhino.Display.PointStyle.Heart
    if styl==8: styx = Rhino.Display.PointStyle.Chevron
    if styl==9: styx = Rhino.Display.PointStyle.Triangle
    if styl==10: styx = Rhino.Display.PointStyle.X
    if styl==11: styx = Rhino.Display.PointStyle.Pin
    if styl==12: styx = Rhino.Display.PointStyle.Asterisk

    #print display_modes[displayModeX].EnglishName+"("+str(displayModeX)+") >> pointStyle", "\""+str(styx)+"\""
    if displayModeX != "all" and displayModeX <= len(Rhino.Display.DisplayModeDescription.GetDisplayModes()):
        selected_description = Rhino.Display.DisplayModeDescription.GetDisplayModes()[int(displayModeX)]
        selected_description.DisplayAttributes.PointRadius =  rad
        selected_description.DisplayAttributes.PointStyle = styx # Rhino.Display.PointStyle.Simple
        Rhino.Display.DisplayModeDescription.UpdateDisplayMode(selected_description)
        if 0 or verbose : print "*** style \""+(display_modes[int(displayModeX)].EnglishName+"\":::::::::::::: ")[0:15]+" PointRadius =", rad, "geaendert, danke Eszter & danke Andi fuer PointStyle = \""+str(styx)+"\""
    else:
        #if 0 or verbose : print "ALL"
        for displayModeX in range(len(display_modes)):
            selected_description = display_modes[displayModeX]
            selected_description.DisplayAttributes.PointRadius =  rad
            selected_description.DisplayAttributes.PointStyle = styx # Rhino.Display.PointStyle.Simple
            Rhino.Display.DisplayModeDescription.UpdateDisplayMode(selected_description)
            #if 0 or verbose : print "*** style \""+(display_modes[displayModeX].EnglishName+"\":::::::::::::: ")[0:15]+" PointRadius =", rad, "geaendert, danke Eszter & danke Andi fuer PointStyle = \""+str(styx)+"\""
    if 1:
        ###DISPLAY_MODE##
        #print displayModeX
        if isinstance(displayModeX, int) and int(displayModeX) < 11:
            selected_description = display_modes[int(displayModeX)]
        ###RADIUS POINTS###
        disX = displayModeX
        for i, disX in enumerate(display_modes):
            english_name = disX.EnglishName
            english_name = english_name.translate(None, "_ -,.")
            if 0 or verbose:
                num = str(i)
                if i<10:num= " "+num
                print num+" = "+(str(english_name)[0:]+":::::::::::::::::")[0:13],
                print "pointRadius=", int(display_modes[i].DisplayAttributes.PointRadius),
                print "/ pointStyle =", display_modes[i].DisplayAttributes.PointStyle



def UNcutTool(dist=50, offs = 3, deleteIt = 1):
    if dist < 10: dist = 100
    currView = rs.ViewDisplayMode()
    rs.ViewDisplayMode(view=None, mode="wireframe")
    p0 = uno0
    p1 = rs.VectorAdd( uno0, rs.VectorScale(unoY,lenY) )
    p2 = rs.VectorAdd( p1, rs.VectorScale(unoX, lenX) )
    p3 = rs.VectorAdd( p0, rs.VectorScale(unoX, lenX) )
    center = pntInbetween(p0, p2)
    crv0 = rs.AddCurve( [p0, p1, p2, p3, p0], 1 )
    crv1 = rs.OffsetCurve(crv0, [0,0,0], dist)
    rs.MoveObject(crv1, [0,0,-dist] )
    aussen = rs.ExtrudeCurveStraight( crv1, [0,0,0], [0,0,lenZ+dist*2] )
    rs.CapPlanarHoles(aussen)
    #rs.DeleteObjects( [crv0, crv1] )
    
    p0 = rs.VectorAdd( uno0, rs.VectorScale(unoX, lenX+dist*-3) )
    p1 = rs.VectorAdd( p0, rs.VectorScale(unoY,lenY) )
    p2 = rs.VectorAdd( p1, rs.VectorScale(unoX, lenX+dist*4) )
    p3 = rs.VectorAdd( p0, rs.VectorScale(unoX, lenX+dist*4) )
    crv0 = rs.AddCurve( [p0, p1, p2, p3, p0], 1)
    crv1 = rs.OffsetCurve(crv0, uno0, 20)
    crv1o = rs.OffsetCurve(crv1, [0,0,0], 20+offs)
    rs.MoveObject(crv1o, [0,0,-offs])
    innen = rs.ExtrudeCurveStraight( crv1o, [0,0,0], [0,0,lenZ+2*offs] )
    rs.CapPlanarHoles(innen)
    #rs.DeleteObjects( [crv0,crv1, crv1o] )
    cutBody = rs.BooleanDifference(aussen, innen)
    rs.DeleteObjects( [crv0,crv1, innen, aussen] ) 
    rs.UnselectAllObjects()
    rs.SelectObjects(rs.AllObjects())
    rs.UnselectObject(cutBody)
    rs.Command("_split _selID "+str(cutBody)+" _enter _enter",0)
    rs.UnselectAllObjects()
    rs.SelectObject(cutBody)
    rs.Command("_SelVolumeObject _enter", 0)
    #rs.DeleteObject(cutBody)
    anz = len(rs.SelectedObjects())
    rs.Redraw()
    rs.ZoomSelected()
    rs.Sleep(1000)
    print "*** UNcutTool split", anz,"objects",
    if deleteIt:
        rs.DeleteObjects( rs.SelectedObjects())
        print ".. und weg sind sie !"
    rs.ViewDisplayMode(view=None, mode=currView)



def getPixels(imagePath, steps_x=5, steps_y=5):
    # https://discourse.mcneel.com/t/how-to-store-list-of-list-when-reading-rgb-values-of-an-image/88276/6
    """
    Gets the pixel colors of an image.
    Args:
      image_path: An absolute path to an image file.
      steps_x: A number of pixels to sample in image x-direction.
      steps_y: A number of pixels to sample in image y-direction.
    Returns:
      A list of lists with a sublist of pixel colors 
        for each sampled row of the image .. starting linx_unten
    """
    ###
    print "imagePath =", imagePath
    ###
    bitmap = System.Drawing.Bitmap.FromFile(imagePath)
    print "wid", bitmap.Width, "/ steps_x("+str(steps_x)+") >>", int(bitmap.Width/steps_x),"px"
    print "hig", bitmap.Height, "/ steps_y("+str(steps_y)+") >>", int(bitmap.Height/steps_y),"px .. =", (bitmap.Width/steps_x)*(bitmap.Height/steps_y),"pixelz"
    pixels = []
    for y in xrange(bitmap.Height-1,-1,-1):
        if y % steps_y == 0:
            row_pixels = []
            for x in xrange(bitmap.Width):
                if x % steps_x == 0:
                    pixel = bitmap.GetPixel(x, y)
                    col = [pixel[0],  pixel[1],  pixel[2] ]
                    row_pixels.append(col)
            pixels.append(row_pixels)
    return pixels
    

def exportCoordList( list2export=coords, exportedListName="GIS_coords", path="P:/", fileName="dachsteinGis"):
    setTime()
    list2export.sort( key=lambda cor: (cor[1],  cor[0]) )
    fo = open(path+fileName+".py", 'w')
    fo.write( exportedListName+"=[\n")
    list = list2export[0:]
    for i, cor  in enumerate(list):
        out = "["+str(cor[0])+","+str(cor[1])+","+str(cor[2])+"]"
        if i<len(list)-1:
            out += ",\n"
        else:
            out += "]"
        fo.write( out  )
    fo.close()
    print "***", len(list2export), "coords exported to file", path+fileName+".py | in", getTime(), "sex"



############################
### DM2_w22 demo UN_NYC_slab / simplyfied version
unoX = [ 0.876922678230265,-0.480631476711064,0 ]
unoY = [ 0.480631476711061,0.876922678230267,0  ]
uno0 = [ 727.495136230253,531.705385598354,0.00 ]

slabs = L = 11
depth = D = 4
floors= H = 40
fH = 3.9
lenY = 116.56
lenX =  28.18
lenZ = 156.00

def getUnoGridCoords(L=11, D=4, H=40, fH = 4.0):
    #baseCoords = rs.CurveEditPoints(rs.ObjectsByName("_bldg3D_crv_137989966")[0])
    #baseXYZ = baseCoords[14]
    #baseXYZ = [727.495136230253,531.705385598354,0.00]
    #print baseXYZ
    #    dirY = rs.VectorSubtract( baseCoords[10], baseCoords[14] )
    #    dirX = [dirY[1], dirY[0]*-1.0,0] # normal vec
    #    lenY = rs.VectorLength( dirY ) 
    #    lenX = rs.VectorLength( rs.VectorSubtract( baseCoords[15], baseCoords[14] ) )
    #    uniX = rs.VectorUnitize(dirX)
    #    uniY = rs.VectorUnitize(dirY)
    #    uniX = rs.VectorUnitize(dirX)
    #    uniY = rs.VectorUnitize(dirY)
    D += D<2
    slab_spacing = lenY/(L-1)
    UnoGridCoords = []
    for z in range(H):
        for x in range(D):
            for y in range(L):
                cor = uno0
                cor = rs.VectorAdd( cor, rs.VectorScale(unoX, lenX*x/(D-1)))
                cor = rs.VectorAdd( cor, rs.VectorScale(unoY, slab_spacing*y))
                cor = rs.VectorAdd( cor, [0,0, fH*z])
                UnoGridCoords.append( cor )
    #print "*** UnoGridCoords = [",L,"*",D,"*", H,"=", len(UnoGridCoords),"coords]   by getUnoGridCoords() @ DM2_lib ***"
    #print "**************************************************************************************\n"
    return UnoGridCoords


def UN_slab(showAll=0):
    #eA()
    slabs = 11
    depth = 4
    floors= 40
    fH = 3.9
    lenY = 116.56
    lenX =  28.18
    lenZ = 156.00
    rs.ObjectColor( rs.AddLine( uno0, rs.VectorAdd( uno0, rs.VectorScale(unoX, lenX) ) ), [200,0,0] )# x/Red
    rs.ObjectColor( rs.AddLine( uno0, rs.VectorAdd( uno0, rs.VectorScale(unoY, lenY) ) ), [0,200,0] )# y/Green
    rs.ObjectColor( rs.AddLine( uno0, rs.VectorAdd( uno0, [0,0,40*fH] ) ),                [0,0,200] )# z/Blue
    
    linX = rs.AllObjects()[2]
    linY = rs.AllObjects()[1]
    linZ = rs.AllObjects()[0]
    if showAll:
        for y in range(0, slabs+1):
            rs.CopyObject( linZ, rs.VectorScale( unoY, lenY/slabs*y ) )
            for x in range(1, depth+1):
                rs.CopyObject( rs.AllObjects()[0], rs.VectorScale( unoX, lenX/depth) )
        rs.CopyObject( linY, rs.VectorScale( unoX, lenX) )
        for f in range(1, floors+1):
            rs.CopyObject( linY, [0,0,fH*f] )
        rs.CopyObject( rs.AllObjects()[0], rs.VectorScale( unoX, lenX) )
    
        for y in range(0, slabs+1):
            pass
            rs.CopyObject( linX, rs.VectorScale( unoY, lenY/slabs*y ) )
            rs.CopyObject( rs.AllObjects()[0], [0,0,fH*floors] )
        eDup()
    zA()
### UN_slab(showAll=1)
### DM2_w22 demo UN_NYC_slab
############################

################
######## basic library data and functions
################


def echo( on ):
        Rhino.ApplicationSettings.AppearanceSettings.EchoCommandsToHistoryWindow = on
        Rhino.ApplicationSettings.AppearanceSettings.EchoPromptsToHistoryWindow = on

echo(1)

#rs.EnableRedraw(0)
Rhino.ApplicationSettings.AppearanceSettings.EchoCommandsToHistoryWindow = 1
Rhino.ApplicationSettings.AppearanceSettings.EchoPromptsToHistoryWindow  = 1


def capureFrames(path = "D:/DM2/ani_images/", name="_tst", fram=0, Width=960,  Height=540,  Scale=2, format="png", trans=0 ):
    framstr = "0"
    if fram<1000: framstr += "0"
    if fram<100: framstr += "0"
    if fram<10: framstr += "0"
    name = name+"_"+framstr+str(fram)
    transe = "no"
    if format == "png" and trans:
        transe = "yes"
    rs.Redraw()
    rs.Command("-viewCaptureToFile Unit=pixels Width="+str(Width)+"  Height="+str(Height)+"  Scale="+str(Scale)+"  LockAspectRatio=No TransparentBackground="+transe+" "+path+name+"."+format, 0)



def checkSteigung( crv, checkProzent=5, checkUnit="m", verbose=0):
    prix=1
    coords = rs.DivideCurve( crv, int(rs.CurveLength(crv))*(1+99*(checkUnit=="cm")), 0)
    deg = rs.CurveDegree(crv)
    
    coordsXY0 = pnts2XY0(coords)
    crvXY0 = rs.AddCurve(coordsXY0, deg )
    rs.ObjectColor( crvXY0, [0,100,100])
    lenX = rs.CurveLength(crvXY0)
    prozs = []
    radii = []
    for i in range(len(coords)-1):
        lenx = rs.Distance( pnt2XY0(coords[i]), pnt2XY0(coords[i+1]) )
        proz = round( abs(coords[i][2]-coords[i+1][2]) / lenx * 100, 2)
        prozs.append( proz )
        #if verbose==1: print i,proz, "%"
        rad=0
        if rs.CurveCurvature(crvXY0 , rs.CurveClosestPoint(crvXY0 , coords[i])):
            rad = round( rs.CurveCurvature(crvXY0 , rs.CurveClosestPoint(crvXY0 , coords[i]))[3], 2)
        radii.append( rad )

        if not verbose and proz > checkProzent and prix:
            prix=0
            print "steigg >",checkProzent,":", proz
        if verbose==2 and proz > checkProzent: print "i"+str(i)+"="+str(proz)+"%"
        #param = rs.CurveClosestPoint(crv, coords[i])
        if verbose:
            print i, str(proz)+"% - curvature/radius @ i:",i,":", rad,"meters"
    rs.DeleteObject(crvXY0)
    prozs=sorted(prozs)
    radii=sorted(radii)
    if len(radii): print "*** min radius:", radii[0],checkUnit,"*** max radius:", radii[-1],checkUnit
    print "*** max steigg:", prozs[-1],"%    (", str(len(prozs))+checkUnit+" - last:", prozs[-3],">", prozs[-2],">", prozs[-1],")"
    
    higx = abs(rs.CurveStartPoint(crv)[2]-rs.CurveEndPoint(crv)[2])
    stgg = higx/lenX*100
    print "*** avg steigg:", abs(round(stgg, 2)),"% --",  higx, "/", lenX



######## feedback in status bar
print lib_cc
print "    sourced", datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print "    ~~~~~~~~~~~~~~~~~~~~~~~~~~X",

#ort = "giza" # default
ort = "graz" # default
#ort = "shepperton" # default
#ort = "NYC UN" # default

#print

#print "changes___:"
#print "2023 09 19: exp PointRadius(displayMode=0, rad=3, sty=XXX  verbose=0 )" pointStyle added !
#print "2021 11 25: neu eDup() - delete duplicates / chg 2021 11 30"
#print "2021 11 20: kor plnCurvePerp()"
#print "          : neu getSurfacePoints(polySrf)"
#print "          : neu zA( proz=0.95 ) - zoom extents + % smaller"
#print "          : neu printDisplay( 1/0 )"
########################
rs.EnableRedraw(1)

#coords = []
#print "***len dm.coords =", len(coords),"\n*******************************"
#
allLodgeData  = getLodge( demo=0, verbose=0 )
UnoGridCoords = getUnoGridCoords(11, 4, 40, 4.0)
p0 = getUnoCoord( 0,   0,   0)
p1 = getUnoCoord( L-1, 0,   0)
p2 = getUnoCoord( L-1, D-1, 0)
p3 = getUnoCoord( 0,   D-1, 0)
UnoBaseCoords = [p0, p1, p2, p3, p0]

### DM2_w23
### hu_02 

def setUp_hu_02( anzahl=64, rotateCub=1 ):
    rCircle = random.uniform(4,12)
    aCube   = random.uniform(4,12)
    mCube   = [0,0,random.uniform(4,12)]
    mCircle = [ 0, 0, 0]
    anz = anzahl
    anz -= anz%4
    vecRadial = [-rCircle*.5,-rCircle*.5,0]
    coordsCir = []
    dAng = 360.0/anz
    #print anz, dAng, dAng*anz
    for i in range(anz):
        #vec = rs.VectorRotate(vecRadial, random.uniform(0,360), [0,0,1] )
        vec = rs.VectorRotate(vecRadial, dAng*i, [0,0,1] )
        coordsCir.append( vec)
    movCube   = random.choice(coordsCir)
    #rs.AddLine(mCircle, mCube)
    coordsCub = []
    dA = aCube/(anz/4)
    
    for i in range( int(anz/4)+1 ):
        vec = [mCube[0]-aCube*0.5 + dA*i, mCube[1]-aCube*0.5, mCube[2]]
        coordsCub.append( vec)
    for vec in coordsCub[0:int(anz/4)]:
        #vec= rs.VectorRotate(vec, 90, [0,0,1] )
        vec= rs.VectorAdd(rs.VectorRotate(vec, 90, [0,0,1] ),[0,dA, 0])
        coordsCub.append( vec)
    for vec in coordsCub[1:int(anz/2)]:
        vec= rs.VectorRotate(vec, 180, [0,0,1] )
        coordsCub.append( vec)
    rota = 0
    if rotateCub:
        rota = random.randint(-60,60)
        for i,vec in enumerate(coordsCub):
            coordsCub[i] = rs.VectorRotate(vec, rota, [0,0,1])
    
    movCube = rs.VectorSubtract(random.choice(coordsCir), random.choice(coordsCub))
    movCube = rs.VectorSubtract(coordsCir[0], coordsCub[0])
    movCube[2] = 0

    for i,vec in enumerate(coordsCub):
        pass
        coordsCub[i] = rs.VectorAdd(vec, movCube)
    
    print "*** *********** *********** ***"
    print "*** setUp_hu_02("+str(anzahl)+") returned 2 arrays with", anz, "pointCoords each"
    print "*** coordsCub are rotated "+str(rota)+".0Â°"
    print "*** *********** *********** ***"
    #print "\nallCoords=dm.setUp_hu_02("+str(anzahl)+")"
    #print "coordsCir=allCoords[0]"
    #print "coordsCub=allCoords[1]"
    return[coordsCir, coordsCub]


##################
depthVec  = dVec = rs.VectorUnitize(rs.VectorSubtract( getUnoCoord(0, 1, 0), getUnoCoord(0, 0, 0) ))
lengthVec = lVec = rs.VectorUnitize(rs.VectorSubtract( getUnoCoord(1, 0, 0), getUnoCoord(0, 0, 0) ))
##################
def getUNpanelCoords( anzL=10, anzH=39, anzD=3, stepL=1, stepH=4, stepD=1):
    frontPanels = []
    sidePanels = []
    backPanels = []
    upSidePanels = []
    allPanels = []
    lenL = rs.Distance( getUnoCoord(0, 0, 0), getUnoCoord(10, 0, 0) )
    lenD = rs.Distance( getUnoCoord(0, 0, 0), getUnoCoord(0, 3, 0) )
    lenH = rs.Distance( getUnoCoord(0, 0, 0), getUnoCoord(0, 0, 39) )

    anzY = int(anzL/stepL)
    anzZ = int(anzH/stepH)
    anzX = int(anzD/stepD)
    deltaL = lenL/(anzY)
    deltaH = lenH/(anzZ)
    deltaD = lenD/(anzX)
    for z in range(anzZ+0):
        for y in range(anzY+0):
            pass
            p0 = rs.VectorAdd(rs.VectorAdd(getUnoCoord(0, 0, 0), rs.VectorScale(lVec, deltaL*y)), [0,0,deltaH*z] )
            p1 = rs.VectorAdd(rs.VectorAdd(getUnoCoord(0, 0, 0), rs.VectorScale(lVec, deltaL*(y+1))), [0,0,deltaH*z] )
            p2 = rs.VectorAdd(rs.VectorAdd(getUnoCoord(0, 0, 0), rs.VectorScale(lVec, deltaL*(y+1))), [0,0,deltaH*(z+1)] )
            p3 = rs.VectorAdd(rs.VectorAdd(getUnoCoord(0, 0, 0), rs.VectorScale(lVec, deltaL*(y+0))), [0,0,deltaH*(z+1)] )
            coords = [p0, p1, p2, p3]
            coords = [p0, p3, p2, p1]
            frontPanels.append( coords )
            allPanels.append( coords )
    for z in range(anzZ+0):
        for x in range(anzX+0):
            pass
            p0 = rs.VectorAdd(rs.VectorAdd(getUnoCoord(0, 0, 0), rs.VectorScale(dVec, deltaD*x)), [0,0,deltaH*z] )
            p1 = rs.VectorAdd(rs.VectorAdd(getUnoCoord(0, 0, 0), rs.VectorScale(dVec, deltaD*(x+1))), [0,0,deltaH*z] )
            p2 = rs.VectorAdd(rs.VectorAdd(getUnoCoord(0, 0, 0), rs.VectorScale(dVec, deltaD*(x+1))), [0,0,deltaH*(z+1)] )
            p3 = rs.VectorAdd(rs.VectorAdd(getUnoCoord(0, 0, 0), rs.VectorScale(dVec, deltaD*(x+0))), [0,0,deltaH*(z+1)] )
            coords = [p1, p2, p3, p0]
            sidePanels.append( coords )
            allPanels.append( coords )

    for panel in frontPanels:
        coords = [ rs.VectorAdd(rs.VectorSubtract( getUnoCoord(0, 3, 0), getUnoCoord(0, 0, 0) ), cor) for cor in panel ]
        #coords = reversed([ rs.VectorAdd(rs.VectorSubtract( getUnoCoord(0, 3, 0), getUnoCoord(0, 0, 0) ), cor) for cor in panel ])
        coords.reverse()
        backPanels.append(coords)
        allPanels.append( coords )
    for panel in sidePanels:
        coords = [ rs.VectorAdd(rs.VectorSubtract( getUnoCoord(10, 0, 0), getUnoCoord(0, 0, 0) ), cor) for cor in panel ]
        coords.reverse()
        upSidePanels.append(coords)
        allPanels.append( coords )
    
    #allPanels.extend(backPanels)
    #allPanels.extend(upSidePanels)

#    print "    ### ################ DM2_w23 / hu_06 / UN_panelling"
#    print "    ### getUNpanelCoords( anzL="+str(anzL)+",anzH="+str(anzH)+",anzD="+str(anzD)+",stepL="+str(stepL)+",stepH="+str(stepH)+",stepD="+str(stepD)+") ..",len(allPanels), "panelCoordLists generated:"
#    print "    ### allPanels = [frontPanels, backPanels, sidePanels, upSidePanels, allPanels]"
#    print "    ### ##########################################################################"
    return [frontPanels, backPanels, sidePanels, upSidePanels, allPanels]

UnoPanelCoords = getUNpanelCoords( anzL=10, anzH=39, anzD=3, stepL=1, stepH=4, stepD=1)

schlafTage = date2number(2022,12,24) - dayNumber2day
print "    btw : "+str(schlafTage)+" tage sinds noch bis weihnachten - dh, eh noch",schlafTage*4, "stunden schlaf :)"
#setSun(verbose=1)
sun = sc.doc.Lights.Sun
sun.Enabled = 0
print "    distList = sorted( [ [pair, rs.Distance(pair[0],pair[1])] for pair in combinate( coords, 2) ], key=lambda sortKey: (sortKey[1]) )"
### dm2_w23 hu_02
### allCoords = setUp_hu_02( anzahl=32*6, rotateCub=1  )

###############
### sydda STENO
normalCarCoords = [[[0.0, 0.0, 0.0], [-0.10151640138928997, 0.079258391348275836, 0.0], [-0.20879876881190285, 0.15047235049473784, 0.0], [-0.32375545130707906, 0.20831513427197024, 0.0], [-0.44793432165533886, 0.24093253547880522, 0.0], [-0.574335019785849, 0.22437127843750204, 0.0], [-0.67555680133000351, 0.14680523302695292, 0.0], [-0.74195009260529332, 0.036852829590088731, 0.0], [-0.78661568515917679, -0.08386516444852532, 0.0], [-0.81599498468585807, -0.20920799234386322, 0.0], [-0.83088474385658628, -0.33708981011977812, 0.0], [-0.831097522212076, -0.46582934558909983, 0.0], [-0.81517647754571954, -0.59355483857848412, 0.0], [-0.77956796680382467, -0.71716458426953977, 0.0], [-0.7189658782076549, -0.83049213555818824, 0.0], [-0.63087234485237786, -0.92381804569322412, 0.0], [-0.51665300946933712, -0.98145603864963959, 0.0], [-0.38943847833888867, -0.97993659553321777, 0.0], [-0.27751010643351037, -0.91803675668666074, 0.0], [-0.19120591479895666, -0.8228986997728498, 0.0], [-0.12790720161274294, -0.71093618801137382, 0.0], [-0.082881502461532364, -0.59033490341244033, 0.0], [-0.049332215478898434, -0.4659914496824058, 0.0], [-0.020750991703607724, -0.34038973548967988, 0.0], [0.010574589111001842, -0.21546916753959522, 0.0], [0.047700851959689317, -0.24424120554226647, 0.0], [0.051811371918574878, -0.37298342836652409, 0.0], [0.054600386568836257, -0.50176681462517081, 0.0], [0.05904857930727303, -0.63050110593735553, 0.0], [0.068183815128577407, -0.75897348938428877, 0.0], [0.092775232132225938, -0.88510351626109696, 0.0], [0.19140315946378905, -0.93963962022871783, 0.0], [0.30144599852883402, -0.87376905261658067, 0.0]], [[0.0, 0.0, 0.0], [0.10089684261811271, 0.071132385248802166, 0.0], [0.21017432616008591, 0.12844418046870487, 0.0], [0.32790111061603966, 0.16502411631699943, 0.0], [0.45082909276197825, 0.17094650939884559, 0.0], [0.56884998714031099, 0.13684053951647002, 0.0], [0.66669222978180187, 0.062598593826351134, 0.0], [0.73437344009698791, -0.040162647073202606, 0.0], [0.77395691149649792, -0.15691706783672998, 0.0], [0.79189189987710051, -0.27899901768364543, 0.0], [0.79262719550342808, -0.4024208080813878, 0.0], [0.7732895187655231, -0.52419641773758485, 0.0], [0.72448523560160538, -0.63717329630162567, 0.0], [0.64338267365656066, -0.72965627580265391, 0.0], [0.53578406778660792, -0.78841617463672264, 0.0], [0.41337668251026116, -0.79695979589268973, 0.0], [0.29382917486827864, -0.767079992042909, 0.0], [0.1815514318386704, -0.71584415506458754, 0.0], [0.075615683158503089, -0.65241322010115255, 0.0], [0.0, -0.63153675020294031, 0.0], [0.0, -0.73643350454403844, 0.0], [0.0, -0.61291884089905579, 0.0], [0.0, -0.48940417725407315, 0.0], [-4.5474735088646412e-13, -0.3658895136090905, 0.0], [0.0, -0.24237484996410785, 0.0], [0.0, -0.11886018631912521, 0.0], [0.0, 0.0046544773258574423, 0.0], [0.0, 0.12816914097061272, 0.0], [0.0, 0.25168380461559536, 0.0], [0.0, 0.37519846826080538, 0.0], [0.0, 0.49871313190533328, 0.0], [0.0, 0.62222779555054331, 0.0], [0.0, 0.74574245919552595, 0.0]], [[0.0, 0.0, 0.0], [-0.01232481500483118, -0.062509994510946854, 0.0], [-0.033031352002581116, -0.12273059463882419, 0.0], [-0.064615115369633713, -0.17795965771961164, 0.0], [-0.10861764394621787, -0.22383132594745803, 0.0], [-0.16269025660494663, -0.25727857592005421, 0.0], [-0.22334266230427602, -0.27640427622714014, 0.0], [-0.28675135054891143, -0.28190525897048246, 0.0], [-0.35009430920626983, -0.27563395180663974, 0.0], [-0.41070593402764644, -0.25632693643774473, 0.0], [-0.46520038447260958, -0.22353045581758124, 0.0], [-0.51108939619962257, -0.17944617625403225, 0.0], [-0.54629365624941784, -0.12646548309817263, 0.0], [-0.57041185775051417, -0.067536760899429282, 0.0], [-0.58581867053180758, -0.0057183988774340833, 0.0], [-0.59465742362226592, 0.057393080756128256, 0.0], [-0.59851283023726864, 0.12101283445144873, 0.0], [-0.59843897896098497, 0.18475276694971399, 0.0], [-0.59422088819610508, 0.24834766516391937, 0.0], [-0.58467846115172506, 0.31135354283946981, 0.0], [-0.56817868893494961, 0.37288438529571977, 0.0], [-0.54262866781982666, 0.43120064402069147, 0.0], [-0.50597733438735304, 0.4831927050208833, 0.0], [-0.45913704178292392, 0.52627209277966358, 0.0], [-0.4041574944048989, 0.55827188885064061, 0.0], [-0.34345655994047775, 0.57733970598724227, 0.0], [-0.28014347823545904, 0.58398579449567478, 0.0], [-0.2167600541538377, 0.57852361338041192, 0.0], [-0.15670314095586946, 0.5577212360874455, 0.0], [-0.10441316231072051, 0.52158802579583607, 0.0], [-0.063476162439656036, 0.47295178101035162, 0.0], [-0.034670855515742005, 0.4162010671805092, 0.0], [-0.01595744680844291, 0.35531914893613248, 0.0]], [[0.0, 0.0, 0.0], [-0.14110925993009005, 0.094687936724312749, 0.0], [-0.29832704651789754, 0.15846638438438276, 0.0], [-0.46700710511549914, 0.16887027426537315, 0.0], [-0.62211686193313653, 0.10352643653777704, 0.0], [-0.72823693118698429, -0.027596656904734118, 0.0], [-0.78055860572249003, -0.18886342297787451, 0.0], [-0.79425276859001315, -0.35817397413120489, 0.0], [-0.77266994577803416, -0.52643966531286424, 0.0], [-0.69588937773596626, -0.67684378991543781, 0.0], [-0.56221690257552837, -0.7793111653552387, 0.0], [-0.39491516342513933, -0.79440311097459926, 0.0], [-0.2336380133201601, -0.74194103341551454, 0.0], [-0.085382430815116095, -0.65877789547107568, 0.0], [0.0, -0.66648808377431124, 0.0], [0.0, -0.65487326727225081, 0.0], [0.0, -0.48474969992776096, 0.0], [4.5474735088646412e-13, -0.31462613258304373, 0.0], [0.0, -0.1445025652383265, 0.0], [0.0, 0.025621002106390733, 0.0], [0.0, 0.19574456945110796, 0.0], [0.0, 0.36586813679559782, 0.0], [0.0, 0.53599170414031505, 0.0], [0.0, 0.70611527148480491, 0.0], [0.0, 0.61524607956152977, 0.0], [4.5474735088646412e-13, 0.44512251221681254, 0.0], [0.0, 0.27499894487255006, 0.0], [0.0, 0.10487537752760545, 0.0], [0.0, -0.065248189816884405, 0.0], [0.0, -0.23537175716160164, 0.0], [0.0, -0.40549532450631887, 0.0], [0.0, -0.57561889185080872, 0.0], [0.0, -0.74574245919552595, 0.0]], [[0.0, 0.0, 0.0], [0.10014276724905358, 0.0047744655742008035, 0.0], [0.20021479785327756, 0.010848745990642783, 0.0], [0.30017292294678555, 0.018566458248187701, 0.0], [0.39993880444353636, 0.02845137758617966, 0.0], [0.49935413267439799, 0.041372002385742235, 0.0], [0.59804043356598413, 0.058963254595255421, 0.0], [0.69478052761405706, 0.085039066008221198, 0.0], [0.78176232816258562, 0.13316271111352762, 0.0], [0.78380773174922069, 0.22483244358181764, 0.0], [0.71005904765615924, 0.29150447251959122, 0.0], [0.61905282655834526, 0.33312598736506516, 0.0], [0.52214608548183605, 0.35847587314242446, 0.0], [0.422675076762971, 0.37043354888919566, 0.0], [0.3224995625550946, 0.36935920445125703, 0.0], [0.2236461312031679, 0.35337507699114212, 0.0], [0.13032328964891349, 0.31748202983408191, 0.0], [0.053947857282764744, 0.25361327000496203, 0.0], [0.0094753330204184749, 0.16445189376759117, 0.0], [-0.0039610595745216415, 0.065409587133672176, 0.0], [0.0053207936030048586, -0.03426481516999047, 0.0], [0.031170800353720551, -0.13103012832152672, 0.0], [0.072136219367166632, -0.22240469463508816, 0.0], [0.12870646513192696, -0.30499783255754664, 0.0], [0.20013448799909384, -0.37511703173618116, 0.0], [0.28385538506699959, -0.42999523103890169, 0.0], [0.37614472101267893, -0.46885015947395914, 0.0], [0.47359771861692934, -0.49190053178836024, 0.0], [0.57354761892793249, -0.49749422847071401, 0.0], [0.67236235600512373, -0.4819808425879728, 0.0], [0.76369328044211215, -0.44146439039764118, 0.0], [0.83909108053467207, -0.37596015991903187, 0.0], [0.89321146755082736, -0.29189977301984982, 0.0]], [[0.0, 0.0, 0.0], [-0.0020669938903665752, 0.1183879871375666, 0.0], [-0.0041339877811878978, 0.23677597427490582, 0.0], [-0.0062009816710997256, 0.35516396141247242, 0.0], [-0.0082679755614663009, 0.47355194855003901, 0.0], [-0.010334969451832876, 0.59193993568737824, 0.0], [-0.012401963342199451, 0.71032792282471746, 0.0], [-0.014468957232566027, 0.82871590996205668, 0.0], [-0.016535951122932602, 0.94710389709985066, 0.0], [-0.018602945013299177, 1.0654918842371899, 0.0], [-0.020669938903665752, 1.1838798713745291, 0.0], [-0.033803190613980405, 1.2910067029163201, 0.0], [-0.15220922070693632, 1.2910067029163201, 0.0], [-0.27061525079898274, 1.2910067029163201, 0.0], [-0.38902128089102916, 1.2910067029163201, 0.0], [-0.36201538837212865, 1.2910067029163201, 0.0], [-0.24360935828008223, 1.2910067029163201, 0.0], [-0.12520332818712632, 1.2910067029163201, 0.0], [-0.0067972980950798956, 1.2910067029163201, 0.0], [0.11160873199651178, 1.2910067029163201, 0.0], [0.2300147620885582, 1.2910067029163201, 0.0], [0.34842079218105937, 1.2910067029163201, 0.0], [0.31245460204445408, 1.2910067029163201, 0.0], [0.19404857195240766, 1.2910067029163201, 0.0], [0.075642541860361234, 1.2910067029163201, 0.0], [-0.022893351182574406, 1.3112267907406476, 0.0], [-0.02479614294725252, 1.4296162112116235, 0.0], [-0.02479614294725252, 1.5480222413034426, 0.0], [-0.017906576551467879, 1.6660720096290333, 0.0], [0.027933540649428323, 1.7733185198480896, 0.0], [0.13394007592160051, 1.8215020240716058, 0.0], [0.25204249939588408, 1.8255501136893599, 0.0], [0.36953549191366619, 1.8114609476433543, 0.0]], [[0.0, 0.0, 0.0], [-0.10962282577838778, 0.091136944029813094, 0.0], [-0.2378367973146851, 0.15277357102786482, 0.0], [-0.37902507768831128, 0.1666834262912289, 0.0], [-0.51472864596507861, 0.12512106356848562, 0.0], [-0.62770871371139947, 0.038941692961543595, 0.0], [-0.69906320786503784, -0.083484989584576397, 0.0], [-0.72203365311315792, -0.22395583387879014, 0.0], [-0.71800999404740651, -0.36656026771402139, 0.0], [-0.68680783712125049, -0.50551213969401942, 0.0], [-0.60962602722793235, -0.62404506833559026, 0.0], [-0.48608717050592531, -0.69336503923636883, 0.0], [-0.34521292620547683, -0.71214370851794229, 0.0], [-0.20590483135674731, -0.68403671459623183, 0.0], [-0.085836016235589341, -0.6084848073367084, 0.0], [-0.008053808283420949, -0.49008142680327182, 0.0], [0.027988104354790266, -0.35220034869485062, 0.0], [0.045191243345470866, -0.21047743137546604, 0.0], [0.060170383298554952, -0.068500483353773234, 0.0], [0.064084024922976823, -0.20232889486646854, 0.0], [0.061370359735974489, -0.34509205700283019, 0.0], [0.056536054588377738, -0.48779923881693321, 0.0], [0.049372720787232538, -0.63040786429769469, 0.0], [0.039180034736091329, -0.77283020924278389, 0.0], [0.024392057085606211, -0.91484237491317799, 0.0], [0.0007790649638081959, -1.0556165405307638, 0.0], [-0.043760588283930701, -1.1909283215854884, 0.0], [-0.13883418073692155, -1.2940566249721996, 0.0], [-0.27763664851909198, -1.321287885469701, 0.0], [-0.41686847950359152, -1.2937053573059529, 0.0], [-0.53482513151220701, -1.2148847195774124, 0.0], [-0.61831598716935332, -1.0997325502833064, 0.0], [-0.6705159702819401, -0.96709034175319175, 0.0]], [[0.0, 0.0, 0.0], [0.0, -0.10152102018219011, 0.0], [0.0, -0.20304204036438023, 0.0], [0.0, -0.30456306054634297, 0.0], [0.0, -0.40608408072830571, 0.0], [0.0, -0.50760510091049582, 0.0], [0.0, -0.60912612109291331, 0.0], [0.0, -0.71064714127487605, 0.0], [0.0, -0.81216816145706616, 0.0], [0.0, -0.91368918163925628, 0.0], [0.0, -1.015210201821219, 0.0], [0.0, -1.1167312220031818, 0.0], [0.0, -1.2182522421853719, 0.0], [0.0, -1.319773262367562, 0.0], [0.0, -1.4212942825497521, 0.0], [0.0, -1.5228153027317148, 0.0], [0.00053096154942977591, -1.4948155432655312, 0.0], [0.0037749789439658343, -1.3933505936461188, 0.0], [0.010663083256531536, -1.2920705742571954, 0.0], [0.022372787384028925, -1.1912403270969207, 0.0], [0.040846549509296892, -1.0914428735179627, 0.0], [0.069638557098187448, -0.99416915692745533, 0.0], [0.11607171492414636, -0.90421499855779075, 0.0], [0.19341323101298258, -0.84073233068397712, 0.0], [0.29291495735787976, -0.84144662615017296, 0.0], [0.38050123553739468, -0.89170300117780243, 0.0], [0.44781024678604808, -0.96717409676580246, 0.0], [0.49271253146798699, -1.0579855283169763, 0.0], [0.52058786233010323, -1.1555173672022647, 0.0], [0.53736876546872736, -1.2556086835888891, 0.0], [0.5469533575846981, -1.35666218967026, 0.0], [0.55169578518643902, -1.4580657938267905, 0.0], [0.55304839164000441, -1.5595744680849748, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.035305851063867522, 0.0], [0.0, 0.07061170212750767, 0.0], [0.0, 0.10591755319160256, 0.0], [0.0, 0.14122340425524271, 0.0], [0.0, 0.17652925531911023, 0.0], [0.0, 0.21183510638297776, 0.0], [0.0, 0.24714095744684528, 0.0], [0.0, 0.2824468085107128, 0.0], [0.0, 0.31775265957435295, 0.0], [0.0, 0.35305851063844784, 0.0], [0.0, 0.38836436170231536, 0.0], [0.0, 0.42367021276595551, 0.0], [0.0, 0.45897606382982303, 0.0], [0.0, 0.49428191489346318, 0.0], [0.0, 0.52958776595755808, 0.0], [0.0, 0.56489361702119822, 0.0], [0.0, 0.60019946808506575, 0.0], [0.0, 0.63550531914893327, 0.0], [0.0, 0.67081117021302816, 0.0], [0.0, 0.70611702127666831, 0.0], [0.0, 0.74142287234030846, 0.0], [0.0, 0.77672872340440335, 0.0], [0.0, 0.8120345744680435, 0.0], [0.0, 0.84734042553191102, 0.0], [0.0, 0.88264627659577855, 0.0], [0.0, 0.91795212765941869, 0.0], [0.0, 0.95325797872351359, 0.0], [0.0, 0.98856382978738111, 0.0], [0.0, 1.0238696808510213, 0.0], [0.0, 1.0591755319151162, 0.0], [0.0, 1.0944813829787563, 0.0], [0.0, 1.1297872340426238, 0.0]], [[0.0, 0.0, 0.0], [0.058169110427570558, -0.012845607461258624, 0.0], [0.1173898563538387, -0.01930871063586892, 0.0], [0.17695826119779667, -0.019425650238417802, 0.0], [0.23591323716982515, -0.011165022513750955, 0.0], [0.29206688298063455, 0.0084270465069948841, 0.0], [0.34149970187399958, 0.041388400281221038, 0.0], [0.38006565229898115, 0.086591945985446728, 0.0], [0.40538096820364444, 0.14037192665978182, 0.0], [0.42016365069184758, 0.19806137940577173, 0.0], [0.42858278248559145, 0.25704605106739109, 0.0], [0.43280445900018094, 0.31648849754651565, 0.0], [0.43404246746285935, 0.37607174042909719, 0.0], [0.43404255319182994, 0.4356724168353594, 0.0], [0.43404255319182994, 0.49527308470624121, 0.0], [0.43404255319182994, 0.55487375257712301, 0.0], [0.43404255319182994, 0.61447442044800482, 0.0], [0.43404255319182994, 0.674075088319114, 0.0], [0.43404255319182994, 0.73367575618976844, 0.0], [0.43404255319182994, 0.79327642406087762, 0.0], [0.43404255319182994, 0.85287709193153205, 0.0], [0.43404255319182994, 0.91247775980264123, 0.0], [0.43404255319182994, 0.97207842767375041, 0.0], [0.43404255319182994, 1.0316790955444048, 0.0], [0.43404255319182994, 1.091279763415514, 0.0], [0.43404255319182994, 1.1508804312863958, 0.0], [0.43404255319182994, 1.2104810991572776, 0.0], [0.43404255319182994, 1.2700817670283868, 0.0], [0.43404255319182994, 1.3296824348992686, 0.0], [0.43404255319182994, 1.3892831027701504, 0.0], [0.43404255319182994, 1.4488837706412596, 0.0], [0.43404255319182994, 1.5084844385121414, 0.0], [0.43404255319182994, 1.5680851063830232, 0.0]], [[0.0, 0.0, 0.0], [0.0, -0.12628346855512973, 0.0], [0.0, -0.25256693711025946, 0.0], [0.0, -0.37885040566538919, 0.0], [0.0, -0.50513387422074629, 0.0], [0.0, -0.63141734277587602, 0.0], [0.0, -0.75770081133100575, 0.0], [0.0, -0.88398427988636286, 0.0], [0.0, -1.0102677484412652, 0.0], [0.0, -1.1365512169966223, 0.0], [0.0, -1.2628346855515247, 0.0], [0.0, -1.3891181541068818, 0.0], [0.0, -1.5154016226620115, 0.0], [0.0, -1.4774638449530357, 0.0], [0.0, -1.3511803763974513, 0.0], [0.0, -1.2248969078425489, 0.0], [0.0, -1.0986134392876465, 0.0], [0.0, -0.97232997073228944, 0.0], [0.026213731331608869, -0.8529888928821947, 0.0], [0.097643769886417431, -0.74897485555402454, 0.0], [0.1884098734494728, -0.66180366883031638, 0.0], [0.30637689065088125, -0.62296982403790935, 0.0], [0.4209998399246615, -0.66952739132057104, 0.0], [0.49428647450804419, -0.77116920886123808, 0.0], [0.51697030377090414, -0.89387605837373485, 0.0], [0.45818795128661804, -1.0022488678564514, 0.0], [0.35021321629710656, -1.0667862850818892, 0.0], [0.23082227976010472, -1.1075815692740889, 0.0], [0.11093357552408634, -1.1438562977507445, 0.0], [0.15196108722147983, -1.2534381905434202, 0.0], [0.23810061512313041, -1.3457188722006777, 0.0], [0.32947651507720366, -1.4328758447134078, 0.0], [0.42305891464775414, -1.517666116813416, 0.0]], [[0.0, 0.0, 0.0], [4.1090152080869302e-07, -0.054851717324936544, 0.0], [3.3957135201490019e-06, -0.10970343451299414, 0.0], [1.184963093692204e-05, -0.16455515104121332, 0.0], [2.90698171738768e-05, -0.21940686538209775, 0.0], [5.882249615751789e-05, -0.27425857857519986, 0.0], [0.00010542408244873513, -0.32911027671229931, 0.0], [0.00017384005377607537, -0.38396195182122028, 0.0], [0.0002698063185562205, -0.43881358538737913, 0.0], [0.00039997949534154031, -0.4936651480263663, 0.0], [0.00057212471392631414, -0.54851659437053968, 0.0], [0.00079535267650499009, -0.60336785566573781, 0.0], [0.0010804222920341999, -0.65821882901877871, 0.0], [0.0014401318976524635, -0.71306937626764011, 0.0], [0.0018898311559496506, -0.76791921873609681, 0.0], [0.0024481045311404159, -0.82276808803362655, 0.0], [0.0031376932688544912, -0.8776154583679272, 0.0], [0.0039867721561677172, -0.93246058332169923, 0.0], [0.0050307522565162799, -0.98730233132346257, 0.0], [0.0063148965828077053, -1.0421389463381274, 0.0], [0.0078982372342579765, -1.0969677348855384, 0.0], [0.0098596519114835246, -1.1517842459188614, 0.0], [0.012307737782975892, -1.206581076439079, 0.0], [0.015397747998122213, -1.2613452502380369, 0.0], [0.01936276353080757, -1.3160526621882127, 0.0], [0.024576546493335627, -1.370654272257525, 0.0], [0.031697321642695897, -1.4250373544223294, 0.0], [0.042062707223067264, -1.4788856346403918, 0.0], [0.05913125880761072, -1.5309234673877654, 0.0], [0.094888818206527503, -1.5706611157506813, 0.0], [0.14713648110409849, -1.5610620312008905, 0.0], [0.19104621015503653, -1.5283453490874308, 0.0], [0.23058099685795241, -1.490340589445168, 0.0]], [[0.0, 0.0, 0.0], [0.0, 0.22971510900333669, 0.0], [0.0, 0.45943021800667339, 0.0], [0.0, 0.68914532701001008, 0.0], [-0.037006357557856973, 0.91249298466209439, 0.0], [-0.24229164565349492, 0.98683901989352307, 0.0], [-0.43064500893251534, 0.86917688106564128, 0.0], [-0.47765957446790708, 0.64721907270882184, 0.0], [-0.47765957446790708, 0.41750396370571252, 0.0], [-0.47765957446790708, 0.18778885470214846, 0.0], [-0.47765957446790708, 0.041926254301188237, 0.0], [-0.47765957446790708, 0.27164136330429756, 0.0], [-0.47765957446790708, 0.50135647230786162, 0.0], [-0.47789845244415119, 0.73106247667828939, 0.0], [-0.53931999458382052, 0.94632550260917014, 0.0], [-0.75791761847312955, 0.97613515941452533, 0.0], [-0.92070164663346077, 0.82570591808166682, 0.0], [-0.95298978159462422, 0.59944410996445185, 0.0], [-0.95305294762647463, 0.36972913062436419, 0.0], [-0.95305294762647463, 0.1400140216210275, 0.0], [-0.95305294762647463, 0.088625658238470351, 0.0], [-0.95305294762647463, 0.31834076724180704, 0.0], [-0.95305294762647463, 0.54805587624514374, 0.0], [-0.95305294762647463, 0.77777098524848043, 0.0], [-0.95305294762647463, 1.0074860942518171, 0.0], [-0.95305294762647463, 1.0212978356855729, 0.0], [-0.95305294762647463, 0.79158272668246354, 0.0], [-0.95305294762647463, 0.56186761767912685, 0.0], [-0.95305294762647463, 0.33215250867556279, 0.0], [-0.95305294762647463, 0.10243739967222609, 0.0], [-0.95305294762647463, 0.12620228018727175, 0.0], [-0.95305294762647463, 0.35591738919060845, 0.0], [-0.95305294762647463, 0.58563249819394514, 0.0]], [[0.0, 0.0, 0.0], [0.0, -0.1069377987766984, 0.0], [4.5474735088646412e-13, -0.21387559755316943, 0.0], [0.0, -0.32081339632964045, 0.0], [-4.5474735088646412e-13, -0.42775119510588411, 0.0], [-4.5474735088646412e-13, -0.53468899388258251, 0.0], [0.0, -0.64162679265928091, 0.0], [0.0, -0.74856459143575194, 0.0], [0.0, -0.85550239021222296, 0.0], [0.0, -0.96244018898869399, 0.0], [0.0, -1.0693779877653924, 0.0], [0.0, -1.0832586815429295, 0.0], [-4.5474735088646412e-13, -0.97632088276645845, 0.0], [0.0, -0.86938308398976005, 0.0], [0.0, -0.76244528521328903, 0.0], [-4.5474735088646412e-13, -0.655507486436818, 0.0], [0.0, -0.54856968766034697, 0.0], [0.0026702927780206664, -0.44170078519164235, 0.0], [0.020495296580975264, -0.33643271644359629, 0.0], [0.067000064657349867, -0.24092387552445871, 0.0], [0.15071548755850017, -0.17549109174910882, 0.0], [0.25220447242963928, -0.14355880998118664, 0.0], [0.35863465547527085, -0.14605999872014763, 0.0], [0.45509609780674509, -0.18992513393732224, 0.0], [0.51581503788111149, -0.27605193346857959, 0.0], [0.53333039999279208, -0.38125832271407489, 0.0], [0.5351063829789382, -0.48816044138334291, 0.0], [0.5351063829789382, -0.59509824015981394, 0.0], [0.5351063829789382, -0.70203603893628497, 0.0], [0.5351063829789382, -0.80897383771298337, 0.0], [0.5351063829789382, -0.91591163648945439, 0.0], [0.5351063829789382, -1.0228494352659254, 0.0], [0.5351063829789382, -1.1297872340423964, 0.0]], [[0.0, 0.0, 0.0], [0.0032602426435914822, -0.076787928134081085, 0.0], [0.014425888538880827, -0.15280897399588866, 0.0], [0.036116539527938585, -0.22647886479285262, 0.0], [0.071361530743615731, -0.29463341764767392, 0.0], [0.12159040399592413, -0.35260410179125756, 0.0], [0.18393828000171197, -0.39724577966967445, 0.0], [0.25565106556223327, -0.42434030886397522, 0.0], [0.33187843810901541, -0.43297713688866679, 0.0], [0.40814020507514215, -0.4246852734438562, 0.0], [0.47990545884840685, -0.39773980884433513, 0.0], [0.54229415513054846, -0.35315575511503994, 0.0], [0.59260836914654647, -0.29525805836806285, 0.0], [0.62789105656247557, -0.22712339990835062, 0.0], [0.64969972733069881, -0.15348626752825112, 0.0], [0.66115306677693297, -0.077506284562105066, 0.0], [0.66486913669268688, -0.00073791799832179095, 0.0], [0.66202603001420357, 0.076064119783723072, 0.0], [0.6509110219581089, 0.15208856775598179, 0.0], [0.62891038118232245, 0.22566162843804705, 0.0], [0.59321204752541234, 0.29358022162432462, 0.0], [0.54281256759941243, 0.35141437748939097, 0.0], [0.4805221070710104, 0.39614368413208467, 0.0], [0.40886703147953085, 0.42338280204967305, 0.0], [0.33263485765291989, 0.43191473956153459, 0.0], [0.25638154026046323, 0.42348915391312403, 0.0], [0.18455686039578723, 0.39668814841115818, 0.0], [0.12201319029372826, 0.35232207287799611, 0.0], [0.071569415642443346, 0.29454038579183361, 0.0], [0.036188310558827652, 0.22645912882171615, 0.0], [0.014442545542351581, 0.15280643730898191, 0.0], [0.0032618713830743218, 0.076787843311876713, 0.0]], [[0.0, 0.0, 0.0], [0.10542661442832468, 0.0010494254149762128, 0.0], [0.21078684447138585, 0.0048640815821272554, 0.0], [0.3158902215618582, 0.013047843649019342, 0.0], [0.42009476386056122, 0.028824572802477633, 0.0], [0.52083455801039236, 0.059314673901781134, 0.0], [0.60851963372078899, 0.11680568015231074, 0.0], [0.67077804036580346, 0.2012680838106462, 0.0], [0.70130173921961614, 0.30167078965996552, 0.0], [0.69912437333414346, 0.40670816161969015, 0.0], [0.6697965180128449, 0.50773195632245915, 0.0], [0.61537096559140991, 0.59753713243685525, 0.0], [0.53432722393699805, 0.66414787425333088, 0.0], [0.43651588318653012, 0.70263930050828094, 0.0], [0.33242627152367277, 0.71849343937014964, 0.0], [0.22705729970630273, 0.71872851046373398, 0.0], [0.12217900727000597, 0.708235453640782, 0.0], [0.018337563066324947, 0.69008127984761813, 0.0], [0.0, 0.59952022921629577, 0.0], [0.0, 0.49408641657055341, 0.0], [0.0, 0.38865260392458367, 0.0], [0.0, 0.28321879127884131, 0.0], [0.0, 0.1777849786326442, 0.0], [0.0, 0.072351165987129207, 0.0], [0.0, -0.033082646659067905, 0.0], [0.0, -0.13851645930481027, 0.0], [0.0, -0.24395027195055263, 0.0], [0.0, -0.34938408459652237, 0.0], [0.0, -0.45481789724249211, 0.0], [0.0, -0.56025170988846185, 0.0], [0.0, -0.66568552253443158, 0.0], [0.0, -0.77111933518017395, 0.0], [0.0, -0.87655314782614369, 0.0]], [[0.0, 0.0, 0.0], [-0.081546212225021009, 0.040254112467664527, 0.0], [-0.17007582246333186, 0.060531204897870339, 0.0], [-0.26021250041776511, 0.052382839427536965, 0.0], [-0.33895801228027267, 0.0080195161885967536, 0.0], [-0.39712053082848797, -0.061819569139970554, 0.0], [-0.44148936170222441, -0.14049514112798533, 0.0], [-0.44148936170222441, -0.23158687418572299, 0.0], [-0.44148936170222441, -0.32267860724368802, 0.0], [-0.44148936170222441, -0.41377034030165305, 0.0], [-0.44148936170222441, -0.50486207335916333, 0.0], [-0.44148936170222441, -0.59595380641690099, 0.0], [-0.44148936170222441, -0.68704553947463864, 0.0], [-0.44148936170222441, -0.77813727253260367, 0.0], [-0.44148936170222441, -0.86922900559034133, 0.0], [-0.44148936170222441, -0.96032073864807899, 0.0], [-0.44148936170222441, -1.0514124717058166, 0.0], [-0.44148936170222441, -1.1425042047637817, 0.0], [-0.44148936170222441, -1.1064342561974172, 0.0], [-0.44148936170222441, -1.0153425231396795, 0.0], [-0.44148936170222441, -0.92425079008194189, 0.0], [-0.44148936170222441, -0.83315905702420423, 0.0], [-0.44148936170222441, -0.7420673239662392, 0.0], [-0.44148936170222441, -0.65097559090850154, 0.0], [-0.44148936170222441, -0.55988385785076389, 0.0], [-0.44148936170222441, -0.46879212479279886, 0.0], [-0.44148936170222441, -0.3777003917350612, 0.0], [-0.44148936170222441, -0.28660865867709617, 0.0], [-0.44148936170222441, -0.19551692561935852, 0.0], [-0.44148936170222441, -0.10442519256184823, 0.0], [-0.44148936170222441, -0.013333459503883205, 0.0], [-0.46335032874776516, 0.069768493132187359, 0.0], [-0.54906739839043439, 0.094690898138651391, 0.0]], [[0.0, 0.0, 0.0], [-0.045498404045702046, 0.067860035687999698, 0.0], [-0.10144004923313332, 0.1272567106580027, 0.0], [-0.1723479812117148, 0.16674499622445182, 0.0], [-0.25295006713986368, 0.16587809648035545, 0.0], [-0.32402330874947438, 0.1264974614532548, 0.0], [-0.38158362533977197, 0.068634626356470108, 0.0], [-0.42942171749564295, 0.0024151131922280911, 0.0], [-0.46423184006062002, -0.071315934033918893, 0.0], [-0.47067324502768315, -0.15203677425483875, 0.0], [-0.43720491958174534, -0.22579150002866299, 0.0], [-0.38028208819423526, -0.28422389255911185, 0.0], [-0.31457437190783821, -0.33279496370209927, 0.0], [-0.24500561944250876, -0.37570996623071551, 0.0], [-0.1735598311583999, -0.41544094573691837, 0.0], [-0.10163706582397936, -0.45430742817575265, 0.0], [-0.031562912940898968, -0.49636903718101166, 0.0], [0.031805572153189132, -0.54779088337249959, 0.0], [0.078382385627719486, -0.61449833193273662, 0.0], [0.10083282188725207, -0.69275948904601137, 0.0], [0.098409826492570573, -0.77414788141891222, 0.0], [0.069657346491112548, -0.85020607232172551, 0.0], [0.01346372134912599, -0.90869426565177491, 0.0], [-0.06133082291125902, -0.94066397132405655, 0.0], [-0.14229818683270423, -0.95073347786069462, 0.0], [-0.22386784186937803, -0.94645734736354825, 0.0], [-0.30399443727128528, -0.93059594128067147, 0.0], [-0.38078766006674414, -0.90280577390717553, 0.0], [-0.45188977751649873, -0.86266535935692445, 0.0], [-0.51473561563034309, -0.81055313855972599, 0.0], [-0.56725935977556219, -0.74804267897366117, 0.0], [-0.60856920840706152, -0.67759458754267143, 0.0], [-0.63902550862258067, -0.60179499522928381, 0.0]], [[0.0, 0.0, 0.0], [-0.068397286985145911, -0.0070577700168996671, 0.0], [-0.13636010758955308, 0.0001689115701992705, 0.0], [-0.18376850828008173, 0.047053013425511381, 0.0], [-0.19204491850950944, 0.11513843516831912, 0.0], [-0.19255319148942363, 0.18391845230007675, 0.0], [-0.19255319148942363, 0.25270380195479447, 0.0], [-0.19255319148942363, 0.32148915160973957, 0.0], [-0.19255319148942363, 0.39027450126468466, 0.0], [-0.19255319148942363, 0.45905985091940238, 0.0], [-0.19255319148942363, 0.5278452005741201, 0.0], [-0.19255319148942363, 0.59663055022883782, 0.0], [-0.19255319148942363, 0.66541589988378291, 0.0], [-0.19255319148942363, 0.73420124953872801, 0.0], [-0.19255319148942363, 0.80298659919344573, 0.0], [-0.25475067225261228, 0.80957446808520217, 0.0], [-0.32353602190733, 0.80957446808520217, 0.0], [-0.39232137156204772, 0.80957446808520217, 0.0], [-0.33749825059157956, 0.80957446808520217, 0.0], [-0.26871290093731659, 0.80957446808520217, 0.0], [-0.19992755128259887, 0.80957446808520217, 0.0], [-0.13114220162788115, 0.80957446808520217, 0.0], [-0.062356851972708682, 0.80957446808520217, 0.0], [0.0064284976815542905, 0.80957446808520217, 0.0], [-0.036958947090170113, 0.80957446808520217, 0.0], [-0.10574429674579733, 0.80957446808520217, 0.0], [-0.1745296464000603, 0.80957446808520217, 0.0], [-0.19223607552430622, 0.86033528210782606, 0.0], [-0.19180636399732975, 0.92911928951593836, 0.0], [-0.19137665247080804, 0.99790329692427804, 0.0], [-0.19094694094428633, 1.0666873043323903, 0.0], [-0.19051722941776461, 1.1354713117409574, 0.0], [-0.19008751789078815, 1.2042553191490697, 0.0]], [[0.0, 0.0, 0.0], [0.0, -0.10251533201767415, 0.0], [0.0, -0.20503066403534831, 0.0], [0.0, -0.30754599605279509, 0.0], [0.0, -0.41006132807046924, 0.0], [0.0, -0.5125766600881434, 0.0], [0.0, -0.61509199210581755, 0.0], [0.0013633957983074652, -0.71759276450575271, 0.0], [0.0098903733469342114, -0.81967684278174602, 0.0], [0.051510051770492282, -0.91223938236180402, 0.0], [0.13315049187440309, -0.97242949019187108, 0.0], [0.2334163572104444, -0.99042524713877356, 0.0], [0.33414678336930592, -0.97399808081877381, 0.0], [0.42442182833519837, -0.92635380361207353, 0.0], [0.49066841003559603, -0.84913310639603878, 0.0], [0.52207973770555327, -0.75201375192045816, 0.0], [0.53216719701640613, -0.65007610601401211, 0.0], [0.53297872340453978, -0.54757075070688188, 0.0], [0.53297872340453978, -0.44505541868920773, 0.0], [0.53297872340453978, -0.34254008667176095, 0.0], [0.53297872340453978, -0.24002475465385942, 0.0], [0.53297872340453978, -0.13750942263641264, 0.0], [0.53297872340453978, -0.034994090618511109, 0.0], [0.53297872340453978, -0.067521241399163046, 0.0], [0.53297872340453978, -0.17003657341660983, 0.0], [0.53297872340453978, -0.27255190543428398, 0.0], [0.53297872340453978, -0.37506723745195814, 0.0], [0.53297872340453978, -0.47758256946963229, 0.0], [0.53297872340453978, -0.58009790148707907, 0.0], [0.53393612016952829, -0.68260508867138014, 0.0], [0.53923947809153105, -0.78496952875002535, 0.0], [0.55332556635266883, -0.8864392905945806, 0.0], [0.60032263624316329, -0.97367977375438386, 0.0]], [[0.0, 0.0, 0.0], [-0.020508953873104474, -0.056312720804044147, 0.0], [-0.041017907745754201, -0.11262544160808829, 0.0], [-0.061526861619313422, -0.16893816241213244, 0.0], [-0.082035815491963149, -0.22525088321594922, 0.0], [-0.10254476936552237, -0.28156360401999336, 0.0], [-0.12305372323862684, -0.33787632482426488, 0.0], [-0.14356267711127657, -0.39418904562830903, 0.0], [-0.16407163098438104, -0.45050176643212581, 0.0], [-0.18458058485748552, -0.50681448723616995, 0.0], [-0.20508953873058999, -0.5631272080402141, 0.0], [-0.22559849260369447, -0.61943992884403087, 0.0], [-0.24610744647679894, -0.67575264964807502, 0.0], [-0.26643450783330991, -0.73213101005762837, 0.0], [-0.28603752873141275, -0.78876488659830102, 0.0], [-0.30467797607116154, -0.84572243023308147, 0.0], [-0.32200748226978249, -0.90309148002938855, 0.0], [-0.33860667347107665, -0.84783336576492729, 0.0], [-0.35620199487266291, -0.79054418883015387, 0.0], [-0.37483508414015887, -0.73358415327106741, 0.0], [-0.39454060252091949, -0.67698624973218102, 0.0], [-0.4147652573628875, -0.62057082184651335, 0.0], [-0.43498969237998608, -0.56415529258765673, 0.0], [-0.45521412739753941, -0.50773976332880011, 0.0], [-0.475438562414638, -0.45132423407017086, 0.0], [-0.49566299743173658, -0.39490870481154161, 0.0], [-0.51588743244928992, -0.33849317555245761, 0.0], [-0.53611186746684325, -0.28207764629382837, 0.0], [-0.55633630248394184, -0.22566211703519912, 0.0], [-0.57656073750149517, -0.16924658777634249, 0.0], [-0.59678517251859375, -0.11283105851748587, 0.0], [-0.61700960753614709, -0.056415529258856623, 0.0], [-0.63723404255324567, 0.0, 0.0]], [[0.0, 0.0, 0.0], [-0.03252978381669891, -0.10974333661101809, 0.0], [-0.065059567632488324, -0.21948667322226356, 0.0], [-0.097589351449187234, -0.32923000983328166, 0.0], [-0.1301191352654314, -0.43897334644429975, 0.0], [-0.16264891908167556, -0.54871668305554522, 0.0], [-0.19518424088892061, -0.65845837494475745, 0.0], [-0.22782938090540483, -0.76816745204882864, 0.0], [-0.26025013244543516, -0.86461400495227281, 0.0], [-0.28916531776167176, -0.75386338949670062, 0.0], [-0.31804656270878695, -0.64310396312885132, 0.0], [-0.34665380100568655, -0.53227340469516093, 0.0], [-0.37526103930258614, -0.42144284626169792, 0.0], [-0.40386827759948574, -0.31061228782823491, 0.0], [-0.43247551589638533, -0.19978172939454453, 0.0], [-0.46108275419328493, -0.088951170961081516, 0.0], [-0.48996731421721051, -0.021805925194712472, 0.0], [-0.51997933232632931, -0.13226435871024478, 0.0], [-0.54999135043635761, -0.24272279222554971, 0.0], [-0.58000336854593115, -0.35318122574085464, 0.0], [-0.61001538665504995, -0.46363965925615958, 0.0], [-0.6400274047646235, -0.57409809277146451, 0.0], [-0.66962635586560282, -0.68466478206778447, 0.0], [-0.69760562705278062, -0.79565551971677451, 0.0], [-0.72564165609992415, -0.88273354043576546, 0.0], [-0.7561272124057723, -0.77240486047253398, 0.0], [-0.78661276871162045, -0.6620761805093025, 0.0], [-0.81704025898307009, -0.55173147405798773, 0.0], [-0.8474619944204278, -0.44138517924625376, 0.0], [-0.87788372985778551, -0.33103888443497453, 0.0], [-0.90830546529514322, -0.22069258962324056, 0.0], [-0.93872720073295568, -0.11034629481173397, 0.0], [-0.96914893617031339, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.1129026287853776, -0.019592988617660012, 0.0], [0.21487575954552085, 0.024779516624676035, 0.0], [0.25927049200845431, 0.12971615201422537, 0.0], [0.27391546236685826, 0.24372656663899761, 0.0], [0.27865891689452837, 0.35865493164828877, 0.0], [0.27977132387331949, 0.47368617559413906, 0.0], [0.28856498521554386, 0.58762053353984811, 0.0], [0.32038600368241532, 0.69816022797886035, 0.0], [0.35712419661422246, 0.80716398891217978, 0.0], [0.39672033734495926, 0.91517280270500123, 0.0], [0.43632787019168973, 1.0231774847839006, 0.0], [0.47593540303796544, 1.1311821668623452, 0.0], [0.51554293588424116, 1.2391868489407898, 0.0], [0.55515046873051688, 1.3471915310199165, 0.0], [0.59475800157679259, 1.4551962130985885, 0.0], [0.56573902162608647, 1.3760651620436875, 0.0], [0.52613148877981075, 1.2680604799652428, 0.0], [0.48652395593353504, 1.1600557978863435, 0.0], [0.44691642308725932, 1.0520511158074441, 0.0], [0.40730889024052885, 0.9440464337285448, 0.0], [0.36770135739425314, 0.83604175164964545, 0.0], [0.3297244355158, 0.72746187280063168, 0.0], [0.29659294358270927, 0.61730797389554937, 0.0], [0.26692326291458812, 0.6011861739170854, 0.0], [0.23377144719097487, 0.71133644442943478, 0.0], [0.19623808456753977, 0.82007100510872988, 0.0], [0.1573347763842321, 0.92833134235888792, 0.0], [0.11843146820183392, 1.0365916796095007, 0.0], [0.079528160018980998, 1.1448520168596588, 0.0], [0.04062485183658282, 1.2531123541098168, 0.0], [0.0017215436541846429, 1.3613726913604296, 0.0], [-0.037181764528668282, 1.4696330286105876, 0.0]], [[0.0, 0.0, 0.0], [0.10298454701478477, 0.0, 0.0], [0.20596909403002428, 0.0, 0.0], [0.3089536410443543, 0.0, 0.0], [0.41193818805959381, 0.0, 0.0], [0.51492273507437858, 0.0, 0.0], [0.61790728208916335, 0.0, 0.0], [0.72089182910394811, 0.0, 0.0], [0.82387637611873288, 0.0, 0.0], [0.920970765794209, -0.0024549299610043818, 0.0], [0.84846978224322811, -0.075594688697492529, 0.0], [0.77596879869270197, -0.14873444743398068, 0.0], [0.70346781514172108, -0.22187420617001408, 0.0], [0.63096683159119493, -0.29501396490650222, 0.0], [0.55846584803975929, -0.36815372364299037, 0.0], [0.48596486448923315, -0.44129348237902377, 0.0], [0.41346388093825226, -0.51443324111551192, 0.0], [0.34096289738727137, -0.58757299985200007, 0.0], [0.26846191383674523, -0.66071275858803347, 0.0], [0.19596093028576433, -0.73385251732452161, 0.0], [0.12345994673478344, -0.80699227606055501, 0.0], [0.0509589631842573, -0.88013203479704316, 0.0], [-0.021542020366723591, -0.95327179353353131, 0.0], [0.03058588537714968, -0.97446808510630945, 0.0], [0.13357043239193445, -0.97446808510630945, 0.0], [0.23655497940671921, -0.97446808510630945, 0.0], [0.33953952642195873, -0.97446808510676419, 0.0], [0.44252407343674349, -0.97446808510630945, 0.0], [0.54550862045152826, -0.97446808510630945, 0.0], [0.64849316746631303, -0.97446808510630945, 0.0], [0.75147771448109779, -0.97446808510630945, 0.0], [0.85446226149588256, -0.97446808510630945, 0.0], [0.95744680851066732, -0.97446808510630945, 0.0]]]
stenoCarCoords  = [[[0.0, 0.0, 0.0], [0.011839888151826017, -0.021230144272976759, 0.0], [0.023679776304106781, -0.04246028854549877, 0.0], [0.035519664456387545, -0.063690432818475529, 0.0], [0.047359552608668309, -0.084920577091224914, 0.0], [0.059199440760494326, -0.1061507213639743, 0.0], [0.071039328913229838, -0.12738086563672368, 0.0], [0.082879217065055855, -0.14861100990970044, 0.0], [0.094719105217336619, -0.16984115418244983, 0.0], [0.10655899336916264, -0.19107129845519921, 0.0], [0.1183988815214434, -0.21230144272817597, 0.0], [0.13023876967372416, -0.23353158700069798, 0.0], [0.14207865782555018, -0.25476173127367474, 0.0], [0.15391854597783095, -0.2759918755466515, 0.0], [0.16575843413011171, -0.29722201981917351, 0.0], [0.17759832228239247, -0.31845216409215027, 0.0], [0.18943821043467324, -0.33968230836489965, 0.0], [0.20127809858649925, -0.36091245263764904, 0.0], [0.21311798673878002, -0.3821425969106258, 0.0], [0.22495787489106078, -0.40337274118314781, 0.0], [0.2367977630428868, -0.42460288545612457, 0.0], [0.24863765119516756, -0.44583302972887395, 0.0], [0.26047753934744833, -0.46706317400162334, 0.0], [0.27231742749972909, -0.4882933182746001, 0.0], [0.28415731565155511, -0.50952346254734948, 0.0], [0.29599720380383587, -0.53075360682009887, 0.0], [0.30783709195611664, -0.55198375109284825, 0.0], [0.3196769801083974, -0.57321389536582501, 0.0], [0.33151686826022342, -0.5944440396385744, 0.0], [0.34335675641250418, -0.61567418391132378, 0.0], [0.3551966445643302, -0.63690432818430054, 0.0], [0.36703653271706571, -0.65813447245682255, 0.0], [0.37887642086889173, -0.67936461672979931, 0.0]], [[0.0, 0.0, 0.0], [0.00085417568652701448, -0.039102508954783843, 0.0], [0.003390246597064106, -0.078132173931408033, 0.0], [0.0075655118175745883, -0.11702078609823729, 0.0], [0.013334338317690708, -0.15570525633756915, 0.0], [0.020649412681450485, -0.19412747190108348, 0.0], [0.029462853685799928, -0.23223404027680772, 0.0], [0.039727139048864046, -0.26997578166333369, 0.0], [0.051395911734289257, -0.30730730220579972, 0.0], [0.064424600598613324, -0.34418634306052809, 0.0], [0.078770904764496663, -0.38057311974307595, 0.0], [0.094395224764411978, -0.41642978965387556, 0.0], [0.11126089421395591, -0.45171963489633526, 0.0], [0.12933441193808903, -0.48640644391821297, 0.0], [0.14858557424167884, -0.52045378177331258, 0.0], [0.16898755970169077, -0.55382424706385791, 0.0], [0.19051697193890504, -0.58647868981461215, 0.0], [0.21315384488798372, -0.61837536981920493, 0.0], [0.23688160969777527, -0.64946903001532519, 0.0], [0.26168702754148399, -0.67970986790419374, 0.0], [0.28756007573520037, -0.7090423650199682, 0.0], [0.31449374815065312, -0.73740391189471666, 0.0], [0.34248377911853822, -0.76472322701442863, 0.0], [0.37152822732878121, -0.79091848718758229, 0.0], [0.40162676975660361, -0.81589504086832676, 0.0], [0.43277973968906736, -0.83954277490374807, 0.0], [0.46498665291301222, -0.86173297429013473, 0.0], [0.49824389924106072, -0.88231460053816591, 0.0], [0.5325414198227918, -0.90111015924640014, 0.0], [0.56785778109497187, -0.91791126786006316, 0.0], [0.60415304517937329, -0.93247445021370368, 0.0], [0.64135878667002544, -0.94451822849123346, 0.0], [0.67936461672979931, -0.95372340425524271, 0.0]], [[0.0, 0.0, 0.0], [0.020742366775721166, 0.027656489034370679, 0.0], [0.041484733551442332, 0.055312978068513985, 0.0], [0.062227100327618246, 0.082969467102657291, 0.0], [0.082969467103339412, 0.11062595613702797, 0.0], [0.10371183387860583, 0.13828244517117128, 0.0], [0.124454200654327, 0.16593893420554195, 0.0], [0.14519656743004816, 0.19359542323991263, 0.0], [0.16593893420622408, 0.22125191227405594, 0.0], [0.18668130098149049, 0.24890840130842662, 0.0], [0.20742366775721166, 0.2765648903427973, 0.0], [0.22816603453247808, 0.30422137937716798, 0.0], [0.24890840130865399, 0.33187786841108391, 0.0], [0.26965076808482991, 0.35953435744522722, 0.0], [0.29039313486009632, 0.38719084647982527, 0.0], [0.31113550163536274, 0.41484733551419595, 0.0], [0.33187786841153866, 0.44250382454856663, 0.0], [0.35262023518680508, 0.47016031358270993, 0.0], [0.37336260196298099, 0.49781680261685324, 0.0], [0.39410496873824741, 0.52547329165122392, 0.0], [0.41484733551442332, 0.55312978068536722, 0.0], [0.43558970228968974, 0.5807862697197379, 0.0], [0.45633206906586565, 0.60844275875410858, 0.0], [0.47707443584158682, 0.63609924778825189, 0.0], [0.49781680261730799, 0.66375573682262257, 0.0], [0.5185591693925744, 0.69141222585676587, 0.0], [0.53930153616875032, 0.71906871489136392, 0.0], [0.56004390294401674, 0.74672520392550723, 0.0], [0.58078626972019265, 0.77438169295965054, 0.0], [0.60152863649545907, 0.80203818199402122, 0.0], [0.62227100327163498, 0.82969467102839189, 0.0], [0.6430133700469014, 0.8573511600625352, 0.0], [0.66375573682262257, 0.88500764909690588, 0.0]], [[0.0, 0.0, 0.0], [0.0, -0.037937570691838118, 0.0], [0.0, -0.075875141383448863, 0.0], [0.0, -0.11381271207528698, 0.0], [0.0, -0.15175028276689773, 0.0], [0.0, -0.18968785345873584, 0.0], [0.0, -0.22762542415057396, 0.0], [0.0, -0.26556299484218471, 0.0], [0.0, -0.30350056553402283, 0.0], [0.0, -0.3414381362254062, 0.0], [0.0, -0.37937570691724432, 0.0], [0.0, -0.41731327760908243, 0.0], [0.0, -0.45525084830069318, 0.0], [0.0, -0.4931884189925313, 0.0], [0.0, -0.53112598968436942, 0.0], [0.0, -0.56906356037598016, 0.0], [0.0, -0.60700113106781828, 0.0], [0.0, -0.6449387017596564, 0.0], [0.0, -0.68287627245126714, 0.0], [0.0, -0.72081384314310526, 0.0], [0.0, -0.758751413834716, 0.0], [0.0, -0.79668898452655412, 0.0], [0.0, -0.83462655521816487, 0.0], [0.0, -0.87256412590977561, 0.0], [0.0, -0.9105016966018411, 0.0], [0.0, -0.94843926729345185, 0.0], [0.0, -0.98637683798506259, 0.0], [0.0, -1.0243144086769007, 0.0], [0.0, -1.0622519793687388, 0.0], [0.0, -1.1001895500603496, 0.0], [0.0, -1.1381271207521877, 0.0], [0.0, -1.1760646914437984, 0.0], [0.0, -1.2140022621356366, 0.0]], [[0.0, 0.0, 0.0], [-0.0003331914022055571, 0.0033829491408141621, 0.0], [-0.0013199610025367292, 0.0066358928477256995, 0.0], [-0.0029223886190266057, 0.0096338242256024387, 0.0], [-0.0050788931553142902, 0.012261532587899637, 0.0], [-0.007706601929385215, 0.014418037329051003, 0.0], [-0.010704532023282809, 0.016020464255689149, 0.0], [-0.013957476484392828, 0.017007234148195494, 0.0], [-0.017340425531983783, 0.017340425531983783, 0.0], [-0.020723374670069461, 0.017007234130232973, 0.0], [-0.023976318377663119, 0.016020464530356548, 0.0], [-0.02697424975622198, 0.014418036913639298, 0.0], [-0.029601958117837057, 0.012261532378715856, 0.0], [-0.031758462857396808, 0.0096338236082829098, 0.0], [-0.033360889786763437, 0.0066358935112020845, 0.0], [-0.034347659679497156, 0.0033829490505468129, 0.0], [-0.034680851063967566, 0.0, 0.0], [-0.034347659662671504, -0.0033829491353571939, 0.0], [-0.033360890063704574, -0.0066358928429508524, 0.0], [-0.031758462447214697, -0.0096338242221918335, 0.0], [-0.029601957912291255, -0.012261532584034285, 0.0], [-0.026974249139129824, -0.014418037325867772, 0.0], [-0.023976319045686978, -0.016020464253642785, 0.0], [-0.020723374586395948, -0.017007234146831252, 0.0], [-0.017340425531983783, -0.017340425531983783, 0.0], [-0.013957476380710432, -0.017007234127504489, 0.0], [-0.01070453254487802, -0.01602046447169414, 0.0], [-0.0077066012900104397, -0.014418036902043241, 0.0], [-0.0050788930011549382, -0.012261532433740285, 0.0], [-0.0029223883020677022, -0.0096338237506188307, 0.0], [-0.0013199612617427192, -0.0066358934739128017, 0.0], [-0.00033319129897790845, -0.0033829486199010717, 0.0]], [[0.0, 0.0, 0.0], [0.00041132400065180263, -0.032799198349039216, 0.0], [0.0016594617277405632, -0.065577176254691949, 0.0], [0.0037646396863237896, -0.098311239663871675, 0.0], [0.0067454821510182228, -0.13097715986759795, 0.0], [0.010618708037327451, -0.1635492815737507, 0.0], [0.015398829926652979, -0.19600066875000266, 0.0], [0.02109786931259805, -0.22830331635714174, 0.0], [0.027725087121780234, -0.2604283531877627, 0.0], [0.035286755034121597, -0.29234633280657363, 0.0], [0.043785966478480987, -0.32402752919006161, 0.0], [0.053222501918753551, -0.35544226500951481, 0.0], [0.06359275286877164, -0.38656124952308346, 0.0], [0.074889710615479999, -0.41735592100349095, 0.0], [0.087103023922736611, -0.44779878736790124, 0.0], [0.10021912342244832, -0.47786374774250362, 0.0], [0.11422140218110144, -0.50752637139817125, 0.0], [0.12909045615924697, -0.53676415146719592, 0.0], [0.1448043698796937, -0.56555671085197901, 0.0], [0.16133902954470614, -0.59388594512779491, 0.0], [0.17866846922652257, -0.62173613280310747, 0.0], [0.19676523130192436, -0.64909399532803036, 0.0], [0.21560070407213061, -0.67594867284083193, 0.0], [0.23514545636498951, -0.70229167223601507, 0.0], [0.25536958996735848, -0.72811682402607403, 0.0], [0.27624301245759852, -0.75342013079011849, 0.0], [0.29773571057558001, -0.77819963473643838, 0.0], [0.31981799530649369, -0.80245526955104651, 0.0], [0.34246068437732902, -0.82618866827306192, 0.0], [0.36563529776913128, -0.84940301670758345, 0.0], [0.38931417060439344, -0.87210285151559219, 0.0], [0.41347056560925921, -0.89429389459860431, 0.0], [0.43807878630286723, -0.91598291681521005, 0.0]], [[0.0, 0.0, 0.0], [0.024563363658216986, -0.0062429370600511902, 0.0], [0.049204927013761335, -0.012169643612878644, 0.0], [0.073922882141687296, -0.017769164120409187, 0.0], [0.098715087120581302, -0.023030155954529619, 0.0], [0.12357902570056467, -0.027940889087858523, 0.0], [0.14851178253184116, -0.032489252871528151, 0.0], [0.17351000196231325, -0.036662763499862194, 0.0], [0.19856984289845059, -0.040448576101880462, 0.0], [0.22368696830062618, -0.043833507284489315, 0.0], [0.24885644703590515, -0.046804051170511229, 0.0], [0.27407275446466883, -0.04934641708973686, 0.0], [0.29932971596053903, -0.051446566159938811, 0.0], [0.32462046336331696, -0.053090258297288528, 0.0], [0.34993737972126837, -0.05426310793382072, 0.0], [0.37527211662427362, -0.054950652353454643, 0.0], [0.40061546108790935, -0.055138424117330942, 0.0], [0.4259573742365319, -0.054812042024877883, 0.0], [0.45128694608365549, -0.053957308665530945, 0.0], [0.47659237777133967, -0.052560320090833557, 0.0], [0.50186097367895854, -0.050607586081241607, 0.0], [0.52707912756795849, -0.048086162109939323, 0.0], [0.55223241307294302, -0.044983779912854516, 0.0], [0.57730550329915786, -0.041289003758038234, 0.0], [0.60228229853373705, -0.036991371855947364, 0.0], [0.62714597364629299, -0.032081548036558161, 0.0], [0.6518790643876855, -0.026551469166406605, 0.0], [0.67646356848399591, -0.020394487245994242, 0.0], [0.70088108506661229, -0.013605495726096706, 0.0], [0.72511292957960904, -0.0061810514253011206, 0.0], [0.74914030541913235, 0.0018805330857958324, 0.0], [0.77294446535142924, 0.010579114744814433, 0.0], [0.79650688418723803, 0.01991267210451042, 0.0]], [[0.0, 0.0, 0.0], [-0.018867415752993111, 0.046892420011317881, 0.0], [-0.041175720095907309, 0.092238125165749807, 0.0], [-0.068698377849159442, 0.13458309619545616, 0.0], [-0.10475999891013998, 0.1697198785366254, 0.0], [-0.15217089630641567, 0.18460404370034666, 0.0], [-0.19895733172870678, 0.16737972043893024, 0.0], [-0.23528740558595018, 0.13246120667963623, 0.0], [-0.26356915128735636, 0.090624845113779884, 0.0], [-0.28526017138983661, 0.045014420715460801, 0.0], [-0.29941651770923272, -0.0034538827396772831, 0.0], [-0.3045645958991372, -0.053662525406480199, 0.0], [-0.29850107208085319, -0.1037126883647943, 0.0], [-0.27685396082688385, -0.14898779813802321, 0.0], [-0.2356339153798217, -0.17682934456161092, 0.0], [-0.18570164190577998, -0.1764767325360026, 0.0], [-0.13897014387111994, -0.16606990882473838, 0.0], [-0.13662620031118422, -0.21578175754507356, 0.0], [-0.14480429627565172, -0.26565971582272141, 0.0], [-0.15516776844424385, -0.31513795904038489, 0.0], [-0.16657649365743055, -0.36438686093106298, 0.0], [-0.17861426081299214, -0.41348610772911343, 0.0], [-0.19107748649093992, -0.46247920512405472, 0.0], [-0.2038499026343743, -0.51139264711855503, 0.0], [-0.21685829062562334, -0.56024389285676079, 0.0], [-0.23005329232773875, -0.60904508128533053, 0.0], [-0.2433999259801567, -0.65780502849088407, 0.0], [-0.25687242233198049, -0.70653035126042596, 0.0], [-0.27045121037463105, -0.75522616214584559, 0.0], [-0.28412104861217813, -0.80389649244739303, 0.0], [-0.29786981904862841, -0.85254458255803911, 0.0], [-0.31168771773218396, -0.901173081617344, 0.0], [-0.32556670789472264, -0.94978423662314526, 0.0]], [[0.0, 0.0, 0.0], [-0.0003331914022055571, 0.0033829491405867884, 0.0], [-0.0013199610029914766, 0.0066358928493173153, 0.0], [-0.0029223886203908478, 0.0096338242271940544, 0.0], [-0.0050788931562237849, 0.012261532588581758, 0.0], [-0.007706601928020973, 0.014418037328141509, 0.0], [-0.010704532025101798, 0.01602046425637127, 0.0], [-0.013957476486211817, 0.017007234148422867, 0.0], [-0.017340425531983783, 0.017340425531983783, 0.0], [-0.02072337467370744, 0.017007234129323479, 0.0], [-0.023976318380391604, 0.01602046452921968, 0.0], [-0.026974249758950464, 0.014418036911820309, 0.0], [-0.029601958120565541, 0.012261532375987372, 0.0], [-0.031758462861489534, 0.0096338236016890733, 0.0], [-0.033360889788582426, 0.0066358935071093583, 0.0], [-0.03434765968040665, 0.0033829490450898447, 0.0], [-0.034680851063967566, 0.0, 0.0], [-0.034347659661762009, -0.0033829491408141621, 0.0], [-0.033360890060976089, -0.0066358928486351942, 0.0], [-0.031758462444031466, -0.0096338242267393071, 0.0], [-0.029601957907289034, -0.012261532589036506, 0.0], [-0.026974249132763362, -0.014418037330415245, 0.0], [-0.023976319038865768, -0.016020464256598643, 0.0], [-0.020723374579574738, -0.017007234148195494, 0.0], [-0.017340425531983783, -0.017340425531983783, 0.0], [-0.013957476391169621, -0.017007234129550852, 0.0], [-0.010704532683575962, -0.01602046452921968, 0.0], [-0.0077066013050171023, -0.014418036911820309, 0.0], [-0.0050788929434020247, -0.012261532375987372, 0.0], [-0.0029223882006590429, -0.0096338235994153365, 0.0], [-0.0013199612758398871, -0.006635893507336732, 0.0], [-0.00033319138356091571, -0.0033829490469088341, 0.0]], [[0.0, 0.0, 0.0], [0.040533892555231432, 0.023554349231517335, 0.0], [0.080281093050871277, 0.048413006910777767, 0.0], [0.11917485665298955, 0.074586589061937048, 0.0], [0.15714707127472138, 0.10207990061439887, 0.0], [0.19412895826690146, 0.13089131791980435, 0.0], [0.23005206654079302, 0.16101241821456824, 0.0], [0.26484908424754394, 0.19242754863466871, 0.0], [0.29845488569526424, 0.22511370063875802, 0.0], [0.33080757187735799, 0.25904058193850688, 0.0], [0.3618493792046138, 0.29417080459370482, 0.0], [0.39152755166651332, 0.33046031762000894, 0.0], [0.41979511747376819, 0.36785908204069528, 0.0], [0.44661140344578598, 0.40631180358650454, 0.0], [0.47194238990186932, 0.4457588310938263, 0.0], [0.49576086473871328, 0.48613716555541941, 0.0], [0.51804634138215988, 0.52738149315860028, 0.0], [0.53878469654910077, 0.56942507823237065, 0.0], [0.55796770331789958, 0.61220075461710621, 0.0], [0.57559237248642603, 0.6556418269472033, 0.0], [0.59166005610450156, 0.69968264837461902, 0.0], [0.606175506787622, 0.74425923687317663, 0.0], [0.6191458030011745, 0.7893097293115261, 0.0], [0.63057914609771615, 0.83477468199907889, 0.0], [0.64048348202595662, 0.88059709377216677, 0.0], [0.64886495989640025, 0.92672238293948794, 0.0], [0.65572608273532751, 0.97309823345972291, 0.0], [0.66106332778963406, 1.0196740649155345, 0.0], [0.66486394919911618, 1.0664003528572721, 0.0], [0.66710128062322838, 1.1132274475774011, 0.0], [0.66772727107309038, 1.1601036020347237, 0.0], [0.6666594776115744, 1.2069714679009849, 0.0], [0.66375573682262257, 1.2537608362206356, 0.0]], [[0.0, 0.0, 0.0], [0.040981943648603192, 0.0, 0.0], [0.081963887296751636, 0.0, 0.0], [0.12294583094535483, 0.0, 0.0], [0.16392777459350327, 0.0, 0.0], [0.20490971824256121, 0.0, 0.0], [0.24589166189070966, 0.0, 0.0], [0.28687360553931285, 0.0, 0.0], [0.32785554918791604, 0.0, 0.0], [0.36883749283606448, 0.0, 0.0], [0.40981943648466768, 0.0, 0.0], [0.45080138013327087, 0.0, 0.0], [0.49178332378141931, 0.0, 0.0], [0.5327652674300225, 0.0, 0.0], [0.5737472110786257, 0.0, 0.0], [0.61472915472722889, 0.0, 0.0], [0.65571109837583208, 0.0, 0.0], [0.69669304202398052, 0.0, 0.0], [0.73767498567212897, 0.0, 0.0], [0.77865692932118691, 0.0, 0.0], [0.81963887296933535, 0.0, 0.0], [0.86062081661793854, 0.0, 0.0], [0.90160276026654174, 0.0, 0.0], [0.94258470391514493, 0.0, 0.0], [0.98356664756329337, 0.0, 0.0], [1.0245485912118966, 0.0, 0.0], [1.065530534860045, 0.0, 0.0], [1.1065124785086482, 0.0, 0.0], [1.1474944221572514, 0.0, 0.0], [1.1884763658058546, 0.0, 0.0], [1.2294583094544578, 0.0, 0.0], [1.2704402531026062, 0.0, 0.0], [1.3114221967512094, 0.0, 0.0]], [[0.0, 0.0, 0.0], [-0.054830159841458226, -0.036854798476497308, 0.0], [-0.10439737282285932, -0.080528829242894062, 0.0], [-0.14785636351916764, -0.13028739894025421, 0.0], [-0.18477406947567943, -0.18508167176605639, 0.0], [-0.21514971508759118, -0.24376380765011163, 0.0], [-0.23931494896214645, -0.30527189421877665, 0.0], [-0.25779098995099048, -0.36872767811269114, 0.0], [-0.27116689724289245, -0.43345568143718083, 0.0], [-0.28002162924713048, -0.49895911705675644, 0.0], [-0.28488458971696673, -0.56488188362231995, 0.0], [-0.28622130428948367, -0.63097221673911008, 0.0], [-0.28443269692616013, -0.69705334409604802, 0.0], [-0.27986057746329607, -0.76300145264281127, 0.0], [-0.27279526647089369, -0.82873003412464641, 0.0], [-0.26348336347837176, -0.89417876857555711, 0.0], [-0.25213481763876189, -0.95930574574617822, 0.0], [-0.23892901798444655, -1.0240820518158671, 0.0], [-0.22401990032540198, -1.0884879539191843, 0.0], [-0.20754016120690721, -1.1525102311472892, 0.0], [-0.18960471741775109, -1.2161402684942004, 0.0], [-0.1703135604993804, -1.2793726249917654, 0.0], [-0.14975405052882707, -1.3422041546944001, 0.0], [-0.12800281900172195, -1.4046332929317487, 0.0], [-0.10512739414116368, -1.4666593847534841, 0.0], [-0.081187426448195765, -1.5282825202646109, 0.0], [-0.05623582392672688, -1.5895030990345731, 0.0], [-0.030319633557610359, -1.6503216815126507, 0.0], [-0.0034807899482984794, -1.7107388508986787, 0.0], [0.024243209340966132, -1.7707550132431606, 0.0], [0.052818821922755887, -1.8303704402142102, 0.0], [0.082215956992058636, -1.8895851031861639, 0.0], [0.11240761686440237, -1.9483986923166867, 0.0]], [[0.0, 0.0, 0.0], [0.030252176711201173, 0.046060240386168516, 0.0], [0.062612531149170536, 0.090664022399096211, 0.0], [0.097105669843131182, 0.13363908975134109, 0.0], [0.13374355698033469, 0.1748002296942559, 0.0], [0.172522755204227, 0.21394973757423941, 0.0], [0.21342153039404366, 0.25087849145256769, 0.0], [0.25639677250683235, 0.28536759400958545, 0.0], [0.30138097507278871, 0.3171908087247175, 0.0], [0.34827928993354362, 0.3461177510307607, 0.0], [0.39696694858002957, 0.3719179820741374, 0.0], [0.44728742531378884, 0.39436605551054527, 0.0], [0.49905123565713438, 0.41324724925402734, 0.0], [0.55203617052393383, 0.42836409187157187, 0.0], [0.6059887997421356, 0.43954319688737087, 0.0], [0.66062774751981124, 0.44664214815566083, 0.0], [0.71564847821446165, 0.44955588216680553, 0.0], [0.77072993307228899, 0.44822212061671962, 0.0], [0.82554244920629571, 0.44262525390854535, 0.0], [0.87975660917891219, 0.43279825773515768, 0.0], [0.93305242419455681, 0.41882235100638354, 0.0], [0.98512814157948014, 0.40082433348607083, 0.0], [1.0357080730400412, 0.37897176316300829, 0.0], [1.0845487288579534, 0.35346644237756664, 0.0], [1.1314430678066856, 0.3245367416661793, 0.0], [1.1762226435948833, 0.29242943586791625, 0.0], [1.2187577151908044, 0.2574017166602971, 0.0], [1.2589557323153713, 0.21971380874606439, 0.0], [1.2967584251023254, 0.17962267181428615, 0.0], [1.3321380815050361, 0.13737686412196126, 0.0], [1.3650932258224202, 0.09321282856558355, 0.0], [1.395644382649607, 0.047352139540862481, 0.0], [1.4238298136160665, 0.0, 0.0]], [[0.0, 0.0, 0.0], [0.035988320285468944, -0.043296086787222521, 0.0], [0.073590279884228949, -0.085198240751878984, 0.0], [0.1127779758280667, -0.1256211100735527, 0.0], [0.1535221429894591, -0.16447442708226845, 0.0], [0.19579192435230652, -0.20166196315994966, 0.0], [0.23955449682580365, -0.23708035178424325, 0.0], [0.28477442521307239, -0.27061770351997438, 0.0], [0.33141286188538288, -0.30215215150042241, 0.0], [0.37942623965864186, -0.33155012063093636, 0.0], [0.42876468944814405, -0.35866458797181622, 0.0], [0.47936984126272364, -0.38333321633535888, 0.0], [0.53117183884023689, -0.4053764842453802, 0.0], [0.58408573201631953, -0.42459614526660516, 0.0], [0.63800653060206969, -0.44077407062695784, 0.0], [0.69280342952060892, -0.45367222142567698, 0.0], [0.7483127274990693, -0.46303424235748025, 0.0], [0.80432976623933428, -0.46858970416133161, 0.0], [0.8606008045398994, -0.47006219349555067, 0.0], [0.91681566987790575, -0.46718240078007511, 0.0], [0.97260389154689619, -0.45970708679533345, 0.0], [1.0275367736076078, -0.44744361574680624, 0.0], [1.0811388650904519, -0.43027777537895417, 0.0], [1.1329106030239018, -0.40820006153717259, 0.0], [1.1823611575709947, -0.38132369922618636, 0.0], [1.2290465617452355, -0.34988791779960593, 0.0], [1.272604885436067, -0.31424350597148987, 0.0], [1.312780291312265, -0.27482310807135946, 0.0], [1.3494311866325006, -0.2321035431132259, 0.0], [1.382523015854531, -0.18656882022492027, 0.0], [1.4121103399966159, -0.13868041091291161, 0.0], [1.4383140545246533, -0.088857893762678941, 0.0], [1.4612990192376856, -0.037469205621391666, 0.0]], [[0.0, 0.0, 0.0], [0.012880039432729973, 0.01405095210793661, 0.0], [0.025760078864550451, 0.028101904216100593, 0.0], [0.038640118297735171, 0.042152856323809829, 0.0], [0.051520157729555649, 0.056203808431973812, 0.0], [0.064400197161830874, 0.070254760540137795, 0.0], [0.077280236594560847, 0.084305712648301778, 0.0], [0.090160276026836073, 0.098356664756465761, 0.0], [0.10304031545956605, 0.11240761686440237, 0.0], [0.11592035489184127, 0.12645856897233898, 0.0], [0.1288003943241165, 0.14050952108073034, 0.0], [0.14168043375639172, 0.15456047318866695, 0.0], [0.15456047318866695, 0.16861142529660356, 0.0], [0.16744051262139692, 0.18266237740454017, 0.0], [0.1803205520532174, 0.19671332951293152, 0.0], [0.19320059148594737, 0.21076428162086813, 0.0], [0.2060806309182226, 0.22481523372880474, 0.0], [0.21896067035049782, 0.23886618583674135, 0.0], [0.23184070978322779, 0.25291713794467796, 0.0], [0.24472074921550302, 0.26696809005306932, 0.0], [0.25760078864777824, 0.28101904216100593, 0.0], [0.27048082808005347, 0.29506999426939728, 0.0], [0.2833608675123287, 0.30912094637733389, 0.0], [0.29624090694505867, 0.32317189848504313, 0.0], [0.30912094637778864, 0.33722285059320711, 0.0], [0.32200098581006387, 0.3512738027013711, 0.0], [0.33488102524188434, 0.36532475480953508, 0.0], [0.34776106467461432, 0.37937570691747169, 0.0], [0.36064110410688954, 0.3934266590254083, 0.0], [0.37352114353961952, 0.40747761113334491, 0.0], [0.38640118297189474, 0.42152856324150889, 0.0], [0.39928122240416997, 0.43557951534967287, 0.0], [0.41216126183644519, 0.44963046745783686, 0.0]], [[0.0, 0.0, 0.0], [0.010538214081407205, -0.017563690135375509, 0.0], [0.021076428161904914, -0.035127380270068898, 0.0], [0.031614642243312119, -0.052691070405444407, 0.0], [0.042152856324264576, -0.070254760540137795, 0.0], [0.052691070405217033, -0.087818450675285931, 0.0], [0.063229284486624238, -0.10538214081043407, 0.0], [0.073767498567121947, -0.12294583094535483, 0.0], [0.084305712648529152, -0.14050952108050296, 0.0], [0.094843926729481609, -0.15807321121542373, 0.0], [0.10538214081043407, -0.17563690135079923, 0.0], [0.11592035489138652, -0.19320059148572, 0.0], [0.12645856897279373, -0.21076428162109551, 0.0], [0.13699678305329144, -0.22832797175601627, 0.0], [0.14753499713424389, -0.24589166189093703, 0.0], [0.15807321121519635, -0.26345535202585779, 0.0], [0.16861142529660356, -0.28101904216100593, 0.0], [0.17914963937801076, -0.29858273229615406, 0.0], [0.18968785345896322, -0.31614642243107482, 0.0], [0.20022606753991568, -0.33371011256645033, 0.0], [0.21076428162086813, -0.3512738027013711, 0.0], [0.22130249570182059, -0.36883749283651923, 0.0], [0.23184070978277305, -0.38640118297166737, 0.0], [0.2423789238637255, -0.40396487310658813, 0.0], [0.25291713794467796, -0.42152856324150889, 0.0], [0.26345535202608517, -0.43909225337665703, 0.0], [0.27399356610703762, -0.45665594351157779, 0.0], [0.28453178018799008, -0.47421963364672592, 0.0], [0.29506999426939728, -0.49178332378187406, 0.0], [0.30560820834989499, -0.5093470139170222, 0.0], [0.31614642243084745, -0.52691070405194296, 0.0], [0.32668463651225466, -0.54447439418709109, 0.0], [0.33722285059320711, -0.56203808432201185, 0.0]], [[0.0, 0.0, 0.0], [-0.00081374424553359859, -0.10192569997434475, 0.0], [-0.0033758753893380344, -0.20382210971547465, 0.0], [-0.007892996348800807, -0.30565025313444494, 0.0], [-0.01461241034712657, -0.40735632170617464, 0.0], [-0.070279808932355081, -0.4800930557630636, 0.0], [-0.15775654527533334, -0.53241005220843363, 0.0], [-0.24653249940820388, -0.58248913361330779, 0.0], [-0.3367808702118964, -0.62985989723529201, 0.0], [-0.42877920721775808, -0.67372736002039346, 0.0], [-0.43500750507928387, -0.67650821239931247, 0.0], [-0.34287871824244576, -0.63291622228007327, 0.0], [-0.25252329940713025, -0.58575029935582279, 0.0], [-0.16365519197916001, -0.53583508706333305, 0.0], [-0.07609527514250658, -0.48365749869935826, 0.0], [0.010256355999899824, -0.42950293380454241, 0.0], [0.09542811898245418, -0.37351085677892115, 0.0], [0.17936255609356522, -0.31568088451604126, 0.0], [0.26185647960937786, -0.25581557411851463, 0.0], [0.342337709975709, -0.19327713426605442, 0.0], [0.37607916399110763, -0.16499542797146205, 0.0], [0.29692771849977362, -0.22919848847504909, 0.0], [0.21519258711714429, -0.29009405064084604, 0.0], [0.1318425411732278, -0.34876262520992896, 0.0], [0.047191857463076303, -0.40553932128727865, 0.0], [-0.02015605034375767, -0.4718403440936072, 0.0], [-0.03115053635519871, -0.57317215377406683, 0.0], [-0.045289433300695237, -0.67411202155835781, 0.0], [-0.063096434549606784, -0.77446783020786825, 0.0], [-0.085233828321634064, -0.87395509986481557, 0.0], [-0.11254780632407346, -0.97214263993964778, 0.0], [-0.14612452916571783, -1.0683605534864, 0.0], [-0.1873460281071857, -1.1615453742656427, 0.0]], [[0.0, 0.0, 0.0], [0.00055974601264097146, -0.047826847951682794, 0.0], [0.0021253319800962345, -0.095631635638710577, 0.0], [0.0045330686198212788, -0.1434016481089202, 0.0], [0.0076279900426925451, -0.1911322449814179, 0.0], [0.01126309621395194, -0.23882487999117075, 0.0], [0.015298324165996746, -0.28648542457176518, 0.0], [0.019599375944835629, -0.33412277904449184, 0.0], [0.024036486075601715, -0.3817476828346571, 0.0], [0.028483186720677622, -0.42937169220931537, 0.0], [0.032815105793815746, -0.47700624428625815, 0.0], [0.036908830674292403, -0.52466181794943623, 0.0], [0.040640849631017772, -0.57234701833021973, 0.0], [0.043886609390938247, -0.6200676703949739, 0.0], [0.04651972084047884, -0.66782590347520454, 0.0], [0.048411345751446788, -0.71561905978978757, 0.0], [0.049429833215981489, -0.76343860491761006, 0.0], [0.049440667675298755, -0.81126875558993561, 0.0], [0.048306832389243937, -0.85908519032818731, 0.0], [0.045889679417996376, -0.90685363510647221, 0.0], [0.042050416322126694, -0.95452850874926298, 0.0], [0.036652301671438181, -1.0020517366433523, 0.0], [0.029563601088739233, -1.0493519257393018, 0.0], [0.020661282151195337, -1.096344114259864, 0.0], [0.0098353148018759384, -1.1429303354300373, 0.0], [-0.0030066902199905599, -1.1890011858381513, 0.0], [-0.017934931354830042, -1.2344385631704426, 0.0], [-0.034993477095667913, -1.2791195122297268, 0.0], [-0.054197503035084083, -1.3229209806809195, 0.0], [-0.075532162995841645, -1.3657250312826363, 0.0], [-0.098953372389587457, -1.4074239929700525, 0.0], [-0.12439044095708596, -1.4479248921829821, 0.0], [-0.15175028276689773, -1.4871527711161434, 0.0]], [[0.0, 0.0, 0.0], [0.073387752192502376, 0.11232896413730487, 0.0], [0.14453618229663334, 0.22608896537167311, 0.0], [0.21318025057189516, 0.34137681035895184, 0.0], [0.23455877995138508, 0.39183083584543965, 0.0], [0.13087669767901389, 0.30761281299442089, 0.0], [0.0055627286433264089, 0.26136278353556008, 0.0], [-0.12797209312338964, 0.25803040817618239, 0.0], [-0.25543697894408979, 0.29797230870099156, 0.0], [-0.36319072170135769, 0.37691391677003594, 0.0], [-0.43970164402799128, 0.48640700827922956, 0.0], [-0.47678156569872954, 0.61473371372176189, 0.0], [-0.47046222218523326, 0.74816050151162017, 0.0], [-0.42141992339702483, 0.8724082520752745, 0.0], [-0.33490314068876614, 0.97418002918311686, 0.0], [-0.22017079196484701, 1.0425843211748997, 0.0], [-0.089501493738680438, 1.070300514677001, 0.0], [0.04312065209433058, 1.0543624563310914, 0.0], [0.16350248914386611, 0.99647583976025089, 0.0], [0.25876089933126423, 0.90283562001627615, 0.0], [0.31870136579163955, 0.78346312058943113, 0.0], [0.33690911280064029, 0.65113349071498305, 0.0], [0.31143555785911303, 0.5200085359804234, 0.0], [0.3684400590864243, 0.6304847856968081, 0.0], [0.42563930132655514, 0.75185440623204158, 0.0], [0.47837461081462607, 0.87522702896217197, 0.0], [0.52592192002430238, 1.0006876346280933, 0.0], [0.56739396523471441, 1.1282813697439451, 0.0], [0.60170404938298816, 1.2579791524003667, 0.0], [0.62753097797076407, 1.3896214465162302, 0.0], [0.64329995397520179, 1.5228330713362084, 0.0], [0.64720906550019208, 1.6569043950239575, 0.0], [0.63735118762133425, 1.7906533366503936, 0.0]], [[0.0, 0.0, 0.0], [0.015175028276644298, 0.0, 0.0], [0.030350056553288596, 0.0, 0.0], [0.045525084830387641, 0.0, 0.0], [0.060700113107031939, 0.0, 0.0], [0.075875141383676237, 0.0, 0.0], [0.091050169659865787, 0.0, 0.0], [0.10622519793651009, 0.0, 0.0], [0.12140022621406388, 0.0, 0.0], [0.13657525449070818, 0.0, 0.0], [0.15175028276735247, 0.0, 0.0], [0.16692531104354202, 0.0, 0.0], [0.18210033932018632, 0.0, 0.0], [0.19727536759728537, 0.0, 0.0], [0.21245039587392966, 0.0, 0.0], [0.22762542415057396, 0.0, 0.0], [0.24280045242721826, 0.0, 0.0], [0.25797548070386256, 0.0, 0.0], [0.27315050898050686, 0.0, 0.0], [0.28832553725715115, 0.0, 0.0], [0.3035005655342502, 0.0, 0.0], [0.31867559381043975, 0.0, 0.0], [0.33385062208708405, 0.0, 0.0], [0.34902565036418309, 0.0, 0.0], [0.36420067864037264, 0.0, 0.0], [0.37937570691747169, 0.0, 0.0], [0.39455073519411599, 0.0, 0.0], [0.40972576347076028, 0.0, 0.0], [0.42490079174740458, 0.0, 0.0], [0.44007582002450363, 0.0, 0.0], [0.45525084830114793, 0.0, 0.0], [0.47042587657779222, 0.0, 0.0], [0.48560090485443652, 0.0, 0.0]], [[0.0, 0.0, 0.0], [-0.0034024011265501031, -0.051031915039857267, 0.0], [-0.0029498139265342616, -0.10217580518906288, 0.0], [0.0012212304700369714, -0.15315229343241299, 0.0], [0.0089091042027575895, -0.20371925651352285, 0.0], [0.019868361393037048, -0.25368063348787473, 0.0], [0.033830688642410678, -0.3028885397011436, 0.0], [0.050522498014288431, -0.35123997262894591, 0.0], [0.069677858505656332, -0.39867043944991565, 0.0], [0.091046870683840098, -0.44514655853663498, 0.0], [0.11440019034353099, -0.4906587209331974, 0.0], [0.13953084461536491, -0.53521481355937794, 0.0], [0.16625411351697039, -0.57883490574522511, 0.0], [0.19440634623651931, -0.62154717183739194, 0.0], [0.22384321956133135, -0.66338483867320974, 0.0], [0.25443775044004724, -0.70438392290679985, 0.0], [0.28607825413882892, -0.74458156611945014, 0.0], [0.31866651870541318, -0.78401500548670811, 0.0], [0.35211604670394081, -0.82272077266225097, 0.0], [0.38635052310155515, -0.86073421090509328, 0.0], [0.42130246755505141, -0.8980891763303589, 0.0], [0.45691206659739692, -0.93481787597465882, 0.0], [0.49312615775215818, -0.97095079017526587, 0.0], [0.52989739892063881, -1.0065167010011464, 0.0], [0.56718341095393043, -1.041542617560026, 0.0], [0.6049462714386209, -1.0760539667946887, 0.0], [0.64315187503962079, -1.110074582920106, 0.0], [0.68176950514089185, -1.143626833617418, 0.0], [0.72077139400335, -1.1767316792127076, 0.0], [0.7601324053944154, -1.2094087906832556, 0.0], [0.79982966678380762, -1.2416765831321754, 0.0], [0.83984240344398131, -1.2735523795547579, 0.0], [0.88015164004809776, -1.3050524317959571, 0.0]], [[0.0, 0.0, 0.0], [0.0054698893463864806, -0.069249406168182759, 0.0], [0.012305174330776936, -0.1383765064324507, 0.0], [0.021141179471669602, -0.20727454436678272, 0.0], [0.032930055346241716, -0.27572470133713978, 0.0], [0.049215373239803739, -0.3432343444073922, 0.0], [0.072727227428913466, -0.40853875741731827, 0.0], [0.10853074220085546, -0.46782310128355675, 0.0], [0.16322739342240311, -0.50950808891002453, 0.0], [0.23141137871289175, -0.51834146971737027, 0.0], [0.29841399897532028, -0.50086634117701578, 0.0], [0.3605791660847899, -0.47001055069404174, 0.0], [0.41877174958472096, -0.43211784805816933, 0.0], [0.47401639871986845, -0.39002189090660977, 0.0], [0.52703787232348986, -0.34515013187569821, 0.0], [0.57833099051231329, -0.29830903824722554, 0.0], [0.62824188705553752, -0.24999610773193126, 0.0], [0.67702062621992809, -0.2005394164241352, 0.0], [0.72485345263839918, -0.15016674545745445, 0.0], [0.77188282151519161, -0.099042806590205146, 0.0], [0.81822023842369163, -0.047290651004914253, 0.0], [0.86395468811315368, 0.0049952580216086062, 0.0], [0.90915841930973329, 0.057740782368455257, 0.0], [0.95389093488802246, 0.11088659170923165, 0.0], [0.99820188577496083, 0.16438444081541093, 0.0], [1.0421331770285178, 0.21819454860042242, 0.0], [1.085720528595175, 0.27228370489660847, 0.0], [1.1289945936282493, 0.32662379944690656, 0.0], [1.1719820134076144, 0.38119096351488224, 0.0], [1.2147060075453737, 0.4359646316272574, 0.0], [1.2571869930425237, 0.49092700609912754, 0.0], [1.2994430016324259, 0.54606254246823482, 0.0], [1.3414900778057017, 0.60135762108529889, 0.0]], [[0.0, 0.0, 0.0], [-0.031129780012179253, -0.062813292342298155, 0.0], [-0.061793223848326306, -0.12585552303903569, 0.0], [-0.091952358423441183, -0.18914053373100614, 0.0], [-0.12156339460534582, -0.25268380077750408, 0.0], [-0.15057545634635972, -0.3165027210354765, 0.0], [-0.17892890517987325, -0.38061690118843217, 0.0], [-0.20655315689191411, -0.44504855373156715, 0.0], [-0.23336372201629274, -0.50982289388889512, 0.0], [-0.25925821391547288, -0.57496871194211963, 0.0], [-0.28411071936898225, -0.64051889700408537, 0.0], [-0.3077637988344577, -0.70651108883225788, 0.0], [-0.33001665502524702, -0.7729880839181078, 0.0], [-0.35060722346361217, -0.83999794183887388, 0.0], [-0.36918388120238887, -0.90759274558581637, 0.0], [-0.38525885252238368, -0.97582395740550965, 0.0], [-0.39812752206353252, -1.0447285199441012, 0.0], [-0.40672081262346182, -1.1142888986266826, 0.0], [-0.40932064866774454, -1.1843141977685718, 0.0], [-0.40300464687288695, -1.2540607425214603, 0.0], [-0.38278022672056977, -1.3209821257707972, 0.0], [-0.34228935395003646, -1.3776469416704913, 0.0], [-0.28215179792687195, -1.412661224107751, 0.0], [-0.21329158331946019, -1.424443754235881, 0.0], [-0.14339570834818005, -1.4203713388367305, 0.0], [-0.074712053198709327, -1.4065146277396252, 0.0], [-0.0075964281295455294, -1.386324128242677, 0.0], [0.058050025961620122, -1.3617510240590036, 0.0], [0.12240863520855783, -1.3339696970613204, 0.0], [0.18565343413456503, -1.3037338456717862, 0.0], [0.24793299994234985, -1.2715542147132055, 0.0], [0.30937021016143262, -1.2377927071800059, 0.0], [0.37006622835997405, -1.2027152421708251, 0.0]], [[0.0, 0.0, 0.0], [0.059170339548472839, -0.062629654369175114, 0.0], [0.11445408585450423, -0.12871212924574138, 0.0], [0.16523433616748662, -0.19831115732358739, 0.0], [0.21078291349203937, -0.27143648333094461, 0.0], [0.25025110507885984, -0.34800934657596372, 0.0], [0.28267351119211526, -0.42781469949795792, 0.0], [0.30699791087909034, -0.51044172453430292, 0.0], [0.32215723826266185, -0.59522259130926614, 0.0], [0.32719515383132602, -0.68119353454085285, 0.0], [0.35975086990174532, -0.63608475844102941, 0.0], [0.42415574534152256, -0.5796938284497628, 0.0], [0.50539496063402112, -0.55271022941496994, 0.0], [0.59073942917166278, -0.55936192059562018, 0.0], [0.66681684629065785, -0.59860667027032832, 0.0], [0.7217069180251201, -0.66429536718851523, 0.0], [0.74680911038512932, -0.74613548191473456, 0.0], [0.73819025630518809, -0.83130377579982451, 0.0], [0.69720081083005425, -0.90645555467654049, 0.0], [0.63026326248655096, -0.95981554783838874, 0.0], [0.5478657951380228, -0.98302297392729088, 0.0], [0.46291902574967025, -0.97244154330746824, 0.0], [0.38873289300636316, -0.92972922320223006, 0.0], [0.33693137857926558, -0.86157844901163116, 0.0], [0.31405886451693732, -0.81138952037235867, 0.0], [0.29161425739494007, -0.8945254828176985, 0.0], [0.2588140207599281, -0.97415096909298882, 0.0], [0.21666433215159486, -1.0492553413614587, 0.0], [0.16640961077655447, -1.1192060605594634, 0.0], [0.10934301707766281, -1.183730342938361, 0.0], [0.046671463585425954, -1.2428355473020929, 0.0], [-0.020553256796119967, -1.2967145256320691, 0.0], [-0.091452929175375175, -1.3456645292917528, 0.0]]]
