Пример #1
0
def grid(gs):

    g = gs + 1
    beta = math.sqrt(np.pi / 6)
    num = 300

    h_x = np.linspace(-beta, beta, g)
    h_y = np.linspace(-beta, beta, num)
    hl = np.transpose([np.tile(h_x, len(h_y)), np.repeat(h_y, len(h_x))])
    h_z = np.zeros(len(hl))
    h_z.fill(beta)
    hln = np.column_stack((hl[:, 0], hl[:, 1], h_z))
    hln = np.concatenate((hln, np.column_stack((hl[:, 0], hl[:, 1], -h_z))))
    hln = np.concatenate((hln, np.column_stack((hl[:, 0], h_z, hl[:, 1]))))
    hln = np.concatenate((hln, np.column_stack((hl[:, 0], -h_z, hl[:, 1]))))
    hln = np.concatenate((hln, np.column_stack((h_z, hl[:, 0], hl[:, 1]))))
    hln = np.concatenate((hln, np.column_stack((-h_z, hl[:, 0], hl[:, 1]))))

    v_x = np.linspace(-beta, beta, num)
    v_y = np.linspace(-beta, beta, g)
    vl = np.transpose([np.tile(v_x, len(v_y)), np.repeat(v_y, len(v_x))])
    vln = np.column_stack((vl[:, 0], vl[:, 1], h_z))
    vln = np.concatenate((vln, np.column_stack((vl[:, 0], vl[:, 1], -h_z))))
    vln = np.concatenate((vln, np.column_stack((vl[:, 0], h_z, vl[:, 1]))))
    vln = np.concatenate((vln, np.column_stack((vl[:, 0], -h_z, vl[:, 1]))))
    vln = np.concatenate((vln, np.column_stack((h_z, vl[:, 0], vl[:, 1]))))
    vln = np.concatenate((vln, np.column_stack((-h_z, vl[:, 0], vl[:, 1]))))

    grid_lines = np.concatenate((hln, vln))
    grid_lines_sphr = GBt.unique_rows_tol(mf.cube2sphr_2d(grid_lines), tol=1e-06)
    return grid_lines_sphr
Пример #2
0
def pick_ctr(bp, l_rcsl_go, mt_cslr_go, grid_ctr, tol=1e-06):
    bpn = np.copy(bp)
    if len(bpn) == 1:
        return bpn, np.array([])
    bpn_sphr = mf.cube2sphr_2d(bpn)
    mil_sphr = np.dot(np.linalg.inv(l_rcsl_go), bpn_sphr.transpose()).transpose()
    mil_sphr = GBim.int_finder(mil_sphr, tol=1e-06, order="rows")
    d_inv_sqr = np.diag(np.dot(np.dot(mil_sphr, mt_cslr_go), mil_sphr.transpose()))

    d_inv_sqr_min = np.min(d_inv_sqr)
    cond = np.abs(d_inv_sqr - d_inv_sqr_min) <= tol
    # ind1 = np.where(cond)
    bpn_min = bpn[cond]
    num_bpn_min = len(bpn_min)
    d_ctr = np.zeros(num_bpn_min)
    for ct1 in range(num_bpn_min):
        pt = bpn_min[ct1]
        d_ctr[ct1] = np.sqrt((grid_ctr[0] - pt[0]) ** 2 + (grid_ctr[1] - pt[1]) ** 2)
    ind = np.argsort(d_ctr)
    bpn_pick = bpn_min[ind][0]

    ind_r = np.where((bpn[:, 0] == bpn_pick[0]) & (bpn[:, 1] == bpn_pick[1]) & (bpn[:, 2] == bpn_pick[2]))[0]

    return bpn_pick, ind_r
