Учитывая список длин и точку (x, y), я хотел бы узнать, пересекает ли круг с центром (a, b) радиусом 25 какие-либо линии. Все линии центрированы вокруг точки (x, y), имеют длину соответствующего индекса в списке длин, и все соседние линии имеют одинаковый «угол» (все линии расположены на равных расстояниях по углам)
Я пытался использовать Sympy, но, к сожалению, он очень медленный. Раньше моя игра работала со скоростью 50-60 кадров в секунду, но теперь она работает со скоростью 0,3-0,5 кадров в секунду. К сожалению, я не знаю, что вызывает все отставание, поэтому я покажу всю функцию:
# the point where the lines are centered around is represented by pl.x,pl.y
#sympy is imported as sym
def shotcheck(self,lines):
x,y = self.x,self.y #x and y represent the center of the circle
c = sym.Circle(sym.Point(x,y,evaluate=False),25)
diff = 2*math.pi/len(lines)
direction = math.acos((x-pl.x)/hypot((pl.x-x),(pl.y-y)))
if y < pl.y:
direction = 2*math.pi-direction
dfind = direction -0.005
lowline,highline = math.floor(dfind/diff),math.ceil(dfind/diff)
lline = sym.Segment(sym.Point(pl.x,pl.y,evaluate=False),sym.Point(pl.x+lines[lowline]*math.cos(a*lowline+0.005),pl.y+lines[lowline]*math.sin(a*lowline+0.005),evaluate=False))
hline = sym.Segment(sym.Point(pl.x,pl.y,evaluate=False),sym.Point(pl.x+lines[highline]*math.cos(a*highline+0.005),pl.y+lines[highline]*math.sin(a*highline+0.005),evaluate=False))
if len(sym.intersection(c,lline)) == 0 and len(sym.intersection(c,hline)) == 0:
return False
else:
return True #Returns True if intersecting
Я ожидал, что это будет работать прилично быстро, но это полностью снижает fps.
Что я могу сделать, чтобы это исправить?
Изменить: я обнаружил, что задержка вызвана sym.intersection. Как мне сделать это быстрее?