bool ScaleControl3D::picked(osg::Vec3 from, osg::Vec3 to, double &depth) { osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new osgUtil::LineSegmentIntersector(from, to); osgUtil::IntersectionVisitor ivisitor(intersector.get()); osg::Vec3f scale = _autoTransform->getScale(); _colliders->setMatrix( osg::Matrix::scale(scale) * _node->getMatrix() ); _colliders->accept(ivisitor); if (intersector->containsIntersections()) { osgUtil::LineSegmentIntersector::Intersection intersection = intersector->getFirstIntersection(); depth = intersection.ratio; if (intersection.drawable == _xCollider) { _axis = X; } else if (intersection.drawable == _yCollider) { _axis = Y; } else if (intersection.drawable == _zCollider) { _axis = Z; } else if (intersection.drawable == _allCollider) { _axis = ALL; } return true; } else { return false; } }
void scan_airspaces(const AircraftState state, const Airspaces& airspaces, const AirspaceAircraftPerformance& perf, bool do_report, const GeoPoint &target) { const fixed range(20000.0); Directory::Create(Path(_T("output/results"))); { AirspaceVisitorPrint pvisitor("output/results/res-bb-range.txt", do_report); for (const auto &i : airspaces.QueryWithinRange(state.location, range)) { const AbstractAirspace &airspace = i.GetAirspace(); pvisitor.Visit(airspace); } } { AirspaceVisitorClosest pvisitor("output/results/res-bb-closest.txt", airspaces.GetProjection(), state, perf); for (const auto &i : airspaces.QueryWithinRange(state.location, range)) { const AbstractAirspace &airspace = i.GetAirspace(); pvisitor.Visit(airspace); } } { AirspaceVisitorPrint pvi("output/results/res-bb-inside.txt", do_report); for (const auto &a : airspaces.QueryInside(state)) pvi.Visit(a.GetAirspace()); } { AirspaceIntersectionVisitorPrint ivisitor("output/results/res-bb-intersects.txt", "output/results/res-bb-intersected.txt", "output/results/res-bb-intercepts.txt", do_report, state, perf); airspaces.VisitIntersecting(state.location, target, ivisitor); } { const auto *as = FindSoonestAirspace(airspaces, state, perf, AirspacePredicateTrue()); if (do_report) { std::ofstream fout("output/results/res-bb-sortedsoonest.txt"); if (as) { fout << *as << "\n"; } else { fout << "# no soonest found\n"; } } } }
void scan_airspaces(const AircraftState state, const Airspaces& airspaces, const AirspaceAircraftPerformance& perf, bool do_report, const GeoPoint &target) { const fixed range(20000.0); Directory::Create(Path(_T("output/results"))); { AirspaceVisitorPrint pvisitor("output/results/res-bb-range.txt", do_report); airspaces.VisitWithinRange(state.location, range, pvisitor); } { AirspaceVisitorClosest pvisitor("output/results/res-bb-closest.txt", airspaces.GetProjection(), state, perf); airspaces.VisitWithinRange(state.location, range, pvisitor); } { const std::vector<Airspace> vi = airspaces.FindInside(state); AirspaceVisitorPrint pvi("output/results/res-bb-inside.txt", do_report); std::for_each(vi.begin(), vi.end(), CallVisitor<AirspaceVisitor>(pvi)); } { AirspaceIntersectionVisitorPrint ivisitor("output/results/res-bb-intersects.txt", "output/results/res-bb-intersected.txt", "output/results/res-bb-intercepts.txt", do_report, state, perf); airspaces.VisitIntersecting(state.location, target, ivisitor); } { const auto *as = FindSoonestAirspace(airspaces, state, perf, AirspacePredicateTrue()); if (do_report) { std::ofstream fout("output/results/res-bb-sortedsoonest.txt"); if (as) { fout << *as << "\n"; } else { fout << "# no soonest found\n"; } } } }
void AirspaceXSRenderer::Draw(Canvas &canvas, const ChartRenderer &chart, const Airspaces &database, const GeoPoint &start, const GeoVector &vec, const AircraftState &state) const { canvas.Select(*look.name_font); // Create IntersectionVisitor to render to the canvas AirspaceIntersectionVisitorSlice ivisitor( canvas, chart, settings, look, start, state); // Call visitor with intersecting airspaces database.VisitIntersecting(start, vec.EndPoint(start), ivisitor); }
void CrossSectionWindow::PaintAirspaces(Canvas &canvas, Chart &chart) { // Quit early if no airspace database available if (airspace_database == NULL) return; // Create IntersectionVisitor to render to the canvas AirspaceIntersectionVisitorSlice ivisitor(canvas, chart, settings_map.airspace, start, ToAircraftState(Basic(), Calculated())); // Call visitor with intersecting airspaces airspace_database->visit_intersecting(start, vec, ivisitor); }
void scan_airspaces(const AircraftState state, const Airspaces& airspaces, const AirspaceAircraftPerformance& perf, bool do_report, const GeoPoint &target) { const fixed range(20000.0); Directory::Create(_T("output/results")); AirspaceVisitorPrint pvn("output/results/res-bb-nearest.txt", do_report); const Airspace *nearest = airspaces.FindNearest(state.location); if (nearest != nullptr) { AirspaceVisitor &v = pvn; v.Visit(*nearest); } { AirspaceVisitorPrint pvisitor("output/results/res-bb-range.txt", do_report); airspaces.VisitWithinRange(state.location, range, pvisitor); } { AirspaceVisitorClosest pvisitor("output/results/res-bb-closest.txt", airspaces.GetProjection(), state, perf); airspaces.VisitWithinRange(state.location, range, pvisitor); } { const std::vector<Airspace> vi = airspaces.FindInside(state); AirspaceVisitorPrint pvi("output/results/res-bb-inside.txt", do_report); std::for_each(vi.begin(), vi.end(), CallVisitor<AirspaceVisitor>(pvi)); } { AirspaceIntersectionVisitorPrint ivisitor("output/results/res-bb-intersects.txt", "output/results/res-bb-intersected.txt", "output/results/res-bb-intercepts.txt", do_report, state, perf); airspaces.VisitIntersecting(state.location, target, ivisitor); } { AirspaceNearestSort ans(state.location); const AbstractAirspace* as = ans.find_nearest(airspaces, range); if (do_report) { std::ofstream fout("output/results/res-bb-sortednearest.txt"); if (as) { fout << *as << "\n"; } else { fout << "# no nearest found\n"; } } } { AirspaceSoonestSort ans(state, perf); const AbstractAirspace* as = ans.find_nearest(airspaces); if (do_report) { std::ofstream fout("output/results/res-bb-sortedsoonest.txt"); if (as) { fout << *as << "\n"; } else { fout << "# no soonest found\n"; } } } }
void scan_airspaces(const AIRCRAFT_STATE state, const Airspaces& airspaces, const AirspaceAircraftPerformance& perf, bool do_report, const GeoPoint &target) { const fixed range(20000.0); const std::vector<Airspace> vn = airspaces.scan_nearest(state.Location); AirspaceVisitorPrint pvn("results/res-bb-nearest.txt", do_report); std::for_each(vn.begin(), vn.end(), CallVisitor<AirspaceVisitor>(pvn)); { AirspaceVisitorPrint pvisitor("results/res-bb-range.txt", do_report); airspaces.visit_within_range(state.Location, range, pvisitor); } { AirspaceVisitorClosest pvisitor("results/res-bb-closest.txt", state, perf); airspaces.visit_within_range(state.Location, range, pvisitor); } { const std::vector<Airspace> vi = airspaces.find_inside(state); AirspaceVisitorPrint pvi("results/res-bb-inside.txt", do_report); std::for_each(vi.begin(), vi.end(), CallVisitor<AirspaceVisitor>(pvi)); } { AirspaceIntersectionVisitorPrint ivisitor("results/res-bb-intersects.txt", "results/res-bb-intersected.txt", "results/res-bb-intercepts.txt", do_report, state, perf); GeoVector vec(state.Location, target); airspaces.visit_intersecting(state.Location, vec, ivisitor); } { AirspaceNearestSort ans(state.Location); const AbstractAirspace* as = ans.find_nearest(airspaces, range); if (do_report) { std::ofstream fout("results/res-bb-sortednearest.txt"); if (as) { fout << *as << "\n"; } else { fout << "# no nearest found\n"; } } } { AirspaceSoonestSort ans(state, perf); const AbstractAirspace* as = ans.find_nearest(airspaces); if (do_report) { std::ofstream fout("results/res-bb-sortedsoonest.txt"); if (as) { fout << *as << "\n"; } else { fout << "# no soonest found\n"; } } } }