Giter VIP home page Giter VIP logo

cartocrow's Introduction

CartoCrow - A framework for cartographic visualization algorithms

Linux (g++-11 | Ubuntu 22.04) Linux (clang++-14 | Ubuntu 22.04)

CartoCrow is a framework that simplifies the implementation of algorithms in cartographic visualization. It allows researchers to experiment with these algorithms and use them to generate maps. The framework behind CartoCrow can be used to run other cartography algorithms online. CartoCrow consists of a C++ library (this repository) which provides a set of command-line applications, and a web interface (see cartocrow-web) which allows end users to generate maps in a user-friendly way.

Warning

CartoCrow is still a work in progress and should not be considered stable yet.

This repository consists of the following subdirectories:

  • cartocrow: the library itself, with subdirectories for each module
  • test: unit tests for each module
  • frontend: the command-line frontend
  • demos: a collection of GUI applications serving as a demonstration of various parts of the algorithms implemented

Dependencies

CartoCrow depends on the following build tools:

  • g++ (11.4.0, 12.3.0) / clang++ (14.0.0, 15.0.7) / MSVC (2019)
  • CMake (3.15)

And it depends on the following libraries:

  • CGAL (5.4, 5.5) – for implementations of computational geometry algorithms we need
  • glog (0.5.0, 0.6.0) – for logging
  • ipelib (7.2.26) – for Ipe input and SVG/Ipe output
  • nlohmann-json (3.10.5, 3.11.2) – for JSON parsing
  • Qt (5.15) – for the interactive GUI

The version numbers listed are the ones we're testing with. Newer (and possibly somewhat older) versions will most likely work as well.

Windows (MSVC)

Installing dependencies on Windows

On Windows systems, we recommend using vcpkg to install and manage dependencies. The following steps install everything necessary to build CartoCrow.

  • MSVC. Download MSVC 2019 from Microsoft's website and install it.

  • CMake. Download CMake from here and install it. (Note: If you have a version of CMake installed in Cygwin, this does not seem to play well with vcpkg. Please install a native version of CMake.)

  • vcpkg. The standard procedure to setup vcpkg on Windows:

    git clone https://github.com/microsoft/vcpkg
    cd vcpkg
    .\bootstrap-vcpkg.bat

    In our experience, vcpkg may misbehave when installed in a directory with a long path name, or a path name containing exotic characters. vcpkg itself recommends C:\src\vcpkg.

    For more information on installing vcpkg, see here.

  • Install dependencies. As described here:

    vcpkg install cgal:x64-windows
    vcpkg install qt5:x64-windows
    vcpkg install glog:x64-windows
    vcpkg install nlohmann-json:x64-windows

    This step can take a very long time, especially compiling CGAL (around 30 minutes) and Qt (around 2 hours).

  • Ipelib. This library is not available in vcpkg, so we will have to build it ourselves. Unfortunately, the upstream version of ipelib does not compile cleanly with MSVC. We prepared a patched version (to do: link coming soon) that can be compiled and installed with

    cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -DCMAKE_TOOLCHAIN_FILE=<path-to-vcpkg>\scripts\buildsystems\vcpkg.cmake -S . -B build
    cmake --build build
    sudo cmake --install build

Windows (MSYS2 / MINGW64)

Installing dependencies on Windows (MSYS2 / MINGW64)

In case your machine does not have MSYS2 installed yet, you can download it from here.

Most dependencies can be obtained from the repository:

pacman -S base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja
pacman -S mingw-w64-x86_64-cgal mingw-w64-x86_64-glog mingw-w64-x86_64-qt5 mingw-w64-x86_64-nlohmann-json

