Пример #1
0
def create_axicon(angle: float, is_isosceles: bool, lenght_of_side_ribs: float,
                  is_closed: bool, refr_coef_inside: float,
                  refr_coef_outside: float):
    """
    :param angle: the angle betweet OX and side rib (degree from 0 to 90)
    :param is_isosceles: if true, then the triangle is isosceles. Else rectangular.
    :param lenght_of_side_ribs: more than 0
    :param is_closed: if true, then list surfaces have 3 objects. Else 2.
    :return: list of the limited surfaces. Two vertex of axicon is on OX. One at point (0,0)
    """
    if not (refr_coef_inside >= 1 and refr_coef_outside >= 1):
        return None
    if not (angle > 0 and angle < 90):
        return None
    if not (lenght_of_side_ribs > 0):
        return None

    refr_coef = [refr_coef_inside, refr_coef_outside]
    length = lenght_of_side_ribs
    angle = angle * np.pi / 180
    sinA = np.sin(angle)
    cosA = -np.cos(angle)
    dir_vec = [cosA, sinA]
    x, y = [val * length for val in dir_vec]
    m = [[0, -1], [1, 0]]
    norm = list(np.dot(dir_vec, m))
    line1 = Plane([0, 0],
                  norm,
                  Surface.types.REFRACTING,
                  n1=refr_coef[0],
                  n2=refr_coef[1])
    line2 = None
    if is_isosceles:
        norm2 = norm.copy()
        norm2[1] *= -1
        line2 = Plane([0, 0],
                      norm2,
                      Surface.types.REFRACTING,
                      n1=refr_coef[0],
                      n2=refr_coef[1])
    else:
        line2 = Plane([0, 0], [0, -1],
                      Surface.types.REFRACTING,
                      n1=refr_coef[0],
                      n2=refr_coef[1])
    limits1 = [[x, 0], [0, y]]
    limits2 = [[x, 0], [-y, 0]]
    line1 = LimitedSurface(line1, limits1)
    line2 = LimitedSurface(line2, limits2)
    if is_closed:
        line3 = Plane([x, 0], [-1, 0],
                      Surface.types.REFRACTING,
                      n1=refr_coef[0],
                      n2=refr_coef[1])
        limits3 = [[x - np.finfo(float).eps, x + np.finfo(float).eps], [-y, y]]
        if not is_isosceles:
            limits3[1] = [0, y]
        line3 = LimitedSurface(line3, limits3)
        return (line1, line2, line3)
    return (line1, line2)
Пример #2
0
def draw_limits(surface: LimitedSurface,
                color: str = "black",
                alpha: float = 0.5):
    lim = surface.limits
    planes = [
        Plane([lim[0][0], 0], [1, 0]),
        Plane([lim[0][1], 0], [1, 0]),
        Plane([0, lim[1][0]], [0, 1]),
        Plane([0, lim[1][1]], [0, 1]),
    ]
    for plane in planes:
        draw_plane(plane, color=color, alpha=alpha)
Пример #3
0
def main():
    center = [1, 2, 1]
    abc = [1, 1, 1]
    ray: Ray = Ray([0, 0, 0], [1, 1, 1])
    ellipse1 = Ellipse(center=center,
                       ellipse_coefficients=abc,
                       type_surface=Ellipse.types.REFRACTING,
                       n1=1,
                       n2=1.33)
    plane = Plane([1, 1, 1], [0, 1, 1],
                  type_surface=Ellipse.types.REFRACTING,
                  n1=1,
                  n2=1.33)

    # way_point_of_ray = mctrl.model_path(ray, [ellipse1], is_have_ray_in_infinity=True)
    way_point_of_ray2 = mctrl.model_path(ray, [plane],
                                         is_have_ray_in_infinity=True)

    fig = plt.figure()
    ax = Axes3D(fig)
    ax.set_xlabel('X Label')
    ax.set_ylabel('Y Label')
    ax.set_zlabel('Z Label')

    # ellipse(ax, ellipse1.abc, ellipse1.center)
    # line(ax, way_point_of_ray[0], way_point_of_ray[1], way_point_of_ray[2], "g")
    line(ax, way_point_of_ray2[0], way_point_of_ray2[1], way_point_of_ray2[2],
         "g")
    plot_plane(ax, plane)

    plt.show()
Пример #4
0
 def get_plane_for_axicon(apex: List[Union[float, int]], height: (float, int), axis: str) -> Plane:
     """
         :return: object Plane locating in the base of cone
         :param apex apex of cone
         :param height height of the cone. It can be negative, but never be close to zero.
         Positive value mean
         :param type_of_surface type of surface. See Surface.types.
         :param axis - axis of space along what axicon is located.
         The first char mean axis along what axicon is located("x","y","z").
         :param n1 and n2 - refractive indexes of space. watch method get_refractive_indexes in class Surface
         :param kwargs - arguments for Surface class such as
         "polarisation_matrix_refract" or "polarisation_matrix_reflect"""
     if axis not in ("x", "y", "z"):
         raise ValueError(f"""The axis value is wrong - {axis}. It must have length 1.
     The first char mean axis along what cone is located("x","y","z").
                 """)
     normal = None
     if axis == "x":
         normal = (1, 0, 0)
     elif axis == "y":
         normal = (0, 1, 0)
     else:
         normal = (0, 0, 1)
     # center of the circle is the radius vector of the plane
     r_vec = np.add(apex, np.multiply(height, normal))
     normal = np.multiply(np.sign(height), normal)
     return Plane(r_vec, normal)
