/** * Returns values indicating whether the ownship state will pass in front of or behind the intruder (from a horizontal perspective) * @param so ownship position * @param vo ownship velocity * @param si intruder position * @param vi intruder velocity * @return 1 if ownship will pass in front (or collide, from a horizontal sense), -1 if ownship will pass behind, 0 if divergent or parallel */ int VectFuns::passingDirection(const Vect3& so, const Velocity& vo, const Vect3& si, const Velocity& vi) { double toi = timeOfIntersection(so,vo,si,vi); double tii = timeOfIntersection(si,vi,so,vo); // these values may have opposite sign! //fpln("toi="+toi); //fpln("int = "+ intersection(so,vo,si,vi)); if (ISNAN(toi) || toi < 0 || tii < 0) return 0; Vect3 so3 = so.linear(vo, toi); Vect3 si3 = si.linear(vi, toi); //fpln("so3="+so3); //fpln("si3="+si3); if (behind(so3.vect2(), si3.vect2(), vi.vect2())) return -1; return 1; }
// The user needs to keep track of whether to translate back (i.e. whether original was LatLon()) Velocity AziEquiProjection::inverseVelocity(const Vect3& s, const Velocity& v, bool toLatLon) const { if (toLatLon) { double timeStep = 10.0; Vect3 s2 = s.linear(v,timeStep); LatLonAlt lla1 = inverse(s); LatLonAlt lla2 = inverse(s2); Velocity nv = GreatCircle::velocity_initial(lla1,lla2,timeStep); return nv; } else { return v; } }
ConflictData WCV_tvar::conflictDetection(const Vect3& so, const Velocity& vo, const Vect3& si, const Velocity& vi, double B, double T) const { LossData ret = WCV3D(so,vo,si,vi,B,T); double t_tca = (ret.getTimeIn() + ret.getTimeOut())/2; double dist_tca = so.linear(vo, t_tca).Sub(si.linear(vi, t_tca)).cyl_norm(table.getDTHR(),table.getZTHR()); return ConflictData(ret, t_tca,dist_tca,so.Sub(si),vo.Sub(vi)); }