| 245 | === 3. Boost.Geometry === |
| 246 | |
| 247 | Potential mentors: Vissarion Fysikopoulos, Adam Wulkiewicz |
| 248 | |
| 249 | All projects requires knowledge of C++ template metaprogramming techniques. |
| 250 | |
| 251 | ==== Background ==== |
| 252 | |
| 253 | Boost.Geometry part of collection of the Boost C++ Libraries, defines concepts, primitives and algorithms for solving geometry problems. |
| 254 | |
| 255 | See http://www.boost.org/libs/geometry |
| 256 | |
| 257 | ==== PROJECT 1. Filtering of compare distance predicates. ==== |
| 258 | |
| 259 | In some algorithms there is the need to compare two distances of two point pairs. That is, use the predicate compare_distance(p1, p2, q1, q2) that returns (1, 0, -1) if the length of segment (p1, p2) is larger, equal or smaller respectively than the length of segment (q1, q2). |
| 260 | |
| 261 | Since, computing distances could be costly especially when computing on the ellipsoid (i.e. geographic computations) we would like to avoid that computation whenever possible. |
| 262 | |
| 263 | One approach could be to compute the 3D cartesian distances first and if these numbers are not "far enough" then fall back to expensive geographic distance calculation otherwise return the result by comparing those numbers obtained by less expensive cartesian compuation. There are some issues that should be further clarified, e.g. declare the "far enough" value that works in practice. Several other approaches could be used and tested, e.g. perform a local spheroid approximation and return the 2D distance. |
| 264 | |
| 265 | The project will require the student to understand parts of Boost.Geometry, in particular algorithms and strategies. Some knowledge of computational geometry is a plus. |
| 266 | |
| 267 | ==== PROJECT 2. R-tree serialization. ==== |
| 268 | |
| 269 | The goal is to implement serialization of Boost.Geometry R-tree with Boost.Serialization library. It should be done in a form of optional extension, i.e. Boost.Geometry shouldn't depend on Boost.Serialization by default. The example result could look like this: |
| 270 | |
| 271 | {{{ |
| 272 | #!c++ |
| 273 | #include <boost/archive/binary_oarchive.hpp> |
| 274 | #include <boost/geometry.hpp> |
| 275 | #include <boost/geometry/index/rtree.hpp> |
| 276 | #include <boost/geometry/index/serialization/rtree.hpp> |
| 277 | |
| 278 | int main() { |
| 279 | namespace bg = boost::geometry; |
| 280 | namespace bgi = bg::index; |
| 281 | typedef bg::model::point<double, 2, bg::cs::cartesian> point_type; |
| 282 | typedef bg::model::box<point_type> box_type; |
| 283 | |
| 284 | bgi::rtree<box_type, bgi::rstar<16> > rtree; |
| 285 | |
| 286 | // fill rtree with data |
| 287 | std::ofstream file("serialized_rtree.bin", |
| 288 | std::ios::binary | std::ios::trunc); |
| 289 | boost::archive::binary_oarchive archive(file); |
| 290 | archive << rtree; |
| 291 | } |
| 292 | }}} |
| 293 | |
| 294 | The project will require the student to understand parts of Boost.Geometry, in particular primitives and the internals of R-tree and the interface of Boost.Serialization library. |
| 295 | |
| 296 | ==== PROJECT 3. Nearly antipodal points distance accuracy improvement. ==== |
| 297 | |
| 298 | Compute accurately the distance between two nearly antipodal points on the ellipsoid of revolution. Currently Boost.Geometry does not handle this case correctly. A solution is proposed in [1] as a solution of a so called astroid problem. It is also implemented in C++ in [2]. |
| 299 | |
| 300 | * [1] Karney - Algorithms for geodesics (https://arxiv.org/pdf/1109.4448.pdf) |
| 301 | * [2] http://geographiclib.sourceforge.net |
| 302 | |
| 303 | ==== Potential project extension funded by Boost |
| 304 | |
| 305 | N/A |
| 306 | |