Я пишу программу 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]
Да, это то, что я имел в виду. спасибо – user3129956