рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЬрд╡рд╛рдм рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ C ++ рдореЗрдВ рдРрд╕реА рдмрд╛рдд рд▓рд┐рдЦ рдХрд╛ рд╕рд╡рд╛рд▓, рд╢реБрд░реБрдЖрддреА рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ, рдХрд┐ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрдЬрд╛рдп рд╕рд░рд▓ рдкрдардиреАрдп рдХреЛрдб рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд╕рд╛рде рд╣реИ, рд╣реИредрд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ред рдореИрдВ рд╕реА ++ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрднреА рднреА рдЗрд╕ рдкрд░ рдХреЛрдИ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд╣реАрдВ рд▓рд┐рдЦрд╛, рдЕрдЬрдЧрд░ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреАред рдпрд╣рд╛рдБ рдЗрд╕ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдкреИрджрд╛ рд╣реБрдЖред рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдереА - рдореБрдЭреЗ рд▓рдЧрднрдЧ рдпрдХреАрди рдерд╛ рдХрд┐ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдлреНрд░реЗрдо рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдореЗрдВ рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛ рд╣реИред рдореИрдВ рдЧрд▓рдд рдерд╛редрдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдпрд╣рд╛рдБ рдХреЛрдб рдХреЛ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ рднрд╛рд╖рд╛ рдХреЗ рдЕрдВрддрд░ рдХреЛ, рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░haqreuред рдФрд░ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдкреНрд░рддрд┐рдкрд╛рджрди рд╣реЗ (рдПрди ^ 2) рд╣реИ - рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХреЛрдг рдФрд░ рджреВрд░реА рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдЫреЛрд░реЛрдВ:
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:
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):
x_cell = i * H
y_cell = j * H
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))
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
return result
result int( int, , ). , . python-, cdef тАФ python, cython. , python тАФ , :
cpdef int fun(int num, float val):
cdef int result
return result
cdef int fun2(int *arr, float* arr_2):
cdef int arr_3[10][10]
return result
fun2 python, - fun тАФ .
рд╕рд╛рдЗрдереЙрди рдиреЗ рдХреБрдЫ рддреНрд╡рд░рдг рджрд┐рдпрд╛, рдпрджреНрдпрдкрд┐ рдирдЧрдгреНрдп - рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдлреНрд░реЗрдо рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдирд╣реАрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдпрд╣ рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реИ - рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 8-9 рдЪрд┐рддреНрд░, рдЬреЛ рдХрд┐ рдЕрдЬрдЧрд░ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП 40% рд╣реИ рдФрд░ рдПрдХ рднреЛрд▓реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдореЗрдВ + 200% рд╣реИред рдпрд╣ рдЕрднреА рднреА рдПрдХ рдмрд╣реБрдд рд╣реА рдзреБрдВрдзрд▓реА рддрд╕реНрд╡реАрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреИрд╕реЗ рдХрд┐ pygame рдХреЛ рд▓реЗрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдпрд╛ рдЖрдорддреМрд░ рдкрд░ рдЕрдЬрдЧрд░ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдФрд░ рдХреБрдЫ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд▓реЗрдирд╛ рд╣реИредPS рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреЛрдб рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред