Пример #1
0
def createFractal4(reduction, N, proportion):
    #parameters
    M = 2*N
    twoQuads = True
    angles, lengths = mojette.angleSet_Symmetric(N,N,1,True,50)
    perpAngle = farey.farey(1,0)
    angles.append(perpAngle)
    powerSpect = np.zeros((M,M))

    #compute lines
    centered = True
    mLines = []
    sLines = []
    mValues = []
    sValues = []
    pValues = []
    qValues = []
    for angle in angles:
        m, s, p, q, inv = farey.toFinite(angle, M)
        pValues.append(p)
        qValues.append(q)
        if m not in mValues and m < M:
            u, v = radon.getSliceCoordinates2(m, powerSpect, centered, M)
            mLines.append((u,v))
            mValues.append(m)
        
        #second quadrant
        if twoQuads:
            if m != 0 and m != M: #dont repeat these
                m = M-m
                if m not in mValues and m < M:
                    u, v = radon.getSliceCoordinates2(m, powerSpect, centered, M)
                    mLines.append((u,v))
                    mValues.append(m)
                    i = (len(mValues)+len(sValues))/float(M)
                    if i >= 1:
                        break

    ss = []
    ss.append(M)
    ss.extend(range(0, N/2))

    maxLines = len(ss)
    for i,s in enumerate(ss):
        u, v = radon.getSliceCoordinates2(s, powerSpect, centered, M)
        sLines.append((u,v))
        sValues.append(s)
        i = (len(mValues)+len(sValues))/float(M)
        if i >= 1.5:
            break

    length = 0

    fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(16, 8))

    plt.gray()
    plt.tight_layout()

    maxLines = len(sLines+mLines)
    i = 0
    ax[0].imshow(powerSpect)
    ax[1].imshow(powerSpect)
    color=iter(cm.jet(np.linspace(0,1,maxLines+1)))
    fareyImage = np.zeros_like(powerSpect)
    fareyImage1 = np.zeros_like(powerSpect)
    for i, sLine in enumerate(sLines):
        u, v = sLine
        ax[1].plot(u, v, '.w',markersize=1)
        fareyImage[u,v] = 1
        length = length + 1
        i = np.count_nonzero(fareyImage)/float((M*M))
        if i >= reduction*proportion:
            break

    maxLines = len(mLines)
    for i, mLine in enumerate(mLines):
        u, v = mLine
        ax[0].plot(u, v, '.r', markersize=1)
        ax[1].plot(u, v, '.r',markersize=1)
        fareyImage[u,v] = 1
        fareyImage1[u,v] = 1
        length = length + 1
        i = np.count_nonzero(fareyImage)/float((M*M))
        if i >= reduction:
            break

    print("Proportion of M:", (length/float(M)))

    print("Non-zero elements with holes: ", np.count_nonzero(fareyImage1)/float((M*M)) * 100)
    print("Non-zero elements without holes: ", np.count_nonzero(fareyImage)/float((M*M)) * 100)

    print("Absolute difference percentage extra filled in is ", (np.count_nonzero(fareyImage)- np.count_nonzero(fareyImage1))/float((M*M)) *100)

    withHoles = np.count_nonzero(fareyImage1)/float((M*M)) * 100
    withoutHoles = np.count_nonzero(fareyImage)/float((M*M)) * 100

    percentage = (withoutHoles - withHoles)/float(withHoles) * 100

    print("Percentage difference percentage extra filled in is ", percentage)
            
    ax[0].set_title('Sampling (colour per line) for dyadic size:'+str(M))
    ax[1].set_title('Sampling (same colour per line) for dyadic size:'+str(M))
    imageio.imsave("farey_image_"+str(M)+"_"+".png", fareyImage)
    plt.show()

    lines = mLines + sLines

    return fareyImage, lines
