Я хочу вычислить время пересечения двух движущихся объектов.
C - это мой объект-преследователь, а A - целевой объект. Входные данные должны быть такими:
C_position C_speed
A_position A_speed
A_direction
1.) Для этого сценария я использую квадратичное c уравнение.
import math
def intersect(chaser,target):
dist= distance(chaser,target)
dir=direction(chaser,target)
alpha= math.pi + dir - target['dir']
if chaser["vel"]== target["vel"]:
if math.cos(alpha)<0:
return None
return (dir + alpha) % (math.pi * 2)
a= chaser["vel"]**2 - target["vel"]**2
b=2*dist*target["vel"]*math.cos(alpha)
c= -(dist**2)
if dist<0:
return None
delta=math.sqrt((b**2)-(4*a*c))
time=(-b + delta)/(2*a)
time_2=(-b - delta)/(2*a)
x=target["x"]+target["vel"]*time*math.cos(target["dir"])
y=target["y"]+target["vel"]*time*math.sin(target["dir"])
x_2 = target["x"] + target["vel"] * time_2 * math.cos(target["dir"])
y_2= target["y"] + target["vel"] * time_2 * math.sin(target["dir"])
angle=direction(chaser,{"x":x,"y":y})
return x,y,time,x_2,y_2,time_2,angle
def distance(p,q):
return math.sqrt((p["x"]-q["x"])**2 + (p["y"]-q["y"])**2)
def direction(p,q):
return math.atan2(q["y"]-p["y"],q["x"]-p["x"])
chaser={"x":0,"y":0,"vel":50}
target={"x":125,"y":175,"vel":25,"dir":1.96}
print(intersect(chaser,target))
direction(chaser,target)
2.) Во втором сценарии используйте итеративное и снова метод quadrati c, входные данные должны быть такими:
C_position C_speed
A_position A_speed
B_position (показывает направление A)
Для этого сценария используйте этот код:
import math
class Object:
ax = None
ay = None
bx = None
by = None
cx = None
cy = None
def __init__(self,speed_a,speed_c,a={"x":ax,"y":ay},b={"x":bx,"y":by},c={"x":cx,"y":cy}):
self.a = a
self.b = b
self.c = c
self.speed_a = speed_a
self.speed_c = speed_c
def findTheBetterIntersection(self,a, b, c):
atobtime = self.getMaxTime(a,b,self.speed_a)
if (atobtime <= self.getMaxTime(c,b,self.speed_c)):
return b["x"],b["y"],self.getMaxTime(c,b,self.speed_c)
t=self.getOptimalIntersectionTime(a,b,c,atobtime)
t2=self.getTimeQuadratic(a,b,c)
coords=self.getCoordAtTime(a,b,self.speed_a,t)
return {"x":coords["x"],"y":coords["y"]} ,t ,t2
def getTimeQuadratic(self,a,b,c):
azero=self.translateToZero(a,c)
bzero=self.translateToZero(b,c)
czero=c
czero["x"]=0
czero["y"]=0
cTime=self.getMaxTime(a,b,self.speed_a)
v = {"x":(b["x"]-a["x"]/cTime),"y":(b["y"]- a["y"]/cTime)}
quadC=math.pow(azero["x"],2) + math.pow(azero["y"],2)
quadB=(2 * azero["x"] * v["x"] + 2 * azero["y"] * v["y"])
quadA=math.pow(v["x"],2) + math.pow(v["y"],2) - math.pow(self.speed_c,2)
delta=math.pow(quadB,2) - (4 * quadA * quadC)
if delta>0:
x1 = (-quadB + math.sqrt(math.pow(quadB, 2) - (4 * quadA * quadC))) / (2 * quadA)
x2 = (-quadB - math.sqrt(math.pow(quadB, 2) - (4 * quadA * quadC))) / (2 * quadA)
if x2 > x1 and x2 > 0:
return x2
return x1
else:
return None
def translateToZero(self,source,dest):
s= {"x":source["x"] - dest["x"],"y":source["y"] - dest["y"]}
return s
def getOptimalIntersectionTime(self,a,b,c,time):
coordATime=self.getCoordAtTime(a,b,self.speed_a,time)
coordCTime=self.getCoordAtTime(c,coordATime,self.speed_c,time)
cMaxTime=self.getMaxTime(c,coordATime,self.speed_c)
if self.getDistance(coordATime,coordCTime) <= 1:
return time
if time < cMaxTime :
return self.getOptimalIntersectionTime(a,b,c,time*1.5)
else:
return self.getOptimalIntersectionTime(a,b,c,time*0.5)
def getMaxTime(self,coordinates,direction,speed):
time=self.getDistance(coordinates,direction)/speed
if time <=0 :
return 0.000001
return time
def getCoordAtTime(self,coordinates,direction,speed,time):
if not direction:
return coordinates
current = time/self.getMaxTime(coordinates,direction,speed)
return {"x":math.floor(coordinates["x"] + (direction["x"] - coordinates["x"])* current) ,
"y":math.floor(coordinates["y"] + (direction["y"] - coordinates["y"])* current)}
def getDistance(self,a,b):
return math.sqrt(math.pow(b["x"]-a["x"],2) + math.pow(b["y"] - a["y"],2))
object = Object(25,50,{"x":125,"y":150},{"x":-3.4975,"y":9.2521},{"x":0,"y":0})
print(object.findTheBetterIntersection({"x":125,"y":150},{"x":-3.4975,"y":9.2521},{"x":0,"y":0}))
Я хочу проверить свой ответ, чтобы преобразовать 1,96 радиуса в полярные координаты с r = 10. Как бы то ни было, ответы различаются.
Можете ли вы объяснить ниже, пожалуйста,
Почему первый и второй код итеративный метод дает разные результаты?
Почему итерационный и квадратичный c метод второго кода дает разные результаты?
(Ссылки : Найди лучшее пересечение сечение двух движущихся объектов
пересечение двух движущихся объектов с координатами широты / долготы )