Модуль Sympy работает очень медленно - PullRequest
0 голосов
/ 25 мая 2019

Учитывая список длин и точку (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. Как мне сделать это быстрее?

...