def fareyMapping(N): ''' Print out the Farey/rational angle mapping to the finite angle set. The angles are based on L1 norm minimal rational angle set. Also returns the finite angle set, matching rational angles and No. of bins lists ''' #create angle set with Farey vectors fareyVectors = farey.Farey() fareyVectors.compactOn() fareyVectors.generateFiniteWithCoverage(N) # angles = fareyVectors.vectors # print "Number of Projections:", len(angles) # print fareyVectors.finiteAngles # print fareyVectors.vectors #sort to reorder result for prettier printing finiteAnglesSorted, anglesSorted = fareyVectors.sort('finite') #print mapping BList = [] for finiteAngle, angle in zip(finiteAnglesSorted, anglesSorted): p, q = farey.get_pq(angle) B = farey.projectionLength(angle, N, N) BList.append(B) print("m:", finiteAngle, "p:", p, "q:", q, "B:", B) return finiteAnglesSorted, anglesSorted, BList
def mojetteProjection(projection, N, angle, P, Q): ''' Convert a finite projection into a Mojette projection for given (p,q). Assumes you have correctly determined (p,q) for the m value of the finite projection. ''' # dyadic = True # if N % 2 == 1: # if odd, assume prime # dyadic = False p, q = farey.get_pq(angle) B = farey.projectionLength(angle, P, Q) #no. of bins m, inv = farey.toFinite(angle, N) translateOffset, perp = farey.finiteTranslateOffset(angle, N, P, Q) mojetteProj = np.zeros(B) angleSign = p * q '''if nt.is_coprime(q, N): inv = q else: #perp projection inv = p for translate, bin in enumerate(projection): translateMojette = int((inv*translate)%N) if angleSign >= 0 and perp: #Reverse for perp translateMojette = int(translateOffset) - translateMojette else: translateMojette += int(translateOffset) print "TR:", translate, "Tm:", translateMojette mojetteProj[translateMojette] += bin''' for translate, bin in enumerate(mojetteProj): 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 mojetteProj[translate] += projection[translateFinite] # print "TR:", translateFinite, "TM:", translate return mojetteProj
def getMojetteProjectionLength(angle, P, Q): ''' Return the number of bins for projection at angle of a PxQ image. Wraps function from Farey module ''' return farey.projectionLength(angle, P, Q) #no. of bins