The remaining dependencies need to be built manually.

  • Ipelib. Download the source archive and unpack it. Instead of the instructions for Ubuntu given in install.txt, you can use the following to install the dependencies:

    pacman -S mingw-w64-x86_64-freetype mingw-w64-x86_64-cairo mingw-w64-x86_64-libjpeg-turbo
    pacman -S mingw-w64-x86_64-libpng mingw-w64-x86_64-lua mingw-w64-x86_64-zlib
    pacman -S mingw-w64-x86_64-libspiro mingw-w64-x86_64-gsl

    Then set the correct environment: in common.mak, set

    # line 158
    IPEDEPS       := /mingw64  # or /ucrt64 if you're building under UCRT64
    
    # line 167-168
    LUA_CFLAGS    := -I$(IPEDEPS)/lua54/include
    LUA_LIBS      := -L$(IPEDEPS)/lib -llua

    A few changes are necessary to make Ipelib compile correctly:

    • in src/ipelib/ipeplatform.cpp and src/ipelib/ipebitmap_win.cpp, add an #include <string>;
    • in src/ipelib/ipeplatform.cpp, in Platform::runLatex(), replace wcmd.data() by &wcmd[0];
    • in src/ipelib/ipeplatform.cpp, in String::w(), replace result.data() by &result[0].

    Then, to compile:

    cd src
    make IPEPREFIX=/usr/local ipelib

    The compiled library ipe.dll ends up in mingw64/bin.

Linux

Installing dependencies on Linux

On Ubuntu, most dependencies can be obtained from the repository:

sudo apt install build-essential cmake
sudo apt install libcgal-dev nlohmann-json3-dev qtbase5-dev

The remaining dependencies need to be built manually.

  • glog. This dependency is built manually because Ubuntu's packaging apparently does not include the CMake files we need.

    git clone https://github.com/google/glog.git
    cd glog
    cmake -S . -B build
    cmake --build build
    sudo cmake --install build
  • Ipelib. Download the source archive, unpack it, and compile and install it using the instructions given in install.txt.

Compiling

CartoCrow uses CMake as its build system and can therefore be built like any other CMake application, for example:

Windows (MSVC)

cmake.exe -DCMAKE_INSTALL_PREFIX=<install-directory> -DCMAKE_TOOLCHAIN_FILE=<path-to-vcpkg>\scripts\buildsystems\vcpkg.cmake -S . -B build
cmake.exe --build build --config Release
cmake.exe --install build

Windows (MSYS2 / MINGW64)

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<install-directory> -DIpelib_LIBRARY=<location-of-ipe.dll> -S . -B build
cmake --build build
cmake --install build

Linux

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<install-directory> -S . -B build
cmake --build build
cmake --install build

where <install-directory>/bin is the directory where the executables will be installed. Note that on Windows (MSVC), it is necessary to supply the CMAKE_TOOLCHAIN_FILE generated by vcpkg; see the vcpkg documentation for details. On Windows (MSYS2 / MINGW64) FindIpelib.cmake needs a little help finding out where our self-compiled Ipelib library is. Otherwise, there is no difference in compiling between the platforms.

If you want to use cartocrow-web, clone that repository to a separate directory, and use that directory as <install-directory>, so that the executables are installed in a location where the web application can find them. (See also the README in the cartocrow-web repository for details.)

Usage

CartoCrow provides a command-line application, simply called cartocrow, which can be used to generate maps. To use it, you need a JSON file describing the map to generate, which can then be passed to cartocrow:

build/frontend/cartocrow <json-file>

We provide some sample input data to generate a necklace map depicting the population of all countries in Europe:

build/frontend/cartocrow data/europe-population-necklace.json

License

Copyright (c) 2019-2023 Netherlands eScience Center and TU Eindhoven Licensed under the GPLv3.0 license. See LICENSE for details.

cartocrow's People

Contributors

thijsvanlankveld avatar willem3141 avatar yvee1 avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

dmbuzink ivt18 yvee1

cartocrow's Issues

Port CartoCrow to Windows

  • Remove Bash build scripts, use pure CMake instead
  • Get dependencies on Windows
  • Compile with MSVC
  • Document new cross-platform build procedure in the README
  • Bonus: Get the web frontend running

Very hard to estimate how much time this will take, as it will depend highly on how portable the code already is, and how easy it is to get the dependencies to work.

All source files are installed (rather than just headers)

The build system installs all source files, both .cpp and .h files, to <install-directory>/install/include. This directory should contain only header files (+ some implementation files for templated classes), not all .cpp files.

