From c622f38008b6a8e46cb58a54397a1afeaf9731de Mon Sep 17 00:00:00 2001 From: Zyro9922 Date: Wed, 26 Aug 2020 12:32:55 +0530 Subject: [PATCH 1/4] LST can be now computed using time or gst --- .../boost/astronomy/time/time_conversions.hpp | 57 ++++++++++++------- test/Jamfile | 2 + 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/include/boost/astronomy/time/time_conversions.hpp b/include/boost/astronomy/time/time_conversions.hpp index b164263d..2e19ed8c 100644 --- a/include/boost/astronomy/time/time_conversions.hpp +++ b/include/boost/astronomy/time/time_conversions.hpp @@ -66,36 +66,49 @@ decimal_hour GST(ptime t) enum class DIRECTION {WEST, EAST}; +decimal_hour compute_LST(double longitude, DIRECTION direction, double gst) +{ + //Convert longitude to hours + double long_hours = longitude / 15.0; + + switch(direction) + { + case DIRECTION::WEST: + //Multiply with direction + long_hours = -1 * long_hours; + break; + case DIRECTION::EAST: + //Multiply with direction + long_hours = 1 * long_hours; + break; + } + + long_hours = long_hours + gst; + + //Bring the result into the range 0 to 24 by adding or subtracting 24 if necessary. + //This is the local sidereal time (LST). + long_hours = long_hours - 24.0 * floor(long_hours/24.0); + + return {long_hours}; +} + //Local Sidereal Time (LST) decimal_hour LST(double longitude, DIRECTION direction, ptime t) { double gst = GST(t).get(); - if(longitude == 0) - return {gst}; - - //Convert longitude to hours - double long_hours = longitude / 15.0; + if(longitude == 0) + return {gst}; - switch(direction) - { - case DIRECTION::WEST: - //Multiply with direction - long_hours = -1 * long_hours; - break; - case DIRECTION::EAST: - //Multiply with direction - long_hours = 1 * long_hours; - break; - } - - long_hours = long_hours + gst; + return compute_LST(longitude,direction,gst); +} - //Bring the result into the range 0 to 24 by adding or subtracting 24 if necessary. - //This is the local sidereal time (LST). - long_hours = long_hours - 24.0 * floor(long_hours/24.0); +decimal_hour LST(double longitude, DIRECTION direction, double gst) +{ + if(longitude == 0) + return {gst}; - return {long_hours}; + return compute_LST(longitude,direction,gst); } #endif //BOOST_ASTRONOMY_TIME_CONVERSIONS diff --git a/test/Jamfile b/test/Jamfile index bcd82786..5374c7fe 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -12,3 +12,5 @@ build-project header ; build-project coordinate ; build-project units ; build-project io ; +build-project time ; + From d4ca482ca756209bcce6a25da7056203298cb776 Mon Sep 17 00:00:00 2001 From: Zyro9922 Date: Wed, 26 Aug 2020 19:16:10 +0530 Subject: [PATCH 2/4] Graph Conversion Framework + Tests - Implemented conversion framework using Boost Graph Library for existing 5 Coordinate Systems. - Tests two convert from one node to another. - Generated PNG from dot file of the given graph. --- .../conversion/conversion_graph.hpp | 152 ++++++++++++++++++ .../astronomy/coordinate/conversion/graph.png | Bin 0 -> 70204 bytes test/CMakeLists.txt | 3 + test/Jamfile | 2 + test/conversion/CMakeLists.txt | 16 ++ test/conversion/Jamfile | 3 + test/conversion/conversion_graph.cpp | 72 +++++++++ 7 files changed, 248 insertions(+) create mode 100644 include/boost/astronomy/coordinate/conversion/conversion_graph.hpp create mode 100644 include/boost/astronomy/coordinate/conversion/graph.png create mode 100644 test/conversion/CMakeLists.txt create mode 100644 test/conversion/Jamfile create mode 100644 test/conversion/conversion_graph.cpp diff --git a/include/boost/astronomy/coordinate/conversion/conversion_graph.hpp b/include/boost/astronomy/coordinate/conversion/conversion_graph.hpp new file mode 100644 index 00000000..3de94f8e --- /dev/null +++ b/include/boost/astronomy/coordinate/conversion/conversion_graph.hpp @@ -0,0 +1,152 @@ +/*============================================================================= +Copyright 2020 Syed Ali Hasan + +Distributed under the Boost Software License, Version 1.0. (See accompanying +file License.txt or copy at https://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ + +#include +#include + +//Graph +#include +#include +#include +#include +#include + +//Matrix +#include +#include +#include + +//Angle +#include +#include +#include + +namespace bu = boost::units; +namespace bg = boost::geometry; +namespace bud = boost::units::degree; +namespace bac = boost::astronomy::coordinate; + +using namespace boost::units; +using namespace boost::units::si; +using namespace boost::astronomy::coordinate; + +struct CoordinateData +{ + std::string coordinate_name; +}; + +struct EdgeData +{ + std::string edge_label; + matrix conv_matrix; +}; + +using graph_t = boost::adjacency_list; + +using vertex_t = boost::graph_traits::vertex_descriptor; + +template +< + typename CoordinateType = double, + typename Angle = bu::quantity +> +matrix convert(const std::string& src, + const std::string& dest, + const Angle& phi, + const Angle& st, + const Angle& obliquity, + coord_sys<2, bg::cs::spherical, CoordinateType> source_coordinate) +{ + bac::column_vector, + double> + col_vec(bg::get<0>(source_coordinate.get_point()) * radians, bg::get<1>(source_coordinate.get_point()) * radians); + + graph_t G; + + const int graph_size = 5; + + vertex_t vd0 = boost::add_vertex(CoordinateData{"Horizon"}, G); + vertex_t vd1 = boost::add_vertex(CoordinateData{"Equatorial_HA_Dec"}, G); + vertex_t vd2 = boost::add_vertex(CoordinateData{"Equatorial_RA_Dec"}, G); + vertex_t vd3 = boost::add_vertex(CoordinateData{"Ecliptic"}, G); + vertex_t vd4 = boost::add_vertex(CoordinateData{"Galactic"}, G); + + boost::add_edge(vd1, vd0, EdgeData{"Equatorial HA Dec to Horizon", bac::ha_dec_horizon, double>(phi).get()}, G); + boost::add_edge(vd0, vd1, EdgeData{"Horizon to Equatorial HA Dec", bac::ha_dec_horizon, double>(phi).get()}, G); + boost::add_edge(vd1, vd2, EdgeData{"Equatorial HA Dec to Equatorial RA Dec", bac::ha_dec_ra_dec, double>(st).get()}, G); + boost::add_edge(vd2, vd1, EdgeData{"Equatorial RA Dec to Equatorial HA Dec", bac::ha_dec_ra_dec, double>(st).get()}, G); + boost::add_edge(vd2, vd3, EdgeData{"Equatorial RA Dec to Ecliptic", bac::ra_dec_to_ecliptic, double>(obliquity).get()}, G); + boost::add_edge(vd3, vd2, EdgeData{"Ecliptic to Equatorial RA Dec", bac::ecliptic_to_ra_dec, double>(obliquity).get()}, G); + boost::add_edge(vd2, vd4, EdgeData{"Equatorial RA Dec to Galactic", bac::ra_dec_to_galactic().get()}, G); + boost::add_edge(vd4, vd2, EdgeData{"Galactic to Equatorial RA Dec", bac::galactic_to_ra_dec().get()}, G); + + bool valid_src = false; + bool valid_dest = false; + + vertex_t src_vertex; + vertex_t dest_vertex; + + //Valid Coordinate System as Source? + graph_t::vertex_iterator v1, vend1; + for (boost::tie(v1, vend1) = vertices(G); v1 != vend1; ++v1) { + if (src == G[*v1].coordinate_name) + { + valid_src = true; + src_vertex = *v1; + break; + } + } + if(!valid_src) throw std::range_error("Not found " + src); + + //Valid Coordinate System as Dest? + graph_t::vertex_iterator v2, vend2; + for (boost::tie(v2, vend2) = vertices(G); v2 != vend2; ++v2) { + if (dest == G[*v2].coordinate_name) + { + valid_dest = true; + dest_vertex = *v2; + break; + } + } + if(!valid_dest) throw std::range_error("Not found " + dest); + + //Predecessor Array + boost::array predecessors{0}; + predecessors[src_vertex] = src_vertex; + + boost::breadth_first_search(G, src_vertex, boost::visitor( + boost::make_bfs_visitor( + boost::record_predecessors(predecessors.begin(), + boost::on_tree_edge{})))); + + //Get traversed path + std::vector store_path; + + int p = dest_vertex; + while (p != src_vertex) + { + store_path.push_back(p); + p = predecessors[p]; + } + store_path.push_back(p); + + matrix ans = col_vec.get(); + + //Matrix Multiplication + for(auto it = store_path.rbegin(); it + 1 != store_path.rend(); ++it) + { + auto a = *it; + auto b = *(it+1); + ans = prod(G[boost::edge(a,b,G).first].conv_matrix, ans); + } + + return ans; +} \ No newline at end of file diff --git a/include/boost/astronomy/coordinate/conversion/graph.png b/include/boost/astronomy/coordinate/conversion/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2a86904de2007810120893b6128cd536e003df76 GIT binary patch literal 70204 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 B%2WUV literal 0 HcmV?d00001 diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f4fe0345..e0cab8b9 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,3 +7,6 @@ add_subdirectory(units) add_subdirectory(time) add_subdirectory(io) + +add_subdirectory(conversion) + diff --git a/test/Jamfile b/test/Jamfile index 5374c7fe..17fe7fa1 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -13,4 +13,6 @@ build-project coordinate ; build-project units ; build-project io ; build-project time ; +build-project conversion ; + diff --git a/test/conversion/CMakeLists.txt b/test/conversion/CMakeLists.txt new file mode 100644 index 00000000..6d22c20d --- /dev/null +++ b/test/conversion/CMakeLists.txt @@ -0,0 +1,16 @@ +foreach(_name + conversion_graph) + set(_target test_coordinate_${_name}) + + add_executable(${_target} "") + target_sources(${_target} PRIVATE ${_name}.cpp) + target_link_libraries(${_target} + PRIVATE + astronomy_compile_options + astronomy_include_directories + astronomy_dependencies) + add_test(NAME test.astro.${_name} COMMAND ${_target}) + + unset(_name) + unset(_target) +endforeach() diff --git a/test/conversion/Jamfile b/test/conversion/Jamfile new file mode 100644 index 00000000..9b3c1a2a --- /dev/null +++ b/test/conversion/Jamfile @@ -0,0 +1,3 @@ +import testing ; + +run conversion_graph.cpp ; diff --git a/test/conversion/conversion_graph.cpp b/test/conversion/conversion_graph.cpp new file mode 100644 index 00000000..cb9e9907 --- /dev/null +++ b/test/conversion/conversion_graph.cpp @@ -0,0 +1,72 @@ +/*============================================================================= +Copyright 2020 Syed Ali Hasan + +Distributed under the Boost Software License, Version 1.0. (See accompanying +file License.txt or copy at https://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ + +#define BOOST_TEST_MODULE conversion_graph + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include + +using namespace boost::units; +using namespace boost::units::si; +using namespace boost::astronomy::coordinate; + +namespace bud = boost::units::degree; +namespace bac = boost::astronomy::coordinate; + +BOOST_AUTO_TEST_SUITE(conversion_graph) + +BOOST_AUTO_TEST_CASE(ecliptic_to_horizon) { + + ecliptic_coord, quantity> + ec(97.638119 * bud::degrees, -17.857969 * bud::degrees); + + bu::quantity phi = 52.175 * bud::degree; + bu::quantity st = 77.337 * bud::degree; + bu::quantity obliquity = 23.446 * bud::degree; + + matrix ans = convert("Ecliptic","Horizon",phi,st,obliquity,ec); + + auto theta = bac::extract_coordinates(ans).get_coordinates().first; + auto gama = bac::extract_coordinates(ans).get_coordinates().second; + + BOOST_CHECK_CLOSE(theta.value() * 180.0 / PI, 153.491944, 0.001); + BOOST_CHECK_CLOSE(gama.value() * 180.0 / PI, 40.399444, 0.001); +} + +BOOST_AUTO_TEST_CASE(horizon_to_ecliptic) { + + horizon_coord, quantity> + hc(153.491944 * bud::degrees, 40.399444 * bud::degrees); + + bu::quantity phi = 52.175 * bud::degree; + bu::quantity st = 77.337 * bud::degree; + bu::quantity obliquity = 23.446 * bud::degree; + + matrix ans = convert("Horizon","Ecliptic",phi,st,obliquity,hc); + + auto theta = bac::extract_coordinates(ans).get_coordinates().first; + auto gama = bac::extract_coordinates(ans).get_coordinates().second; + + BOOST_CHECK_CLOSE(theta.value() * 180.0 / PI, 97.638119 , 0.001); + BOOST_CHECK_CLOSE(gama.value() * 180.0 / PI, -17.857969, 0.001); +} + +BOOST_AUTO_TEST_SUITE_END() + From 9aded93dcaeb5f768ce63829c75557177a688d9c Mon Sep 17 00:00:00 2001 From: Zyro9922 Date: Wed, 26 Aug 2020 20:07:15 +0530 Subject: [PATCH 3/4] Removed ambigous reference to bu --- .../coordinate/conversion/conversion_graph.hpp | 1 - test/conversion/conversion_graph.cpp | 12 ++++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/include/boost/astronomy/coordinate/conversion/conversion_graph.hpp b/include/boost/astronomy/coordinate/conversion/conversion_graph.hpp index 3de94f8e..437f5032 100644 --- a/include/boost/astronomy/coordinate/conversion/conversion_graph.hpp +++ b/include/boost/astronomy/coordinate/conversion/conversion_graph.hpp @@ -27,7 +27,6 @@ file License.txt or copy at https://www.boost.org/LICENSE_1_0.txt) namespace bu = boost::units; namespace bg = boost::geometry; -namespace bud = boost::units::degree; namespace bac = boost::astronomy::coordinate; using namespace boost::units; diff --git a/test/conversion/conversion_graph.cpp b/test/conversion/conversion_graph.cpp index cb9e9907..f18d4288 100644 --- a/test/conversion/conversion_graph.cpp +++ b/test/conversion/conversion_graph.cpp @@ -37,9 +37,9 @@ BOOST_AUTO_TEST_CASE(ecliptic_to_horizon) { ecliptic_coord, quantity> ec(97.638119 * bud::degrees, -17.857969 * bud::degrees); - bu::quantity phi = 52.175 * bud::degree; - bu::quantity st = 77.337 * bud::degree; - bu::quantity obliquity = 23.446 * bud::degree; + quantity phi = 52.175 * bud::degree; + quantity st = 77.337 * bud::degree; + quantity obliquity = 23.446 * bud::degree; matrix ans = convert("Ecliptic","Horizon",phi,st,obliquity,ec); @@ -55,9 +55,9 @@ BOOST_AUTO_TEST_CASE(horizon_to_ecliptic) { horizon_coord, quantity> hc(153.491944 * bud::degrees, 40.399444 * bud::degrees); - bu::quantity phi = 52.175 * bud::degree; - bu::quantity st = 77.337 * bud::degree; - bu::quantity obliquity = 23.446 * bud::degree; + quantity phi = 52.175 * bud::degree; + quantity st = 77.337 * bud::degree; + quantity obliquity = 23.446 * bud::degree; matrix ans = convert("Horizon","Ecliptic",phi,st,obliquity,hc); From 56be0f8dfb103520ffbec0b793a92a531cd4b714 Mon Sep 17 00:00:00 2001 From: Zyro9922 Date: Sat, 29 Aug 2020 10:42:11 +0530 Subject: [PATCH 4/4] Accepting source and destination of convert function as ENUMS. No need to check for source destination validity. --- .../conversion/conversion_graph.hpp | 82 +++++++------------ test/conversion/conversion_graph.cpp | 4 +- 2 files changed, 30 insertions(+), 56 deletions(-) diff --git a/include/boost/astronomy/coordinate/conversion/conversion_graph.hpp b/include/boost/astronomy/coordinate/conversion/conversion_graph.hpp index 437f5032..f9909e26 100644 --- a/include/boost/astronomy/coordinate/conversion/conversion_graph.hpp +++ b/include/boost/astronomy/coordinate/conversion/conversion_graph.hpp @@ -33,8 +33,16 @@ using namespace boost::units; using namespace boost::units::si; using namespace boost::astronomy::coordinate; +enum class COORDINATE_SYSTEM { + HORIZON, + EQUATORIAL_HA_DEC, + EQUATORIAL_RA_DEC, + ECLIPTIC, + GALACTIC}; + struct CoordinateData { + COORDINATE_SYSTEM coordinate_system; std::string coordinate_name; }; @@ -44,7 +52,7 @@ struct EdgeData matrix conv_matrix; }; -using graph_t = boost::adjacency_list; @@ -56,8 +64,8 @@ template typename CoordinateType = double, typename Angle = bu::quantity > -matrix convert(const std::string& src, - const std::string& dest, +matrix convert(const COORDINATE_SYSTEM src, + const COORDINATE_SYSTEM dest, const Angle& phi, const Angle& st, const Angle& obliquity, @@ -72,56 +80,26 @@ matrix convert(const std::string& src, const int graph_size = 5; - vertex_t vd0 = boost::add_vertex(CoordinateData{"Horizon"}, G); - vertex_t vd1 = boost::add_vertex(CoordinateData{"Equatorial_HA_Dec"}, G); - vertex_t vd2 = boost::add_vertex(CoordinateData{"Equatorial_RA_Dec"}, G); - vertex_t vd3 = boost::add_vertex(CoordinateData{"Ecliptic"}, G); - vertex_t vd4 = boost::add_vertex(CoordinateData{"Galactic"}, G); - - boost::add_edge(vd1, vd0, EdgeData{"Equatorial HA Dec to Horizon", bac::ha_dec_horizon, double>(phi).get()}, G); - boost::add_edge(vd0, vd1, EdgeData{"Horizon to Equatorial HA Dec", bac::ha_dec_horizon, double>(phi).get()}, G); - boost::add_edge(vd1, vd2, EdgeData{"Equatorial HA Dec to Equatorial RA Dec", bac::ha_dec_ra_dec, double>(st).get()}, G); - boost::add_edge(vd2, vd1, EdgeData{"Equatorial RA Dec to Equatorial HA Dec", bac::ha_dec_ra_dec, double>(st).get()}, G); - boost::add_edge(vd2, vd3, EdgeData{"Equatorial RA Dec to Ecliptic", bac::ra_dec_to_ecliptic, double>(obliquity).get()}, G); - boost::add_edge(vd3, vd2, EdgeData{"Ecliptic to Equatorial RA Dec", bac::ecliptic_to_ra_dec, double>(obliquity).get()}, G); + vertex_t vd0 = boost::add_vertex(CoordinateData{COORDINATE_SYSTEM::HORIZON,"Horizon"}, G); + vertex_t vd1 = boost::add_vertex(CoordinateData{COORDINATE_SYSTEM::EQUATORIAL_HA_DEC,"Equatorial_HA_Dec"}, G); + vertex_t vd2 = boost::add_vertex(CoordinateData{COORDINATE_SYSTEM::EQUATORIAL_RA_DEC,"Equatorial_RA_Dec"}, G); + vertex_t vd3 = boost::add_vertex(CoordinateData{COORDINATE_SYSTEM::ECLIPTIC,"Ecliptic"}, G); + vertex_t vd4 = boost::add_vertex(CoordinateData{COORDINATE_SYSTEM::GALACTIC,"Galactic"}, G); + + boost::add_edge(vd0, vd1, EdgeData{"Horizon to Equatorial HA Dec", bac::ha_dec_horizon, double>(phi).get()}, G); + boost::add_edge(vd1, vd0, EdgeData{"Equatorial HA Dec to Horizon", bac::ha_dec_horizon, double>(phi).get()}, G); + boost::add_edge(vd1, vd2, EdgeData{"Equatorial HA Dec to Equatorial RA Dec", bac::ha_dec_ra_dec, double>(st).get()}, G); + boost::add_edge(vd2, vd1, EdgeData{"Equatorial RA Dec to Equatorial HA Dec", bac::ha_dec_ra_dec, double>(st).get()}, G); + boost::add_edge(vd2, vd3, EdgeData{"Equatorial RA Dec to Ecliptic", bac::ra_dec_to_ecliptic, double>(obliquity).get()}, G); + boost::add_edge(vd3, vd2, EdgeData{"Ecliptic to Equatorial RA Dec", bac::ecliptic_to_ra_dec, double>(obliquity).get()}, G); boost::add_edge(vd2, vd4, EdgeData{"Equatorial RA Dec to Galactic", bac::ra_dec_to_galactic().get()}, G); boost::add_edge(vd4, vd2, EdgeData{"Galactic to Equatorial RA Dec", bac::galactic_to_ra_dec().get()}, G); - bool valid_src = false; - bool valid_dest = false; - - vertex_t src_vertex; - vertex_t dest_vertex; - - //Valid Coordinate System as Source? - graph_t::vertex_iterator v1, vend1; - for (boost::tie(v1, vend1) = vertices(G); v1 != vend1; ++v1) { - if (src == G[*v1].coordinate_name) - { - valid_src = true; - src_vertex = *v1; - break; - } - } - if(!valid_src) throw std::range_error("Not found " + src); - - //Valid Coordinate System as Dest? - graph_t::vertex_iterator v2, vend2; - for (boost::tie(v2, vend2) = vertices(G); v2 != vend2; ++v2) { - if (dest == G[*v2].coordinate_name) - { - valid_dest = true; - dest_vertex = *v2; - break; - } - } - if(!valid_dest) throw std::range_error("Not found " + dest); - //Predecessor Array boost::array predecessors{0}; - predecessors[src_vertex] = src_vertex; + predecessors[(int)src] = (int)src; - boost::breadth_first_search(G, src_vertex, boost::visitor( + boost::breadth_first_search(G, (int)src, boost::visitor( boost::make_bfs_visitor( boost::record_predecessors(predecessors.begin(), boost::on_tree_edge{})))); @@ -129,8 +107,8 @@ matrix convert(const std::string& src, //Get traversed path std::vector store_path; - int p = dest_vertex; - while (p != src_vertex) + int p = (int)dest; + while (p != (int)src) { store_path.push_back(p); p = predecessors[p]; @@ -141,11 +119,7 @@ matrix convert(const std::string& src, //Matrix Multiplication for(auto it = store_path.rbegin(); it + 1 != store_path.rend(); ++it) - { - auto a = *it; - auto b = *(it+1); - ans = prod(G[boost::edge(a,b,G).first].conv_matrix, ans); - } + ans = prod(G[boost::edge(*it,*(it+1),G).first].conv_matrix, ans); return ans; } \ No newline at end of file diff --git a/test/conversion/conversion_graph.cpp b/test/conversion/conversion_graph.cpp index f18d4288..b9bb9717 100644 --- a/test/conversion/conversion_graph.cpp +++ b/test/conversion/conversion_graph.cpp @@ -41,7 +41,7 @@ BOOST_AUTO_TEST_CASE(ecliptic_to_horizon) { quantity st = 77.337 * bud::degree; quantity obliquity = 23.446 * bud::degree; - matrix ans = convert("Ecliptic","Horizon",phi,st,obliquity,ec); + matrix ans = convert(COORDINATE_SYSTEM::ECLIPTIC,COORDINATE_SYSTEM::HORIZON,phi,st,obliquity,ec); auto theta = bac::extract_coordinates(ans).get_coordinates().first; auto gama = bac::extract_coordinates(ans).get_coordinates().second; @@ -59,7 +59,7 @@ BOOST_AUTO_TEST_CASE(horizon_to_ecliptic) { quantity st = 77.337 * bud::degree; quantity obliquity = 23.446 * bud::degree; - matrix ans = convert("Horizon","Ecliptic",phi,st,obliquity,hc); + matrix ans = convert(COORDINATE_SYSTEM::HORIZON,COORDINATE_SYSTEM::ECLIPTIC,phi,st,obliquity,hc); auto theta = bac::extract_coordinates(ans).get_coordinates().first; auto gama = bac::extract_coordinates(ans).get_coordinates().second;