Пример #5
0
def tracing():
    # make pool
    points = ((-1, -1),
              (-0.9, 1))
    pool = Generator.generate_rays_2d(points[0], points[1], 5.)
    sq2 = np.sqrt(2)
    vec_jonson = [1 / sq2, complex(1, -1) / sq2]
    # vec_jonson = [1, 1]
    for i in range(len(pool)):
        pool.set_jones_vec(i, vec_jonson)

    # make plane
    norm = [1, 0]
    start = [0, 0]
    n1, n2 = 1, 1.33
    polar_mat = PolarMat(Generator.get_rot_mat_2d(np.pi / 4))
    plane = Plane(start, norm, type_surface=Plane.types.REFRACTING, n1=n1, n2=n2)
    plane.polar_matrix_refract = polar_mat
    surfaces = (plane,)

    # make param for tracing method
    add_functions = (rpc.change_ray_polar_state,)
    # trace
    pool_list = rpc.raytracing_ordered_surface_with_add_opt(pool, surfaces, False, add_functions)

    # drawing

    #   scene
    pylab.figure(0)
    #       surfaces
    for surface in surfaces:
        surface_view.draw_exist_surface(surface)
    #       rays
    for pool_to_draw in pool_list:
        ray_view.draw_ray_pool(pool_to_draw)
    pylab.grid()
    pylab.xlim(-2, 4)
    pylab.ylim(-2, 2)
    pylab.title(
        "Polarized light passed throw polarising surface\nPolarization matrix is a rotating matrix on angle pi/4")
    pylab.show()

    # polar state for every pool
    for i in range(len(pool_list)):
        pylab.figure(2 + i)
        vec_jo_to_draw = pool_list[i].jones_vec(0)
        title = f"Polar state for {i + 1} bean\n" + polarization.get_str_view_polar_vec(vec_jo_to_draw)
        polarization.draw_polar_ellipse(vec_jo_to_draw, title=title)
        pylab.grid()

    pylab.show()
Пример #6
0
def func_of_reading_surf_ray_from_strings(strings, dimension):
    d = dimension
    rays = []
    surfaces = []
    for s in strings:
        nums = np.fromstring(s[3:], dtype=float, count=-1, sep=' ')
        # p = plane s = sphere e = ellipse
        if s[0] == 'r':
            rays.append(Ray(nums[:d], nums[d:2 * d]))
        else:
            surface = None
            if s[0] == 'p':
                if s[1] == 't':
                    surface = Plane(nums[:d], nums[d:2 * d],
                                    Surface.types.REFRACTING,
                                    nums[len(nums) - 2], nums[len(nums) - 1])
                else:
                    surface = Plane(nums[:d], nums[d:2 * d])
            elif s[0] == 's':
                if s[1] == 't':
                    surface = Sphere(nums[:d], nums[d],
                                     Surface.types.REFRACTING,
                                     nums[len(nums) - 2], nums[len(nums) - 1])
                else:
                    surface = Sphere(nums[:d], nums[d])
            elif s[0] == 'e':
                if s[1] == 't':
                    surface = Ellipse(nums[:d], nums[d:2 * d],
                                      Surface.types.REFRACTING,
                                      nums[len(nums) - 2], nums[len(nums) - 1])
                else:
                    surface = Ellipse(nums[:d], nums[d:2 * d])
            if (surface != None):
                print('\tSUCCESS ' + str(surface))
                surfaces.append(surface)

    return rays, surfaces
Пример #7
0
    [2.8, 1])
axis_coeff = ([1.8, 2.5], [0.6, 0.3], [0.6, 0.28])
refr_indexes = ((1, 1.2), (1.2, 1.3), (1.2, 1.3))
surfaces = []

# for i in range(len(radius_vectors)):
#     surf = Ellipse(radius_vectors[i], axis_coeff[i],
#                    n1=refr_indexes[i][0], n2=refr_indexes[i][1],
#                    type_surface=Plane.types.REFRACTING)
#     surfaces.append(surf)
#     print(surf)

for i in range(len(radius_vectors)):
    surf = Plane(radius_vectors[i],
                 normal_vector=norm,
                 n1=refr_indexes[i][0],
                 n2=refr_indexes[i][1],
                 type_surface=Plane.types.REFRACTING)
    surfaces.append(surf)
    print(surf)

# %%

from controllers.ray_pool_ctrl import *

list_pool = deep_raytracing_with_add_opt(pool,
                                         surfaces,
                                         depth=4,
                                         surface_search_step=1)

for i in range(len(list_pool)):
Пример #8
0
from surfaces.analitic.sphere import Surface
from surfaces.limited_surface import LimitedSurface
import view.matlab.matlab_ray_view2D as vray
import view.matlab.matlab_surface_view2D as msv
import controllers.ray_pool_ctrl as rpmc

if __name__ == '__main__':
    p1 = [0, -1.9]
    p2 = [0, 1.9]
    intensive = 1

    # plane
    n_vec = [1, -1]
    r_vec = [0, 0]

    plane = Plane(r_vec, n_vec)
    sphere = Sphere(
        [3, 0],
        2,
        Surface.types.REFRACTING,
        1,
        1.3,
    )

    lim = [[1, 3.9], [-1, 1]]
    print("lim", lim, "\n")
    print(plane)

    limited = LimitedSurface(sphere, lim)
    lim_plane = LimitedSurface(plane, lim)