Implement flow maps

  • Compute spiral tree without obstacles
  • Compute spiral tree with obstacles
    • Implement sweep circle data structure
      • maintain edges and intervals
      • implement queries
        • interval at φ
        • edges at φ
      • implement operations
        • split from interval
        • split from edge
        • switch edge
        • merge to interval
        • merge to edge
      • properly handle edges moving over the φ = π ray (‘switch events’)
        • reinsert such edges
        • handle join events associated with such edges
    • Implement first phase: computing reachable area
      • implement vertex events
        • near
        • far
        • left
        • right
      • implement join events
        • reachable/reachable
        • reachable/obstacle
    • Implement second phase: computing spiral tree (#19)
      • implement node events
      • implement vertex events
        • near
        • far
        • left
        • right
      • implement join events
        • reachable/reachable
        • reachable/obstacle
      • create the tree
    • Implement demo application to test spiral trees
  • Implement flow map optimization procedure (#28)
    • Implement flow map (smooth tree) data structure
    • Implement cost functions
      • obstacle cost
        • for polygon obstacles
        • for leaf obstacles
      • smoothing cost
      • angle restriction cost
      • balancing cost
      • straightening cost
    • Implement optimization
      • basic gradient descent
      • determine suitable time step
  • Render the resulting flow map

Fix compiler warnings

Several instances of "no return statement in function returning non-void":

[23/72] Building CXX object geoviz/necklace_map/CMakeFiles/necklace_map.dir/detail/compute_scale_factor_any_order.cpp.o
../geoviz/necklace_map/detail/compute_scale_factor_any_order.cpp: In member function ‘virtual geoviz::Number geoviz::necklace_map::detail::ComputeScaleFactorAnyOrder::ComputeCoveringRadii(const Number&)’:
../geoviz/necklace_map/detail/compute_scale_factor_any_order.cpp:139:1: warning: no return statement in function returning non-void [-Wreturn-type]
  139 | }
      | ^
[24/72] Building CXX object geoviz/necklace_map/CMakeFiles/necklace_map.dir/detail/compute_scale_factor_any_order_ingot.cpp.o
../geoviz/necklace_map/detail/compute_scale_factor_any_order_ingot.cpp: In member function ‘virtual geoviz::Number geoviz::necklace_map::detail::ComputeScaleFactorAnyOrderIngot::ComputeCoveringRadii(const Number&)’:
../geoviz/necklace_map/detail/compute_scale_factor_any_order_ingot.cpp:62:1: warning: no return statement in function returning non-void [-Wreturn-type]
   62 | }
      | ^
[56/72] Building CXX object console/necklace_map_io/CMakeFiles/necklace_map_io.dir/necklace_parsers.cpp.o
../console/necklace_map_io/necklace_parsers.cpp: In member function ‘std::string geoviz::IntervalTypeParser::Serialize() const’:
../console/necklace_map_io/necklace_parsers.cpp:71:1: warning: control reaches end of non-void function [-Wreturn-type]
   71 | }
      | ^
../console/necklace_map_io/necklace_parsers.cpp: In member function ‘std::string geoviz::OrderTypeParser::Serialize() const’:
../console/necklace_map_io/necklace_parsers.cpp:119:1: warning: control reaches end of non-void function [-Wreturn-type]
  119 | }
      | ^
[59/72] Building CXX object console/necklace_map_io/CMakeFiles/necklace_map_io.dir/necklace_writer.cpp.o
../console/necklace_map_io/necklace_writer.cpp: In member function ‘bool geoviz::NecklaceWriter::Write(const std::vector<std::shared_ptr<geoviz::necklace_map::MapElement> >&, const std::vector<std::shared_ptr<geoviz::necklace_map::Necklace> >&, const Number&, const Ptr&, std::ostream&) const’:
../console/necklace_map_io/necklace_writer.cpp:69:1: warning: no return statement in function returning non-void [-Wreturn-type]
   69 | }
      | ^

These are almost certainly bugs.

Necklace map frequently segfaults

I am triggering frequent segfaults when trying to compute necklace maps (on the master branch). Example:

Arguments:
--in_geometry_filename=data/necklace_map/wEU.svg --in_data_filename=data/necklace_map/wEU.txt --in_value_name=value --out_filename=test.svg

Stack trace:

