рдЕрдЬрдЧрд░ рдореЗрдВ 3 рдбреА рддрд╕реНрд╡реАрд░ (рд▓рдЧрднрдЧ) рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде

рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЬрд╡рд╛рдм рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ C ++ рдореЗрдВ рдРрд╕реА рдмрд╛рдд рд▓рд┐рдЦ рдХрд╛ рд╕рд╡рд╛рд▓, рд╢реБрд░реБрдЖрддреА рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ, рдХрд┐ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрдЬрд╛рдп рд╕рд░рд▓ рдкрдардиреАрдп рдХреЛрдб рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд╕рд╛рде рд╣реИ, рд╣реИред

рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ред рдореИрдВ рд╕реА ++ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрднреА рднреА рдЗрд╕ рдкрд░ рдХреЛрдИ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд╣реАрдВ рд▓рд┐рдЦрд╛, рдЕрдЬрдЧрд░ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреАред рдпрд╣рд╛рдБ рдЗрд╕ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдкреИрджрд╛ рд╣реБрдЖред рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдереА - рдореБрдЭреЗ рд▓рдЧрднрдЧ рдпрдХреАрди рдерд╛ рдХрд┐ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдлреНрд░реЗрдо рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдореЗрдВ рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛ рд╣реИред рдореИрдВ рдЧрд▓рдд рдерд╛ред

рдЫрд╡рд┐

рдЫрд╡рд┐

рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдпрд╣рд╛рдБ рдХреЛрдб рдХреЛ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ рднрд╛рд╖рд╛ рдХреЗ рдЕрдВрддрд░ рдХреЛ, рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░haqreuред рдФрд░ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдкреНрд░рддрд┐рдкрд╛рджрди рд╣реЗ (рдПрди ^ 2) рд╣реИ - рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХреЛрдг рдФрд░ рджреВрд░реА рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдЫреЛрд░реЛрдВ:

         # iterating alpha
        alpha = player.view - player.fov / 2
        mapFB.drawRectangle(player.y - 1, player.x - 1, player.y + 1, player.x + 1, Color(255, 0, 0))
        rayNum = 0
        while alpha < player.fov / 2 + player.view:
            # iterating distance
            dist = 0
            x = player.x
            y = player.y
            while 0 < x < mapFB.w - 1 and 0 < y < mapFB.h - 1:
                  ...

рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдХреЛрдб рдзреАрдорд╛ рд╣реИ (рдореИрдВ 8 рд╡реАрдВ рдкреАрдврд╝реА рдХреЗ рдЗрдВрдЯреЗрд▓ рдХреЛрд░ i5 рдкрд░ 3-4 рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╕реЗ рдХрдо рдкрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛)ред

рдЪреАрдЬреЛрдВ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдФрд░ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдЖрдВрддрд░рд┐рдХ рд▓реВрдк рдХреЛ рд░реИрдЦрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рд╣реИред рдЪрд▓реЛ рдЧрдгрд┐рдд рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рдм рдХреБрдЫ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рд╣рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рдХреЛрдг рджреНрд╡рд╛рд░рд╛ рджреА рдЧрдИ рдХрд┐рд░рдг рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдмрд┐рдВрджреБ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдЖрдХрд╛рд░ (рд╕реНрдерд┐рд░, рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП) рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмреНрд▓реЙрдХред рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдирд┐рдХрдЯрддрдо рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдиреАрдЪреЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рд╣реИ (рдкреВрд░реНрдг рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ ):

def block_cross(i, j, k, y_0, alpha, player):
    # cell coordinates
    x_cell = i * H
    y_cell = j * H
    # find collision points
    collisions = []

    if k != 0:
        x = (y_cell - y_0) / k
        y = y_cell
        if x_cell <= x <= x_cell + H and (x - player.x) / cos(alpha) < 0:
            collisions.append((x, y))

    if k != 0:
        x = (y_cell + H - y_0) / k
        y = y_cell + H
        if x_cell <= x <= x_cell + H and (x - player.x) / cos(alpha) < 0:
            collisions.append((x, y))

    x = x_cell
    y = y_0 + x * k
    if y_cell <= y <= y_cell + H and (x - player.x) / cos(alpha) < 0:
        collisions.append((x, y))

    x = x_cell + H
    y = y_0 + (x) * k
    if y_cell <= y <= y_cell + H and (x - player.x) / cos(alpha) < 0:
        collisions.append((x, y))

    # select the closest collision for the block
    dist = 1000 * H
    x = None
    y = None
    for collision in collisions:
        tmp = sqrt((collision[0] - player.x) ** 2 + (collision[1] - player.y) ** 2)
        if tmp < dist:
            dist = tmp;
            x = collision[0]
            y = collision[1]

    return x, y, dist

10 рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдРрд╕рд╛ рддреБрдЪреНрдЫ рдкрд░рд┐рд╡рд░реНрддрди рджреЛрд╣рд░реЗ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рддреНрд╡рд░рдг рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд▓рдЧрднрдЧ 5-6 рдлреНрд░реЗрдоред рдпрд╣ рдЕрдм рдЭрдЯрдХреЗ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЪрд▓рддреА рд╣реБрдИ рддрд╕реНрд╡реАрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХрд╛рдлреА рдзреАрдореА рд╣реИред
рдХреЛрдб рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, рдореИрдВ рд╕рд╛рдЗрдерди рдореЗрдВ рдЖрдпрд╛ ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЕрдЬрдЧрд░ рдХреЛрдб рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреНрд╡рд░рдг рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ - рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдХреЗ рддрд╣рддред

tyts
 cpdef int fun(int num, float val):
    cdef int result
    # do some stuff
    return result

result int( int, , ). , . python-, cdef тАФ python, cython. , python тАФ , :

 cpdef int fun(int num, float val):
    cdef int result
    # do some stuff
    return result

 cdef int fun2(int *arr, float* arr_2):
    cdef int arr_3[10][10]
    # do some stuff
    return result

fun2 python, - fun тАФ .

рд╕рд╛рдЗрдереЙрди рдиреЗ рдХреБрдЫ рддреНрд╡рд░рдг рджрд┐рдпрд╛, рдпрджреНрдпрдкрд┐ рдирдЧрдгреНрдп - рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдлреНрд░реЗрдо рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдирд╣реАрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдпрд╣ рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реИ - рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 8-9 рдЪрд┐рддреНрд░, рдЬреЛ рдХрд┐ рдЕрдЬрдЧрд░ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП 40% рд╣реИ рдФрд░ рдПрдХ рднреЛрд▓реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдореЗрдВ + 200% рд╣реИред рдпрд╣ рдЕрднреА рднреА рдПрдХ рдмрд╣реБрдд рд╣реА рдзреБрдВрдзрд▓реА рддрд╕реНрд╡реАрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреИрд╕реЗ рдХрд┐ pygame рдХреЛ рд▓реЗрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдпрд╛ рдЖрдорддреМрд░ рдкрд░ рдЕрдЬрдЧрд░ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдФрд░ рдХреБрдЫ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд▓реЗрдирд╛ рд╣реИред

PS рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреЛрдб рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред

Source: https://habr.com/ru/post/undefined/


All Articles