2014-01-18 2 views
0

Я пишу программу python, в которой круг отскакивает от пользовательских линий. Есть несколько кругов, которые отскакивают от стены. Для каждого из них должно быть рассчитано кратчайшее расстояние от центра круга и шара. Я бы предпочел, чтобы этот код был очень эффективным, потому что мой текущий алгоритм сильно отстает от компьютера. Если точка a является начальной точкой, а точка b является конечной точкой, а точка c является центром, а r - радиусом, как бы вычислить кратчайшее расстояние между шаром? Этот алгоритм также должен работать, если X-координата шара находится вне диапазона координат x в сегменте AB.Обнаружение столкновений по кругу и линии в python tkinter

Пожалуйста, пост питон код

Любая помощь будет оценен по достоинству!

Вот что я до сих пор:

LineList список с 4-мя значениями, содержит начало и конец координат обращается пользовательских линий

центр является центром шара

global lineList, numobjects 
     if not(0 in lineList): 

      beginCoord = [lineList[0],lineList[1]] 

      endCoord = [lineList[2]-500,lineList[3]-500] 

      center = [xCoordinate[i],yCoordinate[i]+15] 

      distance1 = math.sqrt((lineList[1] - center[1])**2 + (lineList[0] - center[0])**2) 

      slope1 = math.tan((lineList[1] - lineList[3])/(lineList[0] - lineList[2])) 

      try: 
       slope2 = math.tan((center[1] - beginCoord[1])/(center[0]-beginCoord[0])) 

       angle1 = slope2 + slope1 

       circleDistance = distance1 * math.sin(angle1) 

      except: 

       #If the circle is directly above beginCoord 
       circleDistance = center[1] - lineList[1] 


      global numbounces 

      if circleDistance < 2 and circleDistance > -2: 

       print(circleDistance) 

       b = False 

       b2=False 

       if xCoordinate[i] < 0: 

        xCoordinate[i] += 1 

        speed1[i] *= -1 

        b=True 


       elif xCoordinate[i] > 0: 

        xCoordinate[i] -= 1 

        speed1[i] *= -1 

        b=True 


       if yCoordinate[i] < 0: 

        yCoordinate[i] += 1 

        speed2[i] *= -1 

        b2=True 


       elif yCoordinate[i] > 0: 

        yCoordinate[i] -= 1 

        speed2[i] *= -1 

        b2=True 


       if b and b2: 

       #Only delete the line if the ball reversed directions 

        numbounces += 1 

        #Add a ball after 5 bounces 

        if numbounces % 5 == 0 and numbounces != 0: 

         numobjects = 1 

         getData(numobjects) 
        canvas.delete("line") 

        lineList = [0,0,0,0] 

Diagram of circles

ответ

1

Не знаю, что среднее кратчайшее расстояние между мячом, но если вы хотите расчет точки, где окружность свяжется линию вы можете использовать SymPy, чтобы понять формулу:

from sympy import * 
from sympy.geometry import * 
x1, y1, x2, y2, xc, yc = symbols("x1,y1,x2,y2,xc,yc") 
p1 = Point(x1, y1) 
p2 = Point(x2, y2) 
pc = Point(xc, yc) 

line = Line(p1, p2) 
pline = line.perpendicular_line(pc) 
p = line.intersection(pline)[0] 
cse(p, symbols=numbered_symbols("t")) 

выход является:

([(t0, x1 - x2), (t1, y1 - y2), (t2, x1*y2 - x2*y1), (t3, t0**2 + t1**2)], 
[Point((t0**2*xc + t0*t1*yc - t1*t2)/t3, (t0*t1*xc + t0*t2 + t1**2*yc)/t3)]) 

это означает, что вы можете рассчитывать перпендикулярная точка как:

t0 = x1 - x2 
t1 = y1 - y2 
t2 = x1*y2 - x2*y1 
t3 = t0**2 + t1**2 

xp = (t0**2*xc + t0*t1*yc - t1*t2)/t3 
yp = (t0*t1*xc + t0*t2 + t1**2*yc)/t3  
+0

Да, это то, что я имел в виду. спасибо – user3129956

Смежные вопросы