Пример #2
0
def angleSubSets_Symmetric(s, mode, P, Q, octant=0, binLengths=False, K=1):
    '''
    Generate the minimal L1 angle set for the MT for s subsets.
    Parameter K controls the redundancy, K = 1 is minimal.
    If octant is non-zero, full quadrant will be used. Octant schemes are as follows:
        If octant = -1, the opposing octant is also used.
        If octant = 0,1 (default), only use one octant.
        If octant = 2, octant will be mirrored from diagonal to form a quadrant.
        If octant = 4, 2 quadrants.
        If octant = 8, all quadrants.
    Function can also return bin lengths for each bin.
    '''
    angles = []
    subsetAngles = []
    for i in range(s):
        subsetAngles.append([])
    fareyVectors = farey.Farey()
    maxPQ = max(P, Q)

    fareyVectors.compactOff()
    fareyVectors.generate(maxPQ - 1, 1)
    vectors = fareyVectors.vectors
    sortedVectors = sorted(
        vectors, key=lambda x: x.real**2 + x.imag**2)  #sort by L2 magnitude

    index = 0
    subsetIndex = 0
    binLengthList = []
    angles.append(sortedVectors[index])
    subsetAngles[subsetIndex].append(sortedVectors[index])
    binLengthList.append(projectionLength(sortedVectors[index], P, Q))
    while not isKatzCriterion(P, Q, angles,
                              K) and index < len(sortedVectors):  # check Katz
        index += 1
        angles.append(sortedVectors[index])
        subsetAngles[subsetIndex].append(sortedVectors[index])
        p, q = farey.get_pq(sortedVectors[index])  # p = imag, q = real

        binLengthList.append(projectionLength(sortedVectors[index], P, Q))

        #        if isKatzCriterion(P, Q, angles):
        #            break

        if octant == 0:
            continue

        #add octants
        if octant == -1:
            nextOctantAngle = farey.farey(p, -q)  #mirror from axis
            angles.append(nextOctantAngle)
            subsetAngles[subsetIndex].append(nextOctantAngle)
            binLengthList.append(projectionLength(nextOctantAngle, P, Q))
            if mode == 1:
                subsetIndex += 1
                subsetIndex %= s
        if octant > 0 and p != q:
            nextOctantAngle = farey.farey(q, p)  #swap to mirror from diagonal
            angles.append(nextOctantAngle)
            subsetAngles[subsetIndex].append(nextOctantAngle)
            binLengthList.append(projectionLength(nextOctantAngle, P, Q))
            if mode == 1:
                subsetIndex += 1
                subsetIndex %= s
        if octant > 1:
            nextOctantAngle = farey.farey(p, -q)  #mirror from axis
            angles.append(nextOctantAngle)
            subsetAngles[subsetIndex].append(nextOctantAngle)
            binLengthList.append(projectionLength(nextOctantAngle, P, Q))
            if mode == 1:
                subsetIndex += 1
                subsetIndex %= s
            if p != q:  #dont replicate
                nextOctantAngle = farey.farey(
                    q, -p)  #mirror from axis and swap to mirror from diagonal
                angles.append(nextOctantAngle)
                subsetAngles[subsetIndex].append(nextOctantAngle)
                binLengthList.append(projectionLength(nextOctantAngle, P, Q))
                if mode == 1:
                    subsetIndex += 1
                    subsetIndex %= s

        if mode == 0:
            subsetIndex += 1
            subsetIndex %= s

    if octant > 1:  #add the diagonal and column projections when symmetric (all quadrant are wanted)
        nextOctantAngle = farey.farey(1, 0)  #mirror from axis
        angles.append(nextOctantAngle)
        subsetAngles[0].append(nextOctantAngle)
        binLengthList.append(projectionLength(nextOctantAngle, P, Q))

    if binLengths:
        return angles, subsetAngles, binLengthList
    return angles, subsetAngles
Пример #3
0
import numpy as np

#parameters
N = 512
M = 2*N
K = 1
twoQuads = True
print("N:", N, "M:", M)
#p = nt.nearestPrime(M)
#print("p:", p)
#pDash = nt.nearestPrime(N)
#print("p':", pDash)
#angles = mojette.angleSet_Finite(pDash, 2)
angles, lengths = mojette.angleSet_Symmetric(N,N,1,True,K) #here
#getProjectionCoordinates
perpAngle = farey.farey(1,0)
angles.append(perpAngle)
print("Number of Angles:", len(angles))
print("angles:", angles)

#powerSpect = np.zeros((p,p))
powerSpect = np.zeros((M,M))

#np.set_printoptions(threshold=np.nan)

#compute lines
print("Computing Finite lines...")
centered = True
lines = []
mValues = []
pValues = []
'''
Test for the pure independent modules for number theory
'''
import _libpath  #add custom libs
import finitetransform.numbertheory as nt
import finitetransform.farey as farey

x = 5
m = 641

##########
# test the multiplicative inverse mod m
inv = nt.minverse(x, m)
print inv

identity = (inv * x) % m
print identity

##########
# test the Farey finite vector function
vector = farey.farey(1, 2)
m = farey.toFinite(vector, m)
print vector, "->", m