great_circle::arc great_circle::arc::shortest_path( const coordinates &c ) const { Eigen::Vector3d cc(c.to_cartesian()); if (angle() == 0) { return arc(cc, begin()); } if (has_inside(c)) { return arc(cc, cc); } Eigen::Vector3d n = end() - begin(); Eigen::Vector3d p((n*(n.dot(cc - begin())))/n.dot(n) + begin()); boost::optional< coordinates > t = intersection_with(arc(p, cc)); if (! t) { arc a1(cc, begin()); arc a2(cc, end()); return a1.angle() < a2.angle() ? a1 : a2; } return arc(cc, *t); }
const zone_data *zone_manager::get_bottom_zone( const tripoint &where ) const { for( auto it = zones.rbegin(); it != zones.rend(); ++it ) { const auto &zone = *it; if( zone.has_inside( where ) ) { return &zone; } } auto vzones = g->m.get_vehicle_zones( g->get_levz() ); for( auto it = vzones.rbegin(); it != vzones.rend(); ++it ) { const auto zone = *it; if( zone->has_inside( where ) ) { return zone; } } return nullptr; }
bool great_circle::arc::has_inside( const coordinates& p ) const { return has_inside(p.to_cartesian()); }