Пример #3
0
def bpn_in_grid(bpn, grid, n, l_rcsl_go, mt_rcsl_go, tol=1e-06):

    bpn_c = mf.sphr2cube_2d(bpn)
    beta = math.sqrt(np.pi / 6)

    cond1 = abs(bpn_c[:, 0] - beta) < tol
    bpn1 = np.copy(bpn_c[cond1])
    bpn11 = bpn1[:, [1, 2]]
    bpn_c = np.delete(bpn_c, np.where(cond1)[0], 0)

    cond2 = abs(bpn_c[:, 0] + beta) < tol
    bpn2 = np.copy(bpn_c[cond2])
    bpn22 = bpn2[:, [1, 2]]
    bpn_c = np.delete(bpn_c, np.where(cond2)[0], 0)

    cond3 = abs(bpn_c[:, 1] - beta) < tol
    bpn3 = np.copy(bpn_c[cond3])
    bpn33 = bpn3[:, [2, 0]]
    bpn_c = np.delete(bpn_c, np.where(cond3)[0], 0)

    cond4 = abs(bpn_c[:, 1] + beta) < tol
    bpn4 = np.copy(bpn_c[cond4])
    bpn44 = bpn4[:, [2, 0]]
    bpn_c = np.delete(bpn_c, np.where(cond4)[0], 0)

    cond5 = abs(bpn_c[:, 2] - beta) < tol
    bpn5 = np.copy(bpn_c[cond5])
    bpn55 = bpn5[:, [0, 1]]
    bpn_c = np.delete(bpn_c, np.where(cond5)[0], 0)

    cond6 = abs(bpn_c[:, 2] + beta) < tol
    bpn6 = np.copy(bpn_c[cond6])
    bpn66 = bpn6[:, [0, 1]]
    bpn_c = np.delete(bpn_c, np.where(cond6)[0], 0)

    if len(bpn_c) != 0:
        raise "Algorithm is incorrect!"
    bpn_cc = [bpn11, bpn22, bpn33, bpn44, bpn55, bpn66]
    num_bpn = 6 * n * n
    bpn_grid = np.zeros((num_bpn, 3))

    for ct1 in range(len(bpn_cc)):
        bpn_l = bpn_cc[ct1]
        for ct2 in range(len(grid)):
            num_bpn = num_bpn - 1

            g = grid[ct2]
            g_x = g[0]
            g_y = g[1]
            a_lt_u = g_x + beta / n
            a_lt_l = g_x - beta / n
            b_lt_u = g_y + beta / n
            b_lt_l = g_y - beta / n

            tol1 = 1e-06
            cond1a = (a_lt_l - bpn_l[:, 0]) < tol1
            cond1b = (bpn_l[:, 0] - a_lt_u) < tol1
            cond1 = cond1a & cond1b
            cond2a = (b_lt_l - bpn_l[:, 1]) < tol1
            cond2b = (bpn_l[:, 1] - b_lt_u) < tol1
            cond2 = cond2a & cond2b
            cond = cond1 & cond2

            if np.any(cond):
                if ct1 == 0:
                    bpn_pick, ind = pick_ctr(bpn1, l_rcsl_go, mt_rcsl_go, g)
                    bpn1 = np.delete(bpn1, ind, 0)
                    bpn_grid[num_bpn, :] = bpn_pick
                elif ct1 == 1:
                    bpn_pick, ind = pick_ctr(bpn2, l_rcsl_go, mt_rcsl_go, g)
                    bpn2 = np.delete(bpn2, ind, 0)
                    bpn_grid[num_bpn, :] = bpn_pick
                elif ct1 == 2:
                    bpn_pick, ind = pick_ctr(bpn3, l_rcsl_go, mt_rcsl_go, g)
                    bpn3 = np.delete(bpn3, ind, 0)
                    bpn_grid[num_bpn, :] = bpn_pick
                elif ct1 == 3:
                    bpn_pick, ind = pick_ctr(bpn4, l_rcsl_go, mt_rcsl_go, g)
                    bpn4 = np.delete(bpn4, ind, 0)
                    bpn_grid[num_bpn, :] = bpn_pick
                elif ct1 == 4:
                    bpn_pick, ind = pick_ctr(bpn5, l_rcsl_go, mt_rcsl_go, g)
                    bpn5 = np.delete(bpn5, ind, 0)
                    bpn_grid[num_bpn, :] = bpn_pick
                elif ct1 == 5:
                    bpn_pick, ind = pick_ctr(bpn6, l_rcsl_go, mt_rcsl_go, g)
                    bpn6 = np.delete(bpn6, ind, 0)
                    bpn_grid[num_bpn, :] = bpn_pick

                bpn_l = np.delete(bpn_l, ind, 0)
            else:
                raise "Insufficient normals to sample!"

    bpn_grid_sphr = mf.cube2sphr_2d(bpn_grid)
    return bpn_grid_sphr