gdb$ bt
#0  0x00005555555b41cb in geoviz::necklace_map::detail::ComputeScaleFactorAnyOrder::ComputeCoveringRadii(double const&) ()
#1  0x00005555555b4b8f in geoviz::necklace_map::detail::ComputeScaleFactorAnyOrder::Optimize() ()
#2  0x00005555555b1682 in geoviz::necklace_map::ComputeScaleFactorAnyOrder::operator()(std::shared_ptr<geoviz::necklace_map::Necklace>&) ()
#3  0x00005555555b11cb in geoviz::necklace_map::ComputeScaleFactor::operator()(std::vector<std::shared_ptr<geoviz::necklace_map::Necklace>, std::allocator<std::shared_ptr<geoviz::necklace_map::Necklace> > >&) ()
#4  0x00005555555af64e in geoviz::necklace_map::ComputeScaleFactor(geoviz::necklace_map::Parameters const&, std::vector<std::shared_ptr<geoviz::necklace_map::MapElement>, std::allocator<std::shared_ptr<geoviz::necklace_map::MapElement> > >&, std::vector<std::shared_ptr<geoviz::necklace_map::Necklace>, std::allocator<std::shared_ptr<geoviz::necklace_map::Necklace> > >&) ()
#5  0x000055555556710f in main ()

Fix clang warnings

Clang with -Wall produces a lot of warnings, especially many regarding calling delete on abstract classes with non-virtual destructors. These should be fixed.

Provide regionArrangementToMap()

We already have regionMapToArrangement(), but it would be useful to be able to first simplify an arrangement, and then use it as input for another algorithm.

Investigate if we can use CGAL's circulators

The flow maps module contains an implementation of circulators, which seems to have a subset of the functionality of CGAL's circulators. It would be nicer to switch to CGAL's implementation unless there is a good reason not to.

Fix compiler warnings

CartoCrow doesn't compile warning-free with -Wall. We should go through these warnings and fix each of them. Then turn on -Wall for future builds so new warnings don't sneak in.

With -Wall -Wextra -Wconversion, there are over 100 warnings (which seem innocent), so fixing these would be more of a long-term goal.

CGAL assert in the RegionMap painter

 wsonke   SimplificationBranch  ~  Git  cartocrow  ./build-debug/frontend/cartocrow data/europe-population-necklace.json
terminate called after throwing an instance of 'CGAL::Precondition_exception'
  what():  CGAL ERROR: precondition violation!
Expr: (m_traits.compare_y_at_x_2_object()(p, cv) == EQUAL) && compare_xy(cv.left(), p) == SMALLER && compare_xy(cv.right(), p) == LARGER
File: /usr/include/CGAL/Arr_segment_traits_2.h
Line: 608
fish: Job 1, './build-debug/frontend/cartocro…' terminated by signal SIGABRT (Abort)
(gdb) bt
#0  __pthread_kill_implementation (no_tid=0, signo=6, threadid=140737276269120) at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=6, threadid=140737276269120) at ./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=140737276269120, signo=signo@entry=6) at ./nptl/pthread_kill.c:89
#3  0x00007ffff6369476 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#4  0x00007ffff634f7f3 in __GI_abort () at ./stdlib/abort.c:79
#5  0x00007ffff66f8bbe in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007ffff670424c in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00007ffff67042b7 in std::terminate() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#8  0x00007ffff6704518 in __cxa_throw () from /lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x0000555555577ddd in CGAL::precondition_fail (
    expr=0x555555981cc8 "(m_traits.compare_y_at_x_2_object()(p, cv) == EQUAL) && compare_xy(cv.left(), p) == SMALLER && compare_xy(cv.right(), p) == LARGER", file=0x5555559711f8 "/usr/include/CGAL/Arr_segment_traits_2.h", line=608, 
    msg=0x55555596f11c "") at /usr/include/CGAL/assertions_impl.h:195
