import params import misc from math import pi # 3d coords to ellipsoidal def p2e(p, axis=params.bulbAxis): from copy import copy p = copy(p) for i in range(3): p[i] -= params.bulbCenter[i] p[i] /= axis[i] / 2.0 phi, theta = misc.Spherical.to(p)[1:] phi %= 2*pi return phi, theta def e2p(phi, theta, axis=params.bulbAxis): p = misc.Spherical.xyz(1, phi, theta) for i in range(3): p[i] *= axis[i]/2.0 p[i] += params.bulbCenter[i] return p def geodist(q, p): phiq, thetaq = p2e(q) phip, thetap = p2e(p) if phiq < phip: def swap(a, b): return b, a phip, phiq = swap(phip, phiq) thetap, thetaq = swap(thetap, thetaq) if phiq > phip and (phiq - phip) % (2 * pi) > pi: phiq = -(2 * pi - phiq) def pt(t): phi = (phiq-phip)*t+phip theta = (thetaq-thetap)*t+thetap return e2p(phi, theta) t = 0.0 dt = (1.0/360*2*pi)/max([abs(phiq-phip), abs(thetaq-thetap)]) tot = 0.0 a = pt(0) seq = [a] while t < 1: t += dt b = pt(t) seq.append(b) tot += misc.distance(a, b) a = b return tot, seq def glomdist(i, j): gl1 = params.glomRealCoords[i] gl2 = params.glomRealCoords[j] return geodist(gl1, gl2)[0]