Top.Mail.Ru
Ответы

При условии в функции def выдаётся ошибка cannot access local variable 'rayend' where it is not associated with a value

вот код функции

123456789101112131415
 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 

и выдаёт ошибку мол:

1
 UnboundLocalError: cannot access local variable 'rayend' where it is not associated with a value 

но если я пишу

123456789
 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 - длина луча
а на выходе он возвращает координаты точки начала и конца луча, но проблема что они только с положительным икс хоть угол и меняется но всё равно икс только положительный и луч тоже только справа

По дате
По рейтингу
Аватар пользователя
Оракул
4мес
12345678910111213
 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 
Аватар пользователя
Мастер
4мес

😬

Проблема в том, что 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

Что изменилось:

  1. Импорт: Импортирован NumPy как np, чтобы использовать его функции

  2. np.radians: Используется np.radians для корректного перевода градусов в радианы

  3. np.cos и np.sin: Правильное вычисление смещения по x и y с использованием cos и sin угла

  4. Удалены условия: Больше нет необходимости в условных операторах для определения знака x1 и y1, так как cos и sin сами учитывают направление

  5. Упрощено вычисление координат Просто складываем смещения к координатам начала луча

  6. Убрана ошибка: Теперь rayend всегда будет инициализирована


Этот код должен правильно вычислять координаты конца луча в зависимости от угла и избегать ошибки UnboundLocalError

Аватар пользователя
Мастер
4мес

возможно дело в уровнях вложенности