closest_approach[n: posnat]: THEORY %---------------------------------------------------------------------------- % We compute the closest point of approach (CPA) between two % points that are dynamically moving in a straight line. This is % an important computation in collision detection. For example, % to calculate the time and distance of two planes (represented as % line vectors) when they are at their closest point. % % We use time-parametric equations to represent the paths of the % two planes: % % p(t) = p0 + t*u q(t) = q0 + t*v % % Distance between D(t) is given by: % % D(t) = (u-v)*(u-v) t^2 + 2 * w0 * (u-v) t + w0*w0 % % where w0 = p0 - q0. This is a quadratic equation which has a minimum at -b/2a. % % Minimum separation therefore occurs at: % % t_cpa = -w0*(u-v)/sq(norm(u-v)) % % where w0 = p0 - q0 % % dist(L1,L2,t): MACRO nnreal = dist(loc(L1)(t),loc(L2)(t)) % dist(L1,L2): nnreal = dist(L1,L2,t_cpa(L1,L2)) % % We also introduce the following convenient predicates % % divergent?(p0,q0,u,v): bool = % FORALL (t: posreal): dist(p0,q0) < dist(p0+t*u,q0+t*v) % % dot_prop?(p0,q0,u,v): bool = (p0-q0)*(u-v) >= 0 % % and we prove there equivalence when u /= v. See "dot_prop_divergent". % % See % http://geometryalgorithms.com/Archive/algorithm_0106/algorithm_0106.htm % % for a very nice discussion. % % Author: Ricky Butler NASA Langley Research Center % %---------------------------------------------------------------------------- BEGIN
IMPORTING distance[n],
reals@quad_minmax
t,t0,t1,t2 : VAR real
a,b,c : VAR real
p0,q0,u,v,w0,wt: VAR Vector[n]
% ----- time of closest point of approach --------
time_closest(p0,q0,u,v): real = IF norm(u-v) = 0 THEN% parallel, eq speed
0 ELSE
-((p0-q0)*(u-v))/sq(norm(u-v)) ENDIF
time_closest_lem: LEMMA norm(u-v) /= 0 AND
a = (u-v)*(u-v) AND
b = 2*(p0-q0)*(u-v) IMPLIES
time_closest(p0,q0,u,v) = -b/(2*a)
% ----- time of closest point of approach between p(t) and q0
time_closest(p0,q0,u): MACRO real = time_closest(p0,q0,u,zero)
dist_closest(p0,q0,u,v): MACRO nnreal = LET t_cpa=time_closest(p0,q0,u,v) IN
dist(p0+t_cpa*u, q0+t_cpa*v)
% ----- distance at closest point is indeed a minimum -------
t_cpa: VAR real
d_cpa: VAR nnreal
cpa_prep_mono: LEMMA w0 = p0 - q0 AND
a = (u-v)*(u-v) AND
b = 2*w0*(u-v) AND
c = w0*w0 AND
t_cpa = time_closest(p0,q0,u,v) AND
norm(u-v) /= 0 AND
t_cpa <= t1 AND t1 < t2 IMPLIES LET D2 = (LAMBDA t: sq_dist(p0+t*u,q0+t*v)) IN
D2(t1) < D2(t2)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.