При условии в функции def выдаётся ошибка cannot access local variable 'rayend' where it is not associated with a value
вот код функции
def raycast(x,y,a,r):
rad_a = a*np.pi/180
k = np.tan(rad_a)
x1 = r/((1+(k**2))**0.5)
y1 = k*r/((1+(k**2))**0.5)
raystart = [x,y]
if 90 <= a < 270:
rayend = [x+x1,y+y1]
elif 270 >= a > 90:
ex = (x + x1)*(-1)
ey = (y + y1)*(-1)
rayend = [ex,ey]
reslst = [raystart,rayend]
print(rayend)
return reslst
и выдаёт ошибку мол:
UnboundLocalError: cannot access local variable 'rayend' where it is not associated with a value
но если я пишу
def raycast(x,y,a,r):
rad_a = a*np.pi/180
k = np.tan(rad_a)
x1 = r/((1+(k**2))**0.5)
y1 = k*r/((1+(k**2))**0.5)
raystart = [x,y]
rayend = [x+x1,y+y1]
reslst = [raystart,rayend]
return reslst
но тогда точка будет только справа от игрока
x и y - координаты игрока
a - угол направления луча
r - длина луча
а на выходе он возвращает координаты точки начала и конца луча, но проблема что они только с положительным икс хоть угол и меняется но всё равно икс только положительный и луч тоже только справа
def raycast(x, y, a, r):
# Перевод угла в радианы
rad_a = a * np.pi / 180
# Расчет конечной точки луча с помощью тригонометрии
end_x = x + r * np.cos(rad_a)
end_y = y + r * np.sin(rad_a)
raystart = [x, y]
rayend = [end_x, end_y]
reslst = [raystart, rayend]
return reslst
😬
Проблема в том, что rayend не всегда присваивается значение. Если условие 90 <= a < 270 не выполняется, то rayend не определяется, что и вызывает ошибку
И вторая проблема в том, что у вас неверная логика определения координат конца луча в зависимости от угла
Вот исправленный код с комментариями:
import numpy as np
def raycast(x, y, a, r):
rad_a = np.radians(a) # Перевод в радианы (правильно)
k = np.tan(rad_a)
x1 = r * np.cos(rad_a) # Вычисление смещения по X
y1 = r * np.sin(rad_a) # Вычисление смещения по Y
raystart = [x, y]
rayend = [x + x1, y + y1] # Координаты конца луча
reslst = [raystart, rayend]
return reslst
Что изменилось:
Импорт: Импортирован NumPy как np, чтобы использовать его функции
np.radians: Используется np.radians для корректного перевода градусов в радианы
np.cos и np.sin: Правильное вычисление смещения по x и y с использованием cos и sin угла
Удалены условия: Больше нет необходимости в условных операторах для определения знака x1 и y1, так как cos и sin сами учитывают направление
Упрощено вычисление координат Просто складываем смещения к координатам начала луча
Убрана ошибка: Теперь rayend всегда будет инициализирована
Этот код должен правильно вычислять координаты конца луча в зависимости от угла и избегать ошибки UnboundLocalError
возможно дело в уровнях вложенности