def finiteTranslateOffset(fareyVector, N, P, Q): ''' Translate offset required when mapping Farey vectors to finite angles Returns translate offset and perp Boolean flag pair Wraps function from Farey module ''' return farey.finiteTranslateOffset(fareyVector, N, P, Q)
def finiteProjection(projection, angle, P, Q, N, center=False): ''' Convert a Mojette projection taken at angle into a finite (FRT) projection. ''' dyadic = True if N % 2 == 1: # if odd, assume prime dyadic = False shiftQ = int(N / 2.0 + 0.5) - int(Q / 2.0 + 0.5) shiftP = int(N / 2.0 + 0.5) - int(P / 2.0 + 0.5) finiteProj = np.zeros(N) p, q = farey.get_pq(angle) m, inv = farey.toFinite(angle, N) # print "p:", p, "q:", q, "m:", m, "inv:", inv translateOffset, perp = farey.finiteTranslateOffset(angle, N, P, Q) angleSign = p * q if dyadic: for translate, bin in enumerate(projection): if angleSign >= 0 and perp: #Reverse for perp translateMojette = translateOffset - translate else: translateMojette = translate - translateOffset translateFinite = (inv * translateMojette) % N if center: translateFinite = (translateFinite + shiftQ + m * (N - shiftP)) % N finiteProj[translateFinite] += bin else: for translate, bin in enumerate(projection): if angleSign >= 0 and perp: #Reverse for perp translateMojette = int(translateOffset) - int(translate) else: translateMojette = int(translate) - int(translateOffset) if translateMojette < 0: translateFinite = (N - (inv * abs(translateMojette)) % N) % N else: translateFinite = (inv * translateMojette ) % N #has issues in C, may need checking if center: translateFinite = (translateFinite + shiftQ + m * (N - shiftP)) % N finiteProj[translateFinite] += bin return finiteProj
def angleSetSliceCoordinates(angles, P, Q, N, center=False): ''' Compute the 2D coordinates of each translate (in NxN DFT space) of every projection having angle in angles. Returns a list of u, v coordinate arrays [[u_0[...],v_0[...]], [u_1[...],v_1[...]], ...] per angle ''' coords = [] translateOffset = 0 translateMojette = 0 translateFinite = 0 m = 0 offset = 0.0 if center: offset = N / 2.0 for index, angle in enumerate(angles): u = [] v = [] coordinateList = [] p = int(angle.imag) q = int(angle.real) angleSign = p * q m, inv = farey.toFinite(angle, N) translateOffset, perp = farey.finiteTranslateOffset(angle, N) B = projectionLength(angle, P, Q) for translate in range(0, B): if angleSign >= 0 and perp: #Reverse for perp translateMojette = translateOffset - translate else: translateMojette = translate - translateOffset translateFinite = (inv * translateMojette ) % N #has issues in C, may need checking # frtSpace[m][translateFinite] += bin u.append((translateFinite + offset) % N) v.append((m * translateFinite + offset) % N) coordinateList.append(u) coordinateList.append(v) coords.append(coordinateList) return coords