#10 0x00005555556f5069 in CGAL::Arr_segment_traits_2<CGAL::Epick>::Split_2::operator() (this=0x7fffffffcd98, cv=..., p=..., c1=..., c2=...) at /usr/include/CGAL/Arr_segment_traits_2.h:608
#11 0x00005555556e95b2 in CGAL::Surface_sweep_2::Surface_sweep_2<CGAL::Gps_polygon_validation_visitor<CGAL::Gps_segment_traits_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >, CGAL::Arr_segment_traits_2<CGAL::Epick> >, std::allocator<int> > >::_handle_left_curves (this=0x7fffffffcf10) at /usr/include/CGAL/Surface_sweep_2/Surface_sweep_2_impl.h:167
#12 0x0000555555621c96 in CGAL::Surface_sweep_2::No_intersection_surface_sweep_2<CGAL::Gps_polygon_validation_visitor<CGAL::Gps_segment_traits_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >, CGAL::Arr_segment_traits_2<CGAL::Epick> >, std::allocator<int> > >::_sweep (this=0x7fffffffcf10) at /usr/include/CGAL/Surface_sweep_2/No_intersection_surface_sweep_2_impl.h:160
#13 0x000055555560bf04 in CGAL::Surface_sweep_2::No_intersection_surface_sweep_2<CGAL::Gps_polygon_validation_visitor<CGAL::Gps_segment_traits_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >, CGAL::Arr_segment_traits_2<CGAL::Epick> >, std::allocator<int> > >::sweep<std::_List_iterator<CGAL::Arr_segment_2<CGAL::Epick> > > (this=0x7fffffffcf10, curves_begin={<CGAL::Arr_segment_traits_2<CGAL::Epick>::_Segment_cached_2> = {m_l = {<CGAL::LineC2<CGAL::Epick>> = {base = {_M_elems = {9.8813129168249309e-324, 4.6355715365405525e-310, 4.6355705443059468e-310}}}, <No data fields>}, m_ps = {<CGAL::PointC2<CGAL::Epick>> = {base = {<CGAL::VectorC2<CGAL::Epick>> = {base = {_M_elems = {337.12700000000001, 321.51400000000001}}}, <No data fields>}}, <No data fields>}, m_pt = {<CGAL::PointC2<CGAL::Epick>> = {base = {<CGAL::VectorC2<CGAL::Epick>> = {base = {_M_elems = {336.899, 321.96899999999999}}}, <No data fields>}}, <No data fields>}, m_is_directed_right = false, m_is_vert = false, m_is_computed = false, m_is_degen = false}, <No data fields>}, curves_end={<CGAL::Arr_segment_traits_2<CGAL::Epick>::_Segment_cached_2> = {m_l = {<CGAL::LineC2<CGAL::Epick>> = {base = {_M_elems = {3.0632070042157286e-322, -2.4031191350563669e+138, 4.635570854654468e-310}}}, <No data fields>}, m_ps = {<CGAL::PointC2<CGAL::Epick>> = {base = {<CGAL::VectorC2<CGAL::Epick>> = {base = {_M_elems = {6.9533558072160389e-310, 2.1219634123731721e-314}}}, <No data fields>}}, <No data fields>}, m_pt = {<CGAL::PointC2<CGAL::Epick>> = {base = {<CGAL::VectorC2<CGAL::Epick>> = {base = {_M_elems = {4.6355705676261911e-310, 6.9533558072832318e-310}}}, <No data fields>}}, <No data fields>}, m_is_directed_right = 96, m_is_vert = 212, m_is_computed = 255, m_is_degen = 255}, <No data fields>}) at /usr/include/CGAL/No_intersection_surface_sweep_2.h:252
#14 0x0000555555600093 in CGAL::Gps_polygon_validation_visitor<CGAL::Gps_segment_traits_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >, CGAL::Arr_segment_traits_2<CGAL::Epick> >, std::allocator<int> >::sweep<std::_List_iterator<CGAL::Arr_segment_2<CGAL::Epick> > > (this=0x7fffffffcec0, begin={<CGAL::Arr_segment_traits_2<CGAL::Epick>::_Segment_cached_2> = {m_l = {<CGAL::LineC2<CGAL::Epick>> = {base = {_M_elems = {9.8813129168249309e-324, 4.6355715365405525e-310, 4.6355705443059468e-310}}}, <No data fields>}, m_ps = {<CGAL::PointC2<CGAL::Epick>> = {base = {<CGAL::VectorC2<CGAL::Epick>> = {base = {_M_elems = {337.12700000000001, 321.51400000000001}}}, <No data fields>}}, <No data fields>}, m_pt = {<CGAL::PointC2<CGAL::Epick>> = {base = {<CGAL::VectorC2<CGAL::Epick>> = {base = {_M_elems = {336.899, 321.96899999999999}}}, <No data fields>}}, <No data fields>}, m_is_directed_right = false, m_is_vert = false, m_is_computed = false, m_is_degen = false}, <No data fields>}, end={<CGAL::Arr_segment_traits_2<CGAL::Epick>::_Segment_cached_2> = {m_l = {<CGAL::LineC2<CGAL::Epick>> = {base = {_M_elems = {3.0632070042157286e-322, -2.4031191350563669e+138, 4.635570854654468e-310}}}, <No data fields>}, m_ps = {<CGAL::PointC2<CGAL::Epick>> = {base = {<CGAL::VectorC2<CGAL::Epick>> = {base = {_M_elems = {6.9533558072160389e-310, 2.1219634123731721e-314}}}, <No data fields>}}, <No data fields>}, m_pt = {<CGAL::PointC2<CGAL::Epick>> = {base = {<CGAL::VectorC2<CGAL::Epick>> = {base = {_M_elems = {4.6355705676261911e-310, 6.9533558072832318e-310}}}, <No data fields>}}, <No data fields>}, m_is_directed_right = 96, m_is_vert = 212, m_is_computed = 255, m_is_degen = 255}, <No data fields>}) at /usr/include/CGAL/Boolean_set_operations_2/Gps_polygon_validation.h:125
#15 0x00005555555f7794 in CGAL::is_relatively_simple_polygon<CGAL::Gps_segment_traits_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >, CGAL::Arr_segment_traits_2<CGAL::Epick> > > (pgn=..., traits=...) at /usr/include/CGAL/Boolean_set_operations_2/Gps_polygon_validation.h:498
#16 0x00005555555f2b3f in CGAL::is_relatively_simple_polygon_with_holes<CGAL::Gps_segment_traits_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >, CGAL::Arr_segment_traits_2<CGAL::Epick> > > (pgn=..., traits=...) at /usr/include/CGAL/Boolean_set_operations_2/Gps_polygon_validation.h:529
#17 0x00005555555f027c in CGAL::is_valid_polygon_with_holes<CGAL::Gps_segment_traits_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >, CGAL::Arr_segment_traits_2<CGAL::Epick> > > (pgn=..., traits=...) at /usr/include/CGAL/Boolean_set_operations_2/Gps_polygon_validation.h:778
#18 0x00005555555ee4a6 in CGAL::is_valid_unknown_polygon<CGAL::Gps_segment_traits_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >, CGAL::Arr_segment_traits_2<CGAL::Epick> > > (pgn=..., traits=...) at /usr/include/CGAL/Boolean_set_operations_2/Gps_polygon_validation.h:803
#19 0x00005555555ec992 in CGAL::Boolean_set_operation_2_internal::PreconditionValidationPolicy::is_valid<CGAL::Polygon_with_holes_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > > >, CGAL::Gps_segment_traits_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >, CGAL::Arr_segment_traits_2<CGAL::Epick> > > (p=..., t=...) at /usr/include/CGAL/General_polygon_set_on_surface_2.h:39
#20 0x00005555555eb135 in CGAL::Gps_on_surface_base_2<CGAL::Gps_segment_traits_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >, CGAL::Arr_segment_traits_2<CGAL::Epick> >, CGAL::Arr_bounded_planar_topology_traits_2<CGAL::Gps_segment_traits_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >, CGAL::Arr_segment_traits_2<CGAL::Epick> >, CGAL::Gps_default_dcel<CGAL::Gps_segment_traits_2<CGAL::Epick, std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >, CGAL::Arr_segment_traits_2<CGAL::Epick> > > >, CGAL::Boolean_set_operation_2_internal::PreconditionValidationPolicy>::insert (this=0x7fffffffd540, pgn_with_holes=...) at /usr/include/CGAL/Boolean_set_operations_2/Gps_on_surface_base_2.h:277
#21 0x00005555555e7ee9 in cartocrow::approximate (p=...) at /home/wsonke/Git/cartocrow/cartocrow/core/core.cpp:68
#22 0x0000555555901a62 in cartocrow::necklace_map::ComputeFeasibleInterval::operator() (this=0x555556898e20, bead=std::shared_ptr<cartocrow::necklace_map::Bead> (use count 1, weak count 0) = {...}, necklace=...) at /home/wsonke/Git/cartocrow/cartocrow/necklace_map/feasible_interval/compute_feasible_interval.cpp:64
#23 0x00005555558fbbe6 in cartocrow::necklace_map::NecklaceMap::compute (this=0x555556898d50) at /home/wsonke/Git/cartocrow/cartocrow/necklace_map/necklace_map.cpp:54
#24 0x00005555555722d0 in main (argc=2, argv=0x7fffffffddb8) at /home/wsonke/Git/cartocrow/frontend/cartocrow.cpp:91

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.