Merge remote-tracking branch 'mine/Kinetic_shape_reconstruction-new_package-soesau' into Kinetic_surface_reconstruction-new_package-soesau

originally:
Author: Sven Oesau <sven.oesau@geometryfactory.com>
Date:   Wed Apr 17 19:45:30 2024 +0200
This commit is contained in:
Sébastien Loriot 2024-05-15 16:39:42 +02:00
commit b9ef5de3b8
1764 changed files with 173137 additions and 80464 deletions

32
.github/install.sh vendored
View File

@ -1,11 +1,29 @@
#!/bin/bash
set -ex
sudo apt-get update
sudo apt-get install -y libmpfr-dev \
libeigen3-dev qtbase5-dev libqt5sql5-sqlite libqt5opengl5-dev qtscript5-dev \
libqt5svg5-dev qttools5-dev qttools5-dev-tools libboost-dev libinsighttoolkit4-dev zsh
#update cmake to 3.18.4
sudo apt-get install -y \
libmpfr-dev \
libtbb-dev \
libmetis-dev \
libssh-dev \
libeigen3-dev \
qtbase5-dev libqt5sql5-sqlite libqt5opengl5-dev qtscript5-dev libqt5websockets5-dev \
libqt5svg5-dev qttools5-dev qttools5-dev-tools \
libboost-dev libboost-serialization-dev libboost-iostreams-dev libboost-filesystem-dev libboost-filesystem-dev \
libvtk9-dev libgdcm-tools libvtkgdcm-dev libunwind-dev \
libinsighttoolkit5-dev \
libceres-dev \
libglpk-dev \
libopencv-dev \
zsh \
qt6-base-dev qt6-declarative-dev libqt6svg6-dev libqt6websockets6-dev
#update CMake
sudo apt purge --auto-remove cmake
cd /tmp
wget https://cmake.org/files/v3.18/cmake-3.18.4-Linux-x86_64.sh
sudo sh cmake-3.18.4-Linux-x86_64.sh --skip-license --prefix=/usr/local
rm cmake-3.18.4-Linux-x86_64.sh
CMAKE_VER=$(curl --silent https://cmake.org/files/LatestRelease/cmake-latest-files-v1.json | jq -r .version.string)
wget https://cmake.org/files/LatestRelease/cmake-$CMAKE_VER-linux-x86_64.sh
sudo sh cmake-*.sh --skip-license --prefix=/usr/local
rm cmake-*.sh

8
.github/test.sh vendored
View File

@ -3,11 +3,11 @@
FACTOR=$1
set -ex
cd Polyhedron/demo
LIST_OF_PLUGINS=$(/usr/local/bin/cmake --build . -t help | egrep 'plugin$' |& cut -d\ -f2)
/usr/local/bin/cmake -S Polyhedron -B build -DCGAL_DIR=$2
LIST_OF_PLUGINS=$(/usr/local/bin/cmake --build build -t help | egrep 'plugin$' |& cut -d\ -f2)
PLUGINS_ARRAY=(${LIST_OF_PLUGINS});
NB_OF_PLUGINS=${#PLUGINS_ARRAY[@]}
DEL=$(($NB_OF_PLUGINS / 4))
mkdir build
cd build
/usr/local/bin/cmake -DCGAL_DIR=$2 ../Polyhedron
make -j2 ${PLUGINS_ARRAY[@]:$(($FACTOR * $DEL)):$((($FACTOR + 1) * $DEL))}
NUM_PROCS=$(nproc)
make -j${NUM_PROCS} ${PLUGINS_ARRAY[@]:$(($FACTOR * $DEL)):$((($FACTOR + 1) * $DEL))}

View File

@ -10,7 +10,7 @@ jobs:
name: remove label
steps:
- name: removelabel
uses: actions/github-script@v6
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
@ -21,7 +21,7 @@ jobs:
name: "Tested",
});
- name: Post address
uses: actions/github-script@v6
uses: actions/github-script@v7
if: ${{ success() }}
with:
script: |

View File

@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v6
- uses: actions/github-script@v7
id: get_round
with:
result-encoding: string
@ -38,7 +38,7 @@ jobs:
}
}
return 'stop'
- uses: actions/github-script@v6
- uses: actions/github-script@v7
if: steps.get_round.outputs.result != 'stop'
id: get_pr_number
with:
@ -49,7 +49,7 @@ jobs:
return pr_number
- name: Emoji-comment
uses: actions/github-script@v6
uses: actions/github-script@v7
if: steps.get_round.outputs.result != 'stop'
with:
script: |
@ -104,8 +104,8 @@ jobs:
echo "DoxygenError=No package affected." >> $GITHUB_OUTPUT
exit 1
fi
cd build_doc && make -j2 doc
make -j2 doc_with_postprocessing 2>tmp.log
cd build_doc && make -j$(nproc) doc
make -j$(nproc) doc_with_postprocessing 2>tmp.log
if [ -s tmp.log ]; then
content=`cat ./tmp.log`
delimiter="$(openssl rand -hex 8)"
@ -136,7 +136,7 @@ jobs:
fi
- name: Post address
uses: actions/github-script@v6
uses: actions/github-script@v7
if: ${{ success() && steps.get_round.outputs.result != 'stop' }}
with:
script: |
@ -154,7 +154,7 @@ jobs:
- name: Post error
env:
ERRORMSG: ${{steps.build_and_run.outputs.DoxygenError}}
uses: actions/github-script@v6
uses: actions/github-script@v7
if: ${{ failure() && steps.get_round.outputs.result != 'stop' }}
with:
script: |

View File

@ -17,10 +17,10 @@ jobs:
- name: configure all
run: |
set -e
mkdir build && cd build && CXX=clang++ cmake -DWITH_examples=ON -DWITH_tests=ON -DWITH_demos=ON -DBUILD_TESTING=ON ..
mkdir build && cd build && CXX=clang++ cmake -DWITH_examples=ON -DWITH_tests=ON -DWITH_demos=ON -DCGAL_ENABLE_TESTING=ON ..
ctest -L Installation -j $(getconf _NPROCESSORS_ONLN)
cmake-testsuite-with-qt5:
cmake-testsuite-with-qt:
runs-on: ubuntu-latest
@ -31,5 +31,5 @@ jobs:
- name: configure all
run: |
set -e
mkdir build && cd build && CXX=clang++ cmake -DWITH_examples=ON -DWITH_tests=ON -DWITH_demos=ON -DBUILD_TESTING=ON ..
mkdir build && cd build && CXX=clang++ cmake -DWITH_examples=ON -DWITH_tests=ON -DWITH_demos=ON -DCGAL_ENABLE_TESTING=ON ..
ctest -L Installation -j $(getconf _NPROCESSORS_ONLN)

View File

@ -14,7 +14,7 @@ jobs:
if: (github.event.comment.user.login == 'sloriot' || github.event.comment.user.login == 'lrineau') && contains(github.event.comment.body, '/testme')
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v6
- uses: actions/github-script@v7
id: get_label
with:
result-encoding: string
@ -63,7 +63,7 @@ jobs:
ssh ${HOST} "${PATH_TO_SCRIPT}/run_testsuite_from_branch_name.sh $USER_NAME $BRANCH_NAME $BASE $PR_NUMBER"
done
- name: Post address
uses: actions/github-script@v6
uses: actions/github-script@v7
with:
script: |
const address = "Testsuite launched. Results will appear on the following page: https://cgal.geometryfactory.com/~cgaltest/test_suite/TESTRESULTS/index.shtml "

View File

@ -12,24 +12,24 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: REUSE version
uses: fsfe/reuse-action@v2
uses: fsfe/reuse-action@v3
with:
args: --version
- name: REUSE lint
uses: fsfe/reuse-action@v2
uses: fsfe/reuse-action@v3
with:
args: --include-submodules lint
- name: REUSE SPDX SBOM
uses: fsfe/reuse-action@v2
uses: fsfe/reuse-action@v3
with:
args: spdx
- name: install dependencies
run: sudo apt-get install -y cmake
run: sudo apt-get update && sudo apt-get install -y cmake
- name: Create CGAL internal release
run: |
mkdir -p ./release
cmake -DDESTINATION=./release -DCGAL_VERSION=9.9 -P ./Scripts/developer_scripts/cgal_create_release_with_cmake.cmake
- name: REUSE lint release tarball
uses: fsfe/reuse-action@v2
uses: fsfe/reuse-action@v3
with:
args: --root ./release/CGAL-9.9 --include-submodules lint

View File

@ -9,7 +9,7 @@ jobs:
messages: ${{ steps.set-result.outputs.result }}
steps:
- name: get informations and prepare email
uses: actions/github-script@v6
uses: actions/github-script@v7
id: set-result
with:
result-encoding: string

8
.gitignore vendored
View File

@ -178,12 +178,6 @@ GraphicsView/demo/Triangulation_2/Makefile
GraphicsView/demo/Triangulation_2/Regular_triangulation_2
GraphicsView/demo/Triangulation_2/qrc_*.cxx
GraphicsView/demo/Triangulation_2/ui_*.h
GraphicsView/src/CGAL_Qt5/*.dll
GraphicsView/src/CGAL_Qt5/*.lib
GraphicsView/src/CGAL_Qt5/*.so
GraphicsView/src/CGAL_Qt5/Makefile
GraphicsView/src/CGAL_Qt5/moc_*.cxx
GraphicsView/src/CGAL_Qt5/qrc_*.cxx
HalfedgeDS/test/HalfedgeDS/cgal_test_with_cmake
HalfedgeDS/test/HalfedgeDS/test_hds
HalfedgeDS/test/HalfedgeDS/test_hds_decorator
@ -879,7 +873,6 @@ Surface_mesher/demo/Surface_mesher/.*.deps
Surface_mesher/demo/Surface_mesher/.qglviewer.xml
Surface_mesher/demo/Surface_mesher/Makefile
Surface_mesher/demo/Surface_mesher/Surface_mesher
Surface_mesher/demo/Surface_mesher/Surface_mesher_Qt5_Demo
Surface_mesher/demo/Surface_mesher/VTK/Makefile
Surface_mesher/demo/Surface_mesher/VTK/mesh_a_3D_image
Surface_mesher/demo/Surface_mesher/VTK/mesh_a_VTK_3D_image
@ -894,7 +887,6 @@ Surface_mesher/demo/Surface_mesher/out*.off
Surface_mesher/demo/Surface_mesher/polyhedron_remesher
Surface_mesher/demo/Surface_mesher/polyhedron_remesher_with_edges
Surface_mesher/demo/Surface_mesher/qrc_*.c*
Surface_mesher/demo/Surface_mesher/qt5-demo
Surface_mesher/demo/Surface_mesher/ui_*.h
Surface_mesher/doxygen
Surface_mesher/examples/Surface_mesher/.*.deps

View File

@ -30,7 +30,7 @@ int main(int argc, char **argv)
app.setOrganizationName("INRIA");
app.setApplicationName("AABB tree demo");
// Import resources from libCGALQt (Qt5).
// Import resources from libCGALQt (Qt6).
CGAL_QT_INIT_RESOURCES;
MainWindow mainWindow;
@ -49,12 +49,3 @@ int main(int argc, char **argv)
return app.exec();
}
# include "Scene.cpp"
# include "Scene_moc.cpp"
# include "benchmarks.cpp"
# include "Viewer.cpp"
# include "Viewer_moc.cpp"
# include "MainWindow.cpp"
# include "MainWindow_moc.cpp"

View File

@ -6,73 +6,46 @@ project(AABB_tree_Demo)
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)
if(NOT POLICY CMP0070 AND POLICY CMP0053)
# Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning.
cmake_policy(SET CMP0053 OLD)
endif()
# Find CGAL and CGAL Qt6
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6)
if(POLICY CMP0071)
cmake_policy(SET CMP0071 NEW)
endif()
# Find Qt6 itself
find_package(Qt6 QUIET COMPONENTS Gui OpenGL)
# Include this package's headers first
include_directories(BEFORE ./ ./include)
if(CGAL_Qt6_FOUND AND Qt6_FOUND)
# Find CGAL and CGAL Qt5
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
add_definitions(-DQT_NO_KEYWORDS)
# Find Qt5 itself
find_package(Qt5 QUIET COMPONENTS Widgets OpenGL)
# Instruct CMake to run moc/ui/rcc automatically when needed.
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
if(CGAL_Qt5_FOUND AND Qt5_FOUND)
qt5_wrap_ui(UI_FILES MainWindow.ui)
include(AddFileDependencies)
qt5_generate_moc("MainWindow.h" "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp")
add_file_dependencies(MainWindow_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/MainWindow.h")
qt5_generate_moc("Viewer.h" "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp")
add_file_dependencies(Viewer_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/Viewer.h")
qt5_generate_moc("Scene.h" "${CMAKE_CURRENT_BINARY_DIR}/Scene_moc.cpp")
add_file_dependencies(Scene_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/Scene.h")
qt5_add_resources(CGAL_Qt5_RESOURCE_FILES AABB_demo.qrc)
add_file_dependencies(
AABB_demo.cpp "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp"
"${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp"
"${CMAKE_CURRENT_BINARY_DIR}/Scene_moc.cpp")
add_executable(
AABB_demo AABB_demo.cpp ${UI_FILES} ${CGAL_Qt5_RESOURCE_FILES}
#${CGAL_Qt5_MOC_FILES}
qt_add_executable(
AABB_demo AABB_demo.cpp Scene.cpp benchmarks.cpp Viewer.cpp MainWindow.cpp
MainWindow.ui AABB_demo.qrc
)
# Link with Qt libraries
target_link_libraries(AABB_demo PRIVATE Qt5::Widgets Qt5::OpenGL
CGAL::CGAL CGAL::CGAL_Qt5)
target_link_libraries(AABB_demo PRIVATE Qt6::Gui Qt6::OpenGL
CGAL::CGAL CGAL::CGAL_Qt6)
add_to_cached_list(CGAL_EXECUTABLE_TARGETS AABB_demo)
include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake)
cgal_add_compilation_test(AABB_demo)
else(CGAL_Qt5_FOUND AND Qt5_FOUND)
else(CGAL_Qt6_FOUND AND Qt6_FOUND)
set(AABB_MISSING_DEPS "")
if(NOT CGAL_Qt5_FOUND)
set(AABB_MISSING_DEPS "CGAL_Qt5, ${AABB_MISSING_DEPS}")
if(NOT CGAL_Qt6_FOUND)
set(AABB_MISSING_DEPS "CGAL_Qt6, ${AABB_MISSING_DEPS}")
endif()
if(NOT Qt5_FOUND)
set(AABB_MISSING_DEPS "Qt5, ${AABB_MISSING_DEPS}")
if(NOT Qt6_FOUND)
set(AABB_MISSING_DEPS "Qt6, ${AABB_MISSING_DEPS}")
endif()
message("NOTICE: This demo requires ${AABB_MISSING_DEPS}, and will not be compiled.")
endif(CGAL_Qt5_FOUND AND Qt5_FOUND)
endif(CGAL_Qt6_FOUND AND Qt6_FOUND)

View File

@ -10,15 +10,19 @@
#include <QSettings>
#include <QHeaderView>
#include <QClipboard>
#include <QInputDialog>
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget* parent)
: CGAL::Qt::DemosMainWindow(parent)
: CGAL::Qt::DemosMainWindow(parent)
{
ui = new Ui::MainWindow;
ui->setupUi(this);
this->addAboutDemo(":/cgal/AABB_demo/about.html");
this->addAboutCGAL();
// saves some pointers from ui, for latter use.
m_pViewer = ui->viewer;
@ -418,7 +422,3 @@ void MainWindow::on_actionCopy_snapshot_triggered()
qb->setImage(snapshot);
QApplication::restoreOverrideCursor();
}

View File

@ -1,7 +1,6 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtOpenGL/qgl.h>
#include <CGAL/Qt/DemosMainWindow.h>
class QDragEnterEvent;
@ -12,7 +11,6 @@ namespace Ui {
class MainWindow;
}
class MainWindow :
public CGAL::Qt::DemosMainWindow
{
@ -21,12 +19,12 @@ public:
MainWindow(QWidget* parent = nullptr);
~MainWindow();
public slots:
public Q_SLOTS:
void updateViewerBBox();
void open(QString filename);
void setAddKeyFrameKeyboardModifiers(Qt::KeyboardModifiers);
protected slots:
protected Q_SLOTS:
// settings
void quit();

View File

@ -618,7 +618,7 @@ void Scene::draw(CGAL::QGLViewer* viewer)
vao[0].bind();
attrib_buffers(viewer);
rendering_program.bind();
color.setRgbF(0.7,0.0,0.0);
color.setRgbF(0.7f,0.0f,0.0f);
rendering_program.setUniformValue(colorLocation, color);
rendering_program.setUniformValue(fLocation, fMatrix);
gl->glDrawArrays(GL_POINTS, 0, static_cast<GLsizei>(pos_points.size()/3));
@ -631,7 +631,7 @@ void Scene::draw(CGAL::QGLViewer* viewer)
vao[1].bind();
attrib_buffers(viewer);
rendering_program.bind();
color.setRgbF(0.0,0.7,0.0);
color.setRgbF(0.0f,0.7f,0.0f);
rendering_program.setUniformValue(colorLocation, color);
rendering_program.setUniformValue(fLocation, fMatrix);
gl->glDrawArrays(GL_LINES, 0, static_cast<GLsizei>(pos_lines.size()/3));
@ -669,7 +669,7 @@ void Scene::draw(CGAL::QGLViewer* viewer)
vao[3].bind();
attrib_buffers(viewer);
rendering_program.bind();
color.setRgbF(1.0,0.0,0.0);
color.setRgbF(1.0f,0.0f,0.0f);
rendering_program.setUniformValue(colorLocation, color);
rendering_program.setUniformValue(fLocation, fMatrix);
gl->glDrawArrays(GL_LINES, 0, static_cast<GLsizei>(pos_cut_segments.size()/3));

View File

@ -1,7 +1,6 @@
#ifndef SCENE_H
#define SCENE_H
#include <QtOpenGL/qgl.h>
#include <iostream>
#include <cmath>
@ -77,7 +76,6 @@ private:
};
public:
QGLContext* context;
void draw(CGAL::QGLViewer*);
void update_bbox();
Bbox bbox() { return m_bbox; }
@ -173,7 +171,7 @@ private:
void attrib_buffers(CGAL::QGLViewer*);
void compile_shaders();
void compute_texture(int, int, Color_ramp, Color_ramp);
private slots:
private Q_SLOTS:
void updateCutPlane();
public:
@ -255,7 +253,7 @@ public:
public slots:
public Q_SLOTS:
// cutting plane
void cutting_plane(bool override = false);
void changed();

View File

@ -1,9 +1,6 @@
#include "Viewer.h"
#include "Scene.h"
#include <QMouseEvent>
#include <QGLFunctions>
#include <CGAL/Qt/CreateOpenGLContext.h>
Viewer::Viewer(QWidget* parent)
: CGAL::QGLViewer(parent),
m_pScene(nullptr),

View File

@ -1,4 +1,5 @@
#include "Scene.h"
#include "Refiner.h"
#include <QInputDialog>
#include <CGAL/Memory_sizer.h>

View File

@ -21,7 +21,6 @@
#include <CGAL/AABB_primitive.h>
#include <CGAL/boost/graph/property_maps.h>
#include <CGAL/Default.h>
#include <boost/mpl/if.hpp>
namespace CGAL {
@ -57,9 +56,9 @@ template < class FaceGraph,
class CacheDatum=Tag_false >
class AABB_face_graph_triangle_primitive
#ifndef DOXYGEN_RUNNING
: public AABB_primitive<typename boost::mpl::if_<OneFaceGraphPerTree,
: public AABB_primitive<std::conditional_t<OneFaceGraphPerTree::value,
typename boost::graph_traits<FaceGraph>::face_descriptor,
std::pair<typename boost::graph_traits<FaceGraph>::face_descriptor, const FaceGraph*> >::type,
std::pair<typename boost::graph_traits<FaceGraph>::face_descriptor, const FaceGraph*> >,
Triangle_from_face_descriptor_map<
FaceGraph,
typename Default::Get<VertexPointPMap,
@ -76,7 +75,7 @@ class AABB_face_graph_triangle_primitive
{
typedef typename Default::Get<VertexPointPMap, typename boost::property_map< FaceGraph, vertex_point_t>::const_type >::type VertexPointPMap_;
typedef typename boost::graph_traits<FaceGraph>::face_descriptor FD;
typedef typename boost::mpl::if_<OneFaceGraphPerTree, FD, std::pair<FD, const FaceGraph*> >::type Id_;
typedef std::conditional_t<OneFaceGraphPerTree::value, FD, std::pair<FD, const FaceGraph*> > Id_;
typedef Triangle_from_face_descriptor_map<FaceGraph,VertexPointPMap_> Triangle_property_map;
typedef One_point_from_face_descriptor_map<FaceGraph,VertexPointPMap_> Point_property_map;

View File

@ -24,7 +24,6 @@
#include <iterator>
#include <boost/mpl/and.hpp>
#include <CGAL/type_traits/is_iterator.h>
#include <boost/mpl/if.hpp>
#include <CGAL/Default.h>
@ -70,9 +69,9 @@ template < class HalfedgeGraph,
class CacheDatum = Tag_false >
class AABB_halfedge_graph_segment_primitive
#ifndef DOXYGEN_RUNNING
: public AABB_primitive< typename boost::mpl::if_<OneHalfedgeGraphPerTree,
: public AABB_primitive< std::conditional_t<OneHalfedgeGraphPerTree::value,
typename boost::graph_traits<HalfedgeGraph>::edge_descriptor,
std::pair<typename boost::graph_traits<HalfedgeGraph>::edge_descriptor, const HalfedgeGraph*> >::type,
std::pair<typename boost::graph_traits<HalfedgeGraph>::edge_descriptor, const HalfedgeGraph*> >,
Segment_from_edge_descriptor_map<
HalfedgeGraph,
typename Default::Get<VertexPointPMap,
@ -89,7 +88,7 @@ class AABB_halfedge_graph_segment_primitive
{
typedef typename Default::Get<VertexPointPMap,typename boost::property_map< HalfedgeGraph,vertex_point_t>::const_type >::type VertexPointPMap_;
typedef typename boost::graph_traits<HalfedgeGraph>::edge_descriptor ED;
typedef typename boost::mpl::if_<OneHalfedgeGraphPerTree, ED, std::pair<ED, const HalfedgeGraph*> >::type Id_;
typedef std::conditional_t<OneHalfedgeGraphPerTree::value, ED, std::pair<ED, const HalfedgeGraph*> > Id_;
typedef Segment_from_edge_descriptor_map<HalfedgeGraph,VertexPointPMap_> Segment_property_map;
typedef Source_point_from_edge_descriptor_map<HalfedgeGraph,VertexPointPMap_> Point_property_map;

View File

@ -73,7 +73,7 @@ public:
Result;
public:
First_intersection_traits(const AABBTraits& traits)
: m_result(), m_traits(traits)
: m_result(std::nullopt), m_traits(traits)
{}
bool go_further() const {
@ -202,7 +202,7 @@ class First_primitive_traits
public:
First_primitive_traits(const AABBTraits& traits)
: m_is_found(false)
, m_result()
, m_result(std::nullopt)
, m_traits(traits) {}
bool go_further() const { return !m_is_found; }

View File

@ -32,11 +32,11 @@ BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(Has_cartesian_const_iterator_3,Cartesian_const
template<typename GeomTraits>
struct Is_ray_intersection_geomtraits
: boost::mpl::and_< Has_ray_3<GeomTraits>,
Has_construct_source_3<GeomTraits>,
Has_vector_3<GeomTraits>,
Has_construct_cartesian_const_iterator_3<GeomTraits>,
Has_cartesian_const_iterator_3<GeomTraits> >::type
: std::bool_constant< Has_ray_3<GeomTraits>::value &&
Has_construct_source_3<GeomTraits>::value &&
Has_vector_3<GeomTraits>::value &&
Has_construct_cartesian_const_iterator_3<GeomTraits>::value &&
Has_cartesian_const_iterator_3<GeomTraits>::value >
{};

View File

@ -2,6 +2,7 @@ Advancing_front_surface_reconstruction
Algebraic_foundations
Arithmetic_kernel
BGL
CGAL_Core
Cartesian_kernel
Circulator
Distance_2

View File

@ -53,7 +53,7 @@ struct Rational_traits_base<Rational, true>
{
private:
typedef Fraction_traits<Rational> FT;
typedef typename FT::Decompose Decomose;
typedef typename FT::Decompose Decompose;
typedef typename FT::Compose Compose;
public:
@ -61,13 +61,13 @@ public:
RT numerator (const Rational& r) const {
RT num,den;
Decomose()(r,num,den);
Decompose()(r,num,den);
return num;
}
RT denominator (const Rational& r) const {
RT num,den;
Decomose()(r,num,den);
Decompose()(r,num,den);
return den;
}

View File

@ -194,21 +194,21 @@ root_of( int k, Input_iterator begin, Input_iterator end ) {
template< class Number_type >
inline
// select a Is_zero functor
typename boost::mpl::if_c<
::std::is_same< typename Algebraic_structure_traits< Number_type >::Is_zero,
Null_functor >::value ,
typename std::conditional_t<
std::is_same_v< typename Algebraic_structure_traits< Number_type >::Is_zero,
Null_functor >,
typename Real_embeddable_traits< Number_type >::Is_zero,
typename Algebraic_structure_traits< Number_type >::Is_zero
>::type::result_type
>::result_type
is_zero( const Number_type& x ) {
// We take the Algebraic_structure_traits<>::Is_zero functor by default. If it
// is not available, we take the Real_embeddable_traits functor
typename ::boost::mpl::if_c<
::std::is_same<
std::conditional_t<
std::is_same_v<
typename Algebraic_structure_traits< Number_type >::Is_zero,
Null_functor >::value ,
Null_functor > ,
typename Real_embeddable_traits< Number_type >::Is_zero,
typename Algebraic_structure_traits< Number_type >::Is_zero >::type
typename Algebraic_structure_traits< Number_type >::Is_zero >
is_zero;
return is_zero( x );
}

View File

@ -303,7 +303,7 @@ public:
Integer alpha_num = Integer(1), int log_denom = 1
) : alpha_num_(alpha_num),
beta_num_((Integer(1) << log_denom) - alpha_num),
half_((log_denom > 0) ? (Integer(1) << log_denom-1) : 0),
half_((log_denom > 0) ? Integer(Integer(1) << log_denom-1) : 0),
log_denom_(log_denom)
{
CGAL_precondition(log_denom_ >= 0);

View File

@ -206,7 +206,7 @@ polynomial_power_to_bernstein_approx(
std::vector<Integer> f(n+1);
polynomial_affine_transform_approx_log_denom(
first, beyond, f.begin(),
upper_num - lower_num, lower_num, log_denom,
Integer(upper_num - lower_num), lower_num, log_denom,
p+q,
approx, log, logl
);

View File

@ -27,31 +27,10 @@
#include <vector>
#if CGAL_USE_CORE
namespace CORE { class BigInt; }
#endif
namespace CGAL {
namespace internal {
#if CGAL_USE_CORE
// bugfix for CORE by Michael Kerber
// why is there a specialized function for CORE?
inline CORE::BigInt shift_integer_by(CORE::BigInt x, long shift){
if( shift > 0 ){
while(shift>63) {
x = (x >> 63);
shift-=63;
}
x = (x >> shift);
}else{
// add 0 bits
x = (x << -shift);
}
return x;
}
#endif
template <class Shiftable>
Shiftable shift_integer_by(Shiftable x, long shift){

View File

@ -327,7 +327,7 @@ public:
long operator()( CORE::BigFloat x ) const {
CGAL_precondition(!CGAL::zero_in(x));
x = CGAL::abs(x);
return CORE::floorLg(x.m()-x.err())+x.exp()*CORE::CHUNK_BIT;
return CORE::floorLg(CORE::BigInt(x.m()-x.err()))+x.exp()*CORE::CHUNK_BIT;
}
};
@ -337,7 +337,7 @@ public:
// (already commented out in EXACUS)...
// NiX_precond(!(NiX::in_zero(x) && NiX::singleton(x)));
x = CGAL::abs(x);
return CORE::ceilLg(x.m()+x.err())+x.exp()*CORE::CHUNK_BIT;
return CORE::ceilLg(CORE::BigInt(x.m()+x.err()))+x.exp()*CORE::CHUNK_BIT;
}
};

View File

@ -220,7 +220,7 @@ simple_bound_between(const Algebraic_real& a,
final_mantissa = final_mantissa << 1;
final_mantissa++;
y_log--;
x_m = x_m==0 ? 0 : x_m & ((Integer(1) << x_log) - 1); //x_m - CGAL::ipower(Integer(2),x_log);
x_m = x_m==0 ? 0 : Integer(x_m & ((Integer(1) << x_log) - 1)); //x_m - CGAL::ipower(Integer(2),x_log);
x_log = x_m==0 ? -1 : CGAL::internal::floor_log2_abs(x_m);
}
final_mantissa = final_mantissa << 1;

View File

@ -1,6 +1,7 @@
Algebraic_foundations
Algebraic_kernel_for_circles
Arithmetic_kernel
CGAL_Core
Filtered_kernel
Installation
Interval_support

View File

@ -1,6 +1,7 @@
Algebraic_foundations
Algebraic_kernel_for_spheres
Arithmetic_kernel
CGAL_Core
Filtered_kernel
Installation
Interval_support

View File

@ -1,6 +1,7 @@
Algebraic_foundations
Alpha_shapes_2
Arithmetic_kernel
CGAL_Core
Cartesian_kernel
Hash_map
Homogeneous_kernel

View File

@ -16,8 +16,8 @@ int main(int argc, char** argv)
application.setOrganizationName("GeometryFactory");
application.setApplicationName("Alpha Shape Reconstruction");
// Import resources from libCGALQt (Qt5).
// See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE
// Import resources from libCGAL_Qt6
// See https://doc.qt.io/qt-6/qtresource-proxy.html#Q_INIT_RESOURCE
CGAL_QT_INIT_RESOURCES;
Q_INIT_RESOURCE(Alpha_shape_3);

View File

@ -7,46 +7,32 @@ project(Alpha_shapes_3_Demo)
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)
if(NOT POLICY CMP0070 AND POLICY CMP0053)
# Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning.
cmake_policy(SET CMP0053 OLD)
endif()
if(POLICY CMP0071)
cmake_policy(SET CMP0071 NEW)
endif()
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6)
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
find_package(Qt6 QUIET COMPONENTS Widgets OpenGL)
find_package(Qt5 QUIET COMPONENTS Widgets OpenGL)
if(CGAL_Qt5_FOUND AND Qt5_FOUND)
if(CGAL_Qt6_FOUND AND Qt6_FOUND)
add_definitions(-DQT_NO_KEYWORDS)
# include(${QT_USE_FILE})
include_directories(BEFORE ./)
# Instruct CMake to run moc/ui/rcc automatically when needed.
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
# ui file, created with Qt Designer
qt5_wrap_ui(uis MainWindow.ui)
qt_add_executable(Alpha_shape_3 Alpha_shape_3.cpp MainWindow.cpp Viewer.cpp
MainWindow.ui Alpha_shape_3.qrc)
# qrc files (resources files, that contain icons, at least)
qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Alpha_shape_3.qrc)
add_executable(
Alpha_shape_3 Alpha_shape_3.cpp MainWindow.cpp Viewer.cpp ${uis}
${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES})
add_to_cached_list(CGAL_EXECUTABLE_TARGETS Alpha_shape_3)
target_link_libraries(Alpha_shape_3 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5
Qt5::Widgets Qt5::OpenGL)
target_link_libraries(Alpha_shape_3 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6
Qt6::Widgets Qt6::OpenGL)
include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake)
cgal_add_compilation_test(Alpha_shape_3)
else()
message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.")
message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.")
endif()

View File

@ -0,0 +1,14 @@
The purpose of this repository is to make some range data
and detailed reconstructions available to the public. Currently, this repository only contains models that were scanned and reconstructed
at the Stanford Computer Graphics Laboratory . In the future, we hope to include data sets and reconstructions from other sources.
The models in this repository were all scanned with a Cyberware 3030MS optical triangulation scanner.
Please acknowledge ....
http://www-graphics.stanford.edu/data/3Dscanrep/
e-mail: 3Dscanrep@graphics.stanford.edu
file://www-graphics.stanford.edu/pub/zippack/data/
http://www.hs.washington.edu/locke/vislab/
http://biocomp.arc.nasa.gov/3dreconstruction/data/
medical data

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,582 @@
581
-9496.000158 -6621.999660 73324.000108
1941.000008 -502.999956 53448.000262
-13993.000076 -9472.000458 73547.999893
-3165.000198 2805.999696 53841.000158
3941.000109 -826.999564 53350.999780
-13992.999698 -6391.999696 73548.000325
-4629.000334 -2729.999756 72919.999638
-14544.000229 7643.999701 62169.999969
-3539.000009 -7617.000066 72743.000159
-3569.999951 1963.000330 53954.000331
4099.000115 540.000082 55720.000195
3946.000208 3611.000347 54343.000242
3942.000336 -1955.000290 53845.000430
24.000106 -8480.000056 72560.000446
-2817.999819 -7080.000021 72739.999999
274.999768 2681.999578 53612.999729
-5673.000363 -8522.000312 72919.999924
-3569.999681 5328.999917 53954.000391
7057.000447 22.999921 72019.999778
-7114.999994 -4259.000412 73100.000243
3129.999877 -1020.000207 53119.999650
-14575.999938 2064.000292 60412.000409
-8087.999603 -2692.999873 73164.999998
-9496.000263 -8099.000270 73323.999696
-14575.999757 4785.999619 60412.000416
1767.000453 -2710.000440 72380.000399
4723.999558 2984.999684 72199.999829
4173.000154 -1942.000364 57518.000224
-14185.000047 -8155.999786 69664.999947
8462.999751 -2789.999723 72019.999998
-14475.999680 -6322.000368 63961.000010
-14185.000218 -6669.000381 69665.000452
-14411.999521 8769.999611 63528.000202
-3929.999793 121.999623 53660.000393
-3538.999885 -6227.999801 72743.000078
5664.000221 8483.999673 72199.999788
4160.000223 3746.999664 57257.999712
16.999585 1061.999516 53479.999584
3441.000482 4789.999724 53120.000035
3941.000301 861.000216 53350.999558
3941.000166 186.000103 53350.999891
-5672.999756 5721.000193 72920.000053
-14411.999799 1051.999879 63528.000013
3441.000192 5308.999633 53119.999836
-13970.999556 -6778.999631 71592.999827
-5673.000352 1448.000308 72919.999896
1941.000287 3661.000398 53448.000221
4159.999588 2681.999997 57257.999788
2098.999573 1058.000232 53299.999983
-3569.999774 280.000127 53953.999842
-3538.999679 -9006.000017 72743.000111
-3570.000143 -1402.000081 53954.000006
-7115.000060 5734.999820 73099.999872
-1026.999875 -1026.999558 53479.999537
7056.999811 -4195.999750 72020.000402
-3570.000168 3085.000137 53954.000020
-13970.999844 -9803.999811 71592.999532
17.000252 6285.000424 53479.999576
-14322.999690 -2587.000320 65092.999918
-5387.999792 -1969.999910 72920.000067
-1426.999888 2743.999772 53744.000433
-3538.999950 -2059.999970 72742.999563
-14412.000000 6664.999905 63527.999948
-3570.000271 3646.000059 53954.000087
-3929.999828 -1973.999852 53659.999952
-4237.999601 -7080.000344 72740.000252
-14373.000194 -7866.999965 65785.999683
3946.000001 2584.000490 54343.000220
3941.000101 2886.999557 53350.999752
4160.000230 551.000414 57257.999512
4264.000084 1686.000457 60564.000497
-9495.999646 -3667.999852 73323.999965
4288.000261 1950.999734 60834.000001
1432.000381 -1938.999865 53464.000475
-5126.999748 3887.999847 72980.999916
4287.999632 278.999662 60833.999729
-2072.000101 17.000308 53479.999547
-14411.999918 5261.999514 63527.999544
-14185.000455 -5180.999602 69665.000041
4263.999685 -536.999855 60563.999513
4724.000258 1575.000409 72200.000149
4159.999987 4812.999838 57258.000035
-3930.000140 4837.999779 53659.999939
-8543.000324 -8542.999590 73099.999989
-3570.000177 840.999915 53954.000138
3941.000105 1874.000098 53351.000382
3946.000349 4637.999658 54342.999822
8462.999539 8462.999818 72019.999892
5664.000082 4253.999844 72200.000354
-5387.999671 2302.000049 72920.000121
-5388.000189 166.000459 72919.999521
5664.000053 -4206.999676 72200.000476
2473.999900 -2709.999879 72380.000265
16.999506 -1027.000446 53479.999576
4263.999639 -1647.999637 60564.000406
3441.000140 1676.999539 53120.000327
-9496.000107 -5145.000342 73323.999932
-13992.999533 -4852.000259 73548.000110
4287.999970 6968.000328 60833.999686
275.000199 3746.999653 53612.999629
-14412.000182 -350.999721 63528.000472
-13992.999868 -4338.000196 73547.999622
-8543.000347 -4259.000087 73100.000032
16.999876 5240.000063 53479.999960
-14372.999770 -9301.999508 65786.000118
-5127.000314 8129.000114 72980.999503
-1394.000093 -4227.999771 72560.000486
4098.999711 3673.000482 55719.999928
3946.000083 -1523.000092 54342.999694
4724.000061 -1246.000449 72200.000281
-13720.999502 -5353.000086 73556.000360
4723.999887 7215.000403 72200.000242
-14184.999932 -2754.999701 67936.999780
1437.000194 -5630.999670 72380.000099
-5444.999665 -9188.000372 72930.000378
-4238.000442 -8500.999822 72740.000263
-8542.999594 4307.000192 73099.999910
-5388.000269 6574.999714 72920.000493
-1394.000324 -2811.000366 72559.999570
16.999584 16.999963 53479.999782
-14327.000037 -2687.000254 67063.000303
-1027.000347 6284.999698 53480.000414
2850.999763 -5631.000213 72380.000333
-14543.999669 -8982.999787 62170.000241
-1426.999789 563.000156 53743.999616
-5127.000214 -2474.000449 72980.999585
-8542.999689 5734.999797 73100.000259
-13993.000354 -8958.999738 73548.000223
1057.999632 3139.999725 53299.999575
7056.999573 1429.999852 72020.000196
-13412.999816 -2989.999795 73597.999993
-14411.999793 5963.000061 63527.999980
-14544.000399 3487.000172 62169.999836
4723.999840 869.999743 72200.000174
1940.999817 5742.999710 53447.999666
-14411.999874 7365.999941 63528.000371
3441.000223 5827.000153 53120.000059
1941.000349 1579.000153 53447.999990
4723.999767 5099.999678 72199.999767
-5444.999773 -6354.000185 72929.999902
-11526.999785 -8253.000306 73393.000090
4287.999859 5853.000374 60833.999882
-3538.999732 -3449.999625 72742.999793
-13993.000364 -7932.000020 73548.000260
-14373.000228 -3563.000378 65785.999768
4253.999995 -7026.999870 72200.000060
-3164.999721 -539.000085 53841.000259
3940.999621 -1165.000187 53351.000040
4251.999655 -1611.999954 58826.000287
3130.000441 1055.000205 53119.999800
-7114.999827 -7115.000264 73100.000269
-5388.000004 5151.000233 72919.999833
-14543.999690 -4825.999812 62169.999558
-3929.999555 6411.000130 53659.999733
1940.999639 4702.000362 53447.999846
-14411.999716 2454.999607 63527.999612
3440.999501 -915.999922 53119.999778
4288.000012 -1950.999731 60833.999534
275.000261 1616.000437 53612.999949
-1427.000136 -527.000171 53743.999568
4251.999503 -525.000281 58825.999809
-260.999615 -1966.999943 53479.999718
7057.000208 -5603.000018 72020.000259
-5127.000479 6715.000320 72980.999619
-1427.000327 3834.000257 53744.000353
3440.999911 6346.000423 53120.000030
2850.999822 -7045.000455 72380.000243
5664.000435 -1386.999766 72200.000059
-14412.000002 3156.999581 63527.999801
-8543.000189 -7115.000435 73099.999877
3445.999629 2566.999931 53380.000265
3440.999872 -1434.999562 53119.999546
-3165.000457 5035.000031 53841.000213
-3929.999582 2218.000457 53659.999557
3445.999965 -1512.999532 53379.999504
-1958.000338 -1957.000101 53738.999698
275.000452 -1581.000215 53613.000308
-14088.000048 -2934.999842 70989.999715
-14373.000177 -4997.999695 65786.000128
8462.999777 5649.999794 72019.999678
1058.000275 6263.000038 53300.000358
-7102.000019 -2619.000327 73101.999718
-8542.999951 -5687.000307 73099.999616
-3930.000250 2741.999930 53660.000203
1300.999742 -1960.999792 53299.999640
4723.999966 4394.999535 72200.000035
4098.999994 1583.999527 55720.000241
-13992.999829 -8445.999614 73548.000422
4098.999861 -1548.999788 55719.999858
-3930.000368 -1449.999960 53660.000492
4287.999872 3066.000210 60833.999876
4287.999522 2508.000016 60833.999841
-5445.000250 -3519.000073 72930.000344
-14232.999547 -8002.000380 67645.000212
-5126.999777 -1767.000240 72980.999857
3129.999543 5204.999843 53119.999708
3946.000005 530.999826 54343.000175
-13721.000221 -3816.000216 73556.000357
8463.000349 22.999637 72020.000002
4724.000003 3690.000471 72200.000108
1058.000380 4180.999601 53300.000207
274.999810 5879.000134 53613.000459
354.000245 -2715.999978 72560.000238
1437.000165 -4217.000476 72380.000479
3940.999844 4913.000151 53350.999582
-2895.000382 -1945.000376 53846.999541
2099.000389 2099.000230 53300.000474
8463.000426 1430.000487 72020.000078
4252.000374 561.000004 58826.000032
3940.999558 523.000164 53351.000416
1437.000253 -2804.000496 72380.000323
-14543.999762 -3440.999829 62169.999916
-14543.999982 -6211.999551 62170.000041
3441.000291 2714.999685 53119.999987
5663.999985 -2797.000025 72200.000024
-14411.999984 -1051.999942 63528.000370
3440.999562 4271.000407 53120.000029
-3539.000186 2107.000409 72743.000388
1057.999822 -1024.000255 53300.000171
3945.999666 5664.999689 54342.999562
-5126.999539 5301.000010 72981.000462
-14575.999627 -3379.999597 60411.999811
3180.999744 -2710.000374 72380.000052
-1026.999719 4195.999827 53480.000234
-3165.000176 575.999615 53840.999507
3941.000445 -151.999807 53351.000391
-14576.000174 -657.999845 60411.999636
-2349.999962 -1966.999590 53479.999902
-14411.999854 3858.999681 63528.000283
-10090.000319 -2795.000040 73260.999652
3941.000477 5924.999710 53350.999731
4085.000468 -1954.000357 55213.000428
4253.999936 -8436.999819 72199.999776
-1394.000360 -8479.999946 72559.999636
-3569.999726 -841.000285 53953.999993
-9083.999507 -2718.999761 73217.000072
3441.000399 640.000398 53120.000050
4287.999748 -1394.000023 60833.999874
5664.000340 7073.999686 72199.999963
-5387.999666 4438.999817 72919.999562
7056.999636 -7010.000061 72019.999662
1057.999689 5222.000173 53299.999663
-5673.000248 4296.000142 72920.000031
-1027.000260 5239.999713 53480.000273
-7114.999766 -8543.000300 73100.000022
274.999590 551.000141 53612.999775
-3929.999711 -926.000493 53660.000132
4288.000365 -836.000403 60833.999756
3446.000332 3586.999913 53379.999531
3887.999686 -2709.999801 72379.999876
-3539.000418 -670.999562 72742.999614
4251.999963 1648.000235 58826.000350
7056.999875 -1382.999580 72019.999867
-11526.999831 -9757.999777 73393.000349
3130.000328 4167.000247 53120.000320
8463.000402 2837.000196 72020.000275
3446.000436 -493.000175 53380.000405
-1427.000357 6013.999828 53744.000254
-13993.000352 -5365.000211 73547.999983
3130.000064 6241.999698 53120.000243
-1393.999680 -7061.999503 72559.999762
-3929.999947 3266.000354 53660.000396
-5388.000052 8711.000308 72919.999522
-5387.999641 5862.999935 72920.000126
-5673.000220 24.000330 72919.999842
4160.000111 -514.999580 57257.999620
3445.999928 527.000347 53379.999914
-8542.999580 7162.000367 73099.999863
2947.999993 -1968.000009 53405.999963
-3929.999592 -1974.000291 53659.999860
-1305.999625 -1967.000077 53480.000398
3129.999665 3130.000305 53119.999882
-4237.999635 -4237.999904 72739.999541
7057.000491 4243.000297 72019.999582
-14576.000246 -6102.000206 60411.999747
4264.000083 2796.999726 60563.999829
4724.000254 5805.000459 72199.999985
-5672.999808 -7097.000478 72920.000322
-7114.999930 1452.000036 73099.999694
-3929.999839 4313.999708 53660.000336
-13971.000086 -5267.000118 71592.999574
-3164.999892 1691.000266 53840.999559
3941.000485 1198.999988 53351.000119
-2071.999680 1062.000046 53480.000119
-3930.000107 5362.999664 53659.999659
-13972.000434 -2989.999797 73073.000355
-5387.999734 1589.999640 72920.000470
-14575.999747 6147.000157 60412.000152
-3539.000484 4885.000479 72743.000415
-8543.000350 23.999745 73100.000201
4159.999933 5878.999799 57258.000196
-5444.999733 -7771.000335 72929.999842
-14372.999532 -6432.999688 65786.000443
3941.000032 5250.000483 53350.999566
-2817.999801 -4237.999840 72739.999681
2099.000054 4180.999939 53300.000374
3440.999903 121.000021 53120.000493
-14575.999797 -4741.000478 60411.999775
3940.999685 1535.999624 53351.000429
-14576.000473 702.999598 60412.000428
-14475.999775 -4911.999679 63960.999993
-14131.000326 -2857.999672 69963.000289
2099.000221 -1024.000206 53299.999555
-3539.000177 -4839.000490 72742.999973
-5672.999696 -4248.999669 72919.999901
1057.999780 16.999883 53300.000257
5663.999977 5663.999867 72199.999515
5663.999992 -8436.999738 72200.000314
-14412.000335 8068.000149 63527.999665
-5388.000218 -545.999702 72919.999648
4264.000448 3907.999781 60564.000285
3129.999620 2092.000354 53120.000415
1062.999967 -2715.999634 72560.000024
3940.999708 -1840.000490 53351.000006
23.999785 -4227.999646 72560.000090
-3165.000129 -1654.000323 53840.999660
-5127.000159 2474.000343 72981.000044
3941.000234 2210.999659 53351.000276
1436.999565 -7045.000204 72380.000395
-1426.999662 1654.000050 53744.000497
4159.999762 -1580.999657 57257.999765
2099.000277 6263.000009 53300.000166
-14233.000173 -9461.999637 67644.999640
4724.000132 6510.000452 72199.999686
-5388.000295 3014.999741 72919.999528
4107.000341 -1973.999932 55973.999842
-1027.000486 1061.999561 53480.000336
4263.999763 5018.999546 60563.999509
-3126.999968 6305.999575 53660.000329
-1062.999814 -2715.999805 72559.999701
3441.000092 -398.000054 53119.999576
23.999882 -5645.000302 72559.999942
-5126.999834 4594.000338 72980.999829
4252.000254 4907.999952 58825.999554
-3569.999712 4767.999673 53953.999940
-14476.000032 -9143.000078 63960.999819
4071.000131 -1967.999892 54460.000432
3440.999875 3752.000283 53120.000467
-14576.000485 3424.999842 60411.999944
-5160.999508 -2520.999928 72949.000110
4287.999692 3622.999957 60834.000077
-5127.000118 1767.000066 72980.999700
5663.999655 24.000344 72200.000194
-14576.000480 7508.000120 60411.999689
-2881.999956 -1974.000116 53659.999591
3129.999776 16.999790 53119.999905
-13993.000072 -5879.000105 73548.000170
4723.999855 -2656.000037 72200.000312
3940.999633 4574.999653 53351.000095
17.000159 3150.999751 53479.999993
-13721.000066 -6890.000008 73555.999864
-5673.000136 8569.000239 72919.999812
4287.999834 1393.999656 60834.000047
-5127.000002 3181.000499 72980.999577
1437.000111 -8457.999664 72379.999810
-1027.000182 3151.000481 53480.000213
8462.999880 -5602.999786 72020.000397
5663.999998 -7027.000337 72200.000179
-2071.999836 5240.000427 53480.000403
3445.999729 4607.000036 53380.000383
-1394.000136 -5645.000011 72559.999949
-3127.000033 2113.999786 53660.000272
3941.000324 2548.999788 53350.999985
3940.999570 -1502.000342 53351.000013
-3126.999914 -1030.999894 53659.999552
-4238.000253 -2817.999880 72739.999988
3440.999843 -1953.999504 53120.000421
259.999737 -1960.999636 53300.000138
-245.000117 -1948.999943 53618.999915
-11526.999811 -5243.000037 73392.999756
4724.000234 165.000038 72199.999547
-3126.999977 3161.999991 53659.999978
-3569.999564 4207.000094 53953.999501
275.000170 -514.999842 53613.000034
-11526.999613 -6747.999928 73392.999616
-7390.999730 -5035.000249 73077.999705
275.000340 4813.000352 53612.999844
-2071.999948 3150.999602 53480.000403
4251.999765 2735.000064 58826.000103
-7115.000351 -5686.999885 73100.000358
4098.999827 2628.999611 55719.999560
8463.000124 -7010.000397 72020.000009
-14232.999615 -6543.000442 67645.000485
-3930.000232 5887.000299 53659.999634
-14544.000461 2101.000409 62170.000359
3372.000265 -1954.000261 53119.999806
-14412.000115 1754.000439 63527.999500
-14438.999828 -2520.999738 64242.999578
-14329.999599 -2661.000068 66073.000238
1941.000120 -1544.000357 53448.000031
-4238.000332 -5659.000491 72740.000442
4098.999594 -505.000192 55720.000025
-2818.000128 -5658.999652 72739.999655
4288.000306 -278.999978 60833.999586
-1026.999893 17.000290 53480.000077
-7114.999937 2878.999603 73099.999625
4251.999706 3821.999721 58825.999856
-14544.000411 -7596.999761 62170.000298
-3539.000189 6273.999627 72742.999519
-8542.999929 8590.000255 73100.000232
-14544.000350 715.999575 62170.000076
-9495.999848 -9576.000383 73323.999907
-14576.000232 -7462.000020 60411.999731
-14184.999642 -9643.999972 69665.000056
-13970.999811 -8291.000315 71593.000038
-5126.999814 1060.000113 72981.000052
-7115.000366 7162.000434 73099.999958
-3165.000448 6150.000036 53840.999507
8462.999808 4242.999904 72020.000254
7057.000202 -2790.000123 72020.000020
-2071.999832 -1026.999844 53479.999642
-7114.999518 -1404.000177 73100.000300
3941.000476 3223.999580 53351.000151
-3569.999782 1402.000069 53953.999777
-3570.000289 7012.000244 53953.999930
-5388.000194 877.999982 72919.999818
-5126.999702 6008.000102 72980.999919
4263.999700 6130.999796 60564.000158
-8543.000290 1452.000226 73100.000426
2850.999705 -4217.000056 72379.999818
7056.999509 7057.000433 72019.999792
-13992.999692 -3312.000439 73548.000061
2850.999879 -8457.999587 72380.000259
-3538.999600 718.000352 72742.999931
-3930.000315 646.000457 53659.999635
4264.000193 573.999697 60564.000002
2099.000093 5221.999649 53300.000412
-2071.999917 6284.999527 53479.999583
4723.999862 7920.000427 72199.999887
4330.999705 -1963.000266 59887.000081
2851.000238 -2803.999644 72380.000218
3440.999720 2195.999826 53119.999530
-14543.999739 -2055.000043 62170.000137
-14544.000178 -669.999739 62170.000308
-14411.999915 351.000242 63527.999545
3940.999876 5587.999982 53351.000452
-11526.999792 -3737.999544 73392.999629
3940.999584 4236.999929 53351.000136
-7115.000083 -2831.999613 73099.999909
-14232.999742 -5082.999812 67645.000324
-3570.000011 -1963.000243 53954.000457
-14575.999963 -8822.999905 60411.999771
-3196.999729 -2722.999629 72739.999728
4270.999791 -1943.999513 59089.999553
-3930.000132 -402.000411 53659.999785
4287.999518 -1951.000148 60834.000344
1057.999742 2098.999992 53299.999970
24.000007 -2810.999989 72560.000497
-3570.000037 -280.000196 53954.000365
7056.999709 -8415.999536 72020.000349
7057.000090 5650.000225 72020.000014
4099.000497 4718.000121 55719.999993
-7115.000395 24.000272 73099.999724
-14476.000166 -3502.000326 63961.000485
-3569.999717 6450.999920 53954.000143
-1163.000334 -1973.999751 53745.000092
4723.999824 -541.000100 72200.000243
3940.999990 3899.999923 53350.999622
-3127.000218 5257.999652 53659.999673
8463.000217 -1382.999504 72019.999695
-14232.999844 -3624.000203 67645.000238
-7390.999511 -3588.999711 73077.999992
-5127.000472 352.999759 72981.000130
2099.000363 16.999945 53300.000261
-7390.999682 -6480.000469 73077.999642
-5387.999952 7999.000376 72920.000277
-3569.999553 2524.000332 53954.000210
3445.999802 5627.000372 53380.000121
-8543.000137 2878.999786 73100.000062
-11225.000154 -2878.000184 73429.000219
-5444.999752 -4937.000206 72929.999910
-3539.000116 3495.999641 72743.000028
4724.000434 -1950.999984 72200.000236
-5387.999758 7287.000091 72920.000451
3694.000162 -1947.999707 53364.999539
-14412.000272 -1753.999800 63528.000480
4724.000342 8625.000362 72199.999560
2341.999734 -1961.000092 53299.999848
-2071.999756 4196.000324 53480.000336
-8543.000296 -2832.000371 73099.999810
-5127.000024 8834.999681 72980.999971
-13992.999602 -3825.000472 73548.000110
3446.000174 1546.999928 53380.000489
-3127.000366 4209.999619 53659.999561
-5387.999685 -1258.000068 72920.000033
-13720.999529 -8426.000197 73555.999797
4135.999975 -1958.000343 56742.000312
1058.000030 1057.999685 53299.999642
2194.000288 -1954.000142 53438.999837
1821.999693 -1961.000245 53300.000177
-2486.000272 -2723.000311 72740.000113
4251.999519 5994.999969 58825.999706
-782.999723 -1966.999702 53480.000385
-14184.999503 -3694.000155 69664.999741
-7391.000162 -7925.000424 73077.999760
3941.000365 3562.000286 53350.999697
-5673.000072 -2824.999976 72920.000076
-3929.999836 3789.999783 53660.000108
4288.000033 5295.999782 60834.000285
8463.000290 -4195.999621 72020.000158
-1026.999905 2106.000122 53480.000172
-14544.000315 6258.000031 62169.999860
2098.999845 3140.000130 53300.000384
17.000326 2105.999614 53480.000329
-2817.999707 -2817.999500 72740.000297
-5127.000216 7421.999889 72980.999545
-14035.000213 -2961.999816 72026.999857
3941.000206 -490.000295 53351.000305
-3127.000000 1065.999857 53660.000041
-14412.000070 4560.000349 63527.999884
-1427.000275 -1616.999797 53744.000069
-6126.000265 -2593.999720 73030.000099
4099.000391 5762.000184 55719.999589
3440.999902 1159.000232 53119.999985
23.999963 -7062.000133 72559.999953
-3164.999618 3921.000274 53840.999514
3940.999690 6263.000241 53351.000160
5663.999668 1434.000202 72199.999998
3946.000045 -496.000294 54342.999676
-3538.999923 7662.999718 72742.999936
3946.000069 1557.999781 54343.000397
-13992.999519 -7419.000292 73548.000211
-14576.000246 -2018.999804 60411.999775
4724.000039 2279.999748 72200.000311
4253.999732 -5616.999621 72199.999908
1940.999753 2619.999683 53447.999667
3441.000116 3234.000032 53120.000379
-7114.999901 4307.000119 73100.000483
4288.000399 4738.000285 60834.000007
4253.999724 -2797.000058 72199.999720
5664.000222 2843.999541 72200.000437
7056.999584 8463.000456 72020.000228
-3930.000418 1694.000154 53659.999991
-353.999670 -2715.999787 72559.999549
-14162.999975 -2781.999699 68944.999901
4287.999827 4180.999517 60834.000197
-2071.999586 2105.999678 53480.000453
-7390.999953 -9370.000271 73077.999510
8462.999606 7057.000057 72020.000254
7056.999555 2837.000361 72019.999548
-7114.999806 8589.999936 73100.000030
-5126.999903 -1060.000339 72980.999664
8463.000265 -8415.999563 72019.999761
-14475.999815 -7732.000263 63960.999905
-14411.999736 -2454.999933 63528.000161
4253.999680 -4207.000000 72200.000403
-5341.000241 -2729.999555 72920.000190
2853.000367 -1953.999662 53119.999629
-3406.000346 -1973.999690 53659.999516
-1775.999547 -2723.000080 72740.000246
4217.999913 -1960.999660 58299.999623
-12252.999887 -2905.000019 73451.999641
-8542.999786 -1404.000473 73099.999728
-3126.999630 16.999618 53660.000475
4159.999910 1615.999982 57258.000198
-2818.000192 -8501.000061 72739.999578
-5673.000319 -5673.000048 72919.999599
-5126.999657 -352.999916 72981.000008
-14543.999526 4873.000287 62170.000355
5664.000113 -5617.000339 72200.000484
-13992.999970 -6905.000388 73548.000167
-3906.999574 -2723.000211 72740.000342
-5672.999570 -1399.999715 72920.000026
-3569.999982 5890.000467 53954.000331
4288.000173 6409.999525 60833.999858
-5387.999815 -2682.000374 72920.000431
-13971.000415 -3755.000354 71592.999978
-3930.000128 1170.000156 53659.999938
-1828.000158 -1966.999726 53479.999657
17.000335 4196.000427 53479.999613
-1427.000066 4924.000037 53743.999863
-13721.000451 -9963.000322 73555.999557
-5388.000021 3727.000164 72919.999832
1941.000051 538.000495 53448.000163
4287.999864 836.000460 60833.999839
780.999670 -1960.999553 53299.999658
-5673.000397 7144.999809 72919.999807
-5673.000146 2871.999537 72920.000249
533.000383 -1965.000046 53607.999748
-13992.999662 -9985.999679 73548.000146
4582.999714 -2702.999761 72199.999726

View File

@ -0,0 +1,8 @@
7
5.51274721097227705 8.87625776353026552 1.95944807904169238
9.0973375091665627 3.5350701520269201 4.7238755547204434
0.911806739546155987 6.95856700036594145 2.36699662526417143
5.36336900378107373 1.05840486239320186 1.22179856797203001
0.289239615689291796 9.24621240074391082 2.17110435171762095
1.39772879354093327 3.51084799856703622 9.44541630320511771
7.31227573940480369 2.67306741439382023 0.511378392640958745

View File

@ -0,0 +1,17 @@
5.51275 8.87626 1.95945
0.911807 6.95857 2.367
5.36337 1.0584 1.2218
7.31228 2.67307 0.511378
9.09734 3.53507 4.72388
1.39773 3.51085 9.44542
0.28924 9.24621 2.1711
4 5 0
5 6 0
1 0 6
3 2 4
4 0 3
2 3 1
0 1 3
2 5 4
5 2 1
6 5 1

View File

@ -0,0 +1,857 @@
856
304.000000 483.000000 110.000433
173.000000 315.000000 150.000135
389.000000 259.000000 110.000009
197.000000 341.000000 130.000097
390.000000 329.000000 69.999907
87.000000 189.000000 119.999588
427.000000 391.000000 19.999914
219.000000 283.000000 159.999587
228.000000 410.000000 149.999687
176.000000 356.000000 150.000143
36.000000 243.000000 40.000174
409.000000 409.000000 9.999581
345.000000 395.000000 130.000241
378.000000 336.000000 79.999859
405.000000 442.000000 29.999878
437.000000 388.000000 20.000099
385.000000 345.000000 90.000418
223.000000 509.000000 10.000330
253.000000 62.000000 10.000304
339.000000 498.000000 40.000232
418.000000 406.000000 20.000279
203.000000 86.000000 99.999776
96.000000 159.000000 120.000081
390.000000 320.000000 69.999762
344.000000 362.000000 139.999772
157.000000 57.000000 -0.000304
130.000000 480.000000 40.000064
190.000000 294.000000 160.000245
407.000000 398.000000 30.000234
396.000000 436.000000 40.000360
387.000000 332.000000 49.999562
192.000000 317.000000 149.999693
90.000000 134.000000 99.999822
92.000000 252.000000 130.000028
164.000000 251.000000 159.999649
161.000000 448.000000 120.000467
380.000000 453.000000 50.000039
76.000000 423.000000 39.999921
410.000000 176.000000 40.000464
346.000000 238.000000 140.000280
278.000000 464.000000 130.000458
318.000000 464.000000 110.000374
421.000000 273.000000 39.999857
320.000000 85.000000 9.999990
230.000000 60.000000 40.000167
403.000000 443.000000 9.999941
377.000000 278.000000 129.999965
211.000000 75.000000 79.999614
396.000000 451.000000 19.999695
379.000000 323.000000 100.000100
138.000000 162.000000 149.999904
373.000000 359.000000 119.999709
298.000000 154.000000 140.000005
377.000000 481.000000 19.999977
405.000000 280.000000 99.999667
412.000000 329.000000 20.000329
392.000000 320.000000 80.000343
155.000000 323.000000 159.999924
171.000000 323.000000 149.999700
70.000000 369.000000 60.000396
270.000000 512.000000 100.000031
62.000000 359.000000 10.000338
401.000000 300.000000 49.999758
366.000000 156.000000 99.999742
125.000000 289.000000 150.000344
306.000000 417.000000 140.000297
189.000000 303.000000 160.000009
215.000000 339.000000 140.000396
346.000000 349.000000 139.999537
73.000000 365.000000 69.999577
127.000000 77.000000 70.000150
108.000000 80.000000 9.999701
416.000000 396.000000 29.999763
355.000000 471.000000 70.000335
383.000000 332.000000 79.999789
279.000000 495.000000 109.999962
182.000000 392.000000 139.999695
418.000000 194.000000 20.000169
399.000000 396.000000 49.999602
323.000000 406.000000 139.999632
401.000000 296.000000 70.000372
116.000000 94.000000 90.000421
408.000000 302.000000 39.999870
398.000000 444.000000 39.999970
391.000000 316.000000 59.999679
34.000000 233.000000 29.999582
406.000000 412.000000 20.000116
75.000000 278.000000 109.999973
36.000000 251.000000 19.999539
387.000000 142.000000 -0.000290
415.000000 231.000000 60.000112
114.000000 84.000000 59.999969
176.000000 309.000000 159.999733
104.000000 469.000000 79.999782
134.000000 80.000000 80.000475
365.000000 453.000000 60.000166
76.000000 325.000000 100.000301
372.000000 346.000000 120.000425
384.000000 160.000000 79.999710
352.000000 318.000000 129.999934
385.000000 317.000000 40.000493
381.000000 319.000000 110.000497
103.000000 84.000000 19.999857
400.000000 406.000000 40.000279
354.000000 491.000000 60.000459
419.000000 282.000000 10.000487
203.000000 507.000000 60.000487
235.000000 510.000000 89.999674
444.000000 387.000000 29.999811
391.000000 313.000000 99.999893
398.000000 450.000000 9.999883
131.000000 300.000000 150.000225
83.000000 110.000000 40.000016
187.000000 503.000000 -0.000434
155.000000 323.000000 150.000140
212.000000 54.000000 19.999945
97.000000 291.000000 129.999725
148.000000 308.000000 149.999883
343.000000 211.000000 139.999546
198.000000 328.000000 120.000389
431.000000 405.000000 19.999725
400.000000 300.000000 89.999605
400.000000 184.000000 80.000122
362.000000 340.000000 129.999568
347.000000 272.000000 140.000053
104.000000 251.000000 140.000464
71.000000 131.000000 59.999648
110.000000 94.000000 79.999923
374.000000 479.000000 40.000239
372.000000 328.000000 99.999759
374.000000 456.000000 49.999600
217.000000 466.000000 129.999695
207.000000 340.000000 119.999813
394.000000 298.000000 109.999600
398.000000 158.000000 20.000463
376.000000 422.000000 69.999535
419.000000 204.000000 39.999848
397.000000 425.000000 39.999772
425.000000 394.000000 -0.000166
395.000000 469.000000 0.000180
203.000000 347.000000 130.000090
175.000000 356.000000 159.999756
337.000000 482.000000 79.999700
403.000000 290.000000 100.000395
384.000000 441.000000 59.999825
103.000000 268.000000 139.999921
88.000000 158.000000 110.000417
420.000000 264.000000 49.999543
394.000000 309.000000 59.999763
403.000000 385.000000 49.999907
398.000000 274.000000 109.999683
398.000000 396.000000 30.000477
188.000000 376.000000 149.999695
251.000000 467.000000 129.999727
410.000000 173.000000 -0.000375
419.000000 388.000000 30.000459
53.000000 178.000000 70.000064
386.000000 456.000000 29.999720
230.000000 432.000000 139.999657
209.000000 102.000000 119.999952
399.000000 261.000000 100.000481
34.000000 263.000000 9.999982
387.000000 185.000000 100.000227
166.000000 200.000000 160.000091
397.000000 459.000000 10.000459
112.000000 355.000000 119.999623
151.000000 416.000000 119.999934
387.000000 396.000000 70.000126
414.000000 205.000000 59.999887
84.000000 431.000000 49.999623
54.000000 333.000000 40.000151
226.000000 489.000000 120.000098
210.000000 331.000000 139.999959
62.000000 355.000000 59.999599
128.000000 201.000000 149.999744
399.000000 310.000000 40.000499
285.000000 137.000000 129.999978
271.000000 90.000000 79.999948
392.000000 406.000000 39.999814
126.000000 71.000000 19.999775
395.000000 316.000000 69.999631
196.000000 340.000000 140.000123
172.000000 101.000000 119.999703
386.000000 386.000000 20.000299
412.000000 373.000000 20.000375
368.000000 337.000000 119.999973
192.000000 56.000000 29.999926
326.000000 425.000000 129.999868
328.000000 124.000000 100.000456
419.000000 252.000000 60.000317
101.000000 187.000000 130.000292
282.000000 510.000000 40.000476
48.000000 169.000000 19.999612
368.000000 263.000000 130.000181
106.000000 86.000000 40.000336
137.000000 485.000000 60.000020
337.000000 498.000000 10.000284
179.000000 390.000000 149.999695
57.000000 165.000000 60.000363
370.000000 319.000000 119.999686
159.000000 305.000000 159.999920
380.000000 410.000000 69.999540
66.000000 161.000000 80.000411
211.000000 325.000000 120.000116
207.000000 322.000000 110.000247
136.000000 139.000000 139.999844
425.000000 364.000000 0.000175
46.000000 181.000000 50.000130
407.000000 374.000000 39.999586
410.000000 170.000000 9.999842
416.000000 288.000000 40.000290
301.000000 198.000000 149.999552
368.000000 431.000000 79.999967
95.000000 115.000000 89.999527
190.000000 504.000000 40.000392
431.000000 381.000000 39.999951
389.000000 385.000000 60.000331
111.000000 236.000000 139.999941
305.000000 86.000000 49.999887
174.000000 344.000000 150.000400
406.000000 290.000000 79.999632
411.000000 176.000000 30.000029
403.000000 401.000000 0.000395
186.000000 371.000000 149.999597
396.000000 378.000000 19.999972
407.000000 393.000000 50.000248
314.000000 84.000000 30.000111
82.000000 442.000000 40.000237
190.000000 63.000000 59.999546
418.000000 280.000000 50.000063
107.000000 109.000000 99.999534
429.000000 377.000000 20.000148
241.000000 399.000000 149.999519
231.000000 480.000000 119.999633
293.000000 494.000000 110.000320
386.000000 395.000000 50.000398
189.000000 304.000000 150.000129
359.000000 426.000000 100.000239
404.000000 445.000000 20.000042
390.000000 362.000000 60.000269
255.000000 393.000000 149.999647
266.000000 511.000000 60.000270
445.000000 377.000000 19.999922
238.000000 512.000000 80.000183
263.000000 74.000000 60.000051
345.000000 327.000000 130.000341
297.000000 510.000000 69.999558
204.000000 336.000000 110.000464
93.000000 273.000000 130.000439
156.000000 143.000000 149.999849
214.000000 414.000000 150.000013
208.000000 475.000000 130.000315
174.000000 350.000000 149.999545
406.000000 179.000000 59.999608
397.000000 418.000000 39.999645
197.000000 340.000000 109.999887
305.000000 95.000000 70.000078
223.000000 451.000000 130.000063
67.000000 291.000000 99.999993
374.000000 461.000000 59.999831
395.000000 317.000000 89.999780
140.000000 482.000000 100.000201
364.000000 361.000000 129.999692
396.000000 462.000000 0.000002
403.000000 421.000000 10.000436
373.000000 174.000000 109.999736
393.000000 458.000000 19.999949
379.000000 456.000000 39.999971
396.000000 240.000000 100.000184
71.000000 118.000000 20.000391
364.000000 427.000000 90.000438
390.000000 440.000000 49.999887
44.000000 183.000000 0.000039
75.000000 348.000000 90.000315
405.000000 315.000000 0.000238
320.000000 96.000000 60.000082
85.000000 447.000000 50.000024
391.000000 313.000000 40.000474
303.000000 506.000000 29.999976
346.000000 147.000000 110.000432
203.000000 323.000000 120.000169
185.000000 502.000000 90.000110
135.000000 94.000000 100.000385
385.000000 326.000000 99.999934
388.000000 474.000000 39.999867
43.000000 221.000000 70.000067
415.000000 267.000000 79.999572
401.000000 300.000000 80.000252
54.000000 190.000000 79.999547
388.000000 414.000000 49.999501
400.000000 435.000000 29.999929
179.000000 325.000000 149.999681
390.000000 475.000000 20.000480
210.000000 329.000000 110.000432
124.000000 264.000000 149.999656
380.000000 357.000000 110.000447
35.000000 221.000000 0.000130
422.000000 256.000000 -0.000478
297.000000 502.000000 100.000074
387.000000 404.000000 40.000484
121.000000 142.000000 129.999588
363.000000 488.000000 49.999644
81.000000 441.000000 -0.000224
310.000000 125.000000 110.000381
202.000000 330.000000 129.999580
154.000000 79.000000 90.000488
349.000000 281.000000 139.999939
266.000000 452.000000 139.999876
419.000000 273.000000 60.000253
60.000000 291.000000 90.000373
53.000000 160.000000 30.000462
401.000000 327.000000 29.999868
388.000000 333.000000 90.000054
409.000000 393.000000 39.999876
329.000000 501.000000 19.999774
66.000000 203.000000 99.999570
84.000000 101.000000 0.000252
378.000000 372.000000 110.000496
177.000000 378.000000 160.000055
378.000000 208.000000 120.000080
39.000000 260.000000 49.999598
113.000000 439.000000 90.000322
386.000000 404.000000 50.000352
88.000000 335.000000 110.000457
408.000000 239.000000 80.000309
385.000000 339.000000 79.999563
65.000000 359.000000 -0.000186
388.000000 339.000000 70.000118
194.000000 479.000000 130.000054
205.000000 359.000000 150.000249
308.000000 366.000000 149.999771
411.000000 305.000000 9.999644
336.000000 473.000000 90.000141
107.000000 380.000000 100.000196
413.000000 210.000000 69.999762
417.000000 191.000000 9.999593
422.000000 243.000000 30.000485
290.000000 76.000000 39.999602
387.000000 321.000000 99.999700
107.000000 439.000000 79.999777
240.000000 254.000000 160.000437
422.000000 265.000000 9.999794
49.000000 243.000000 79.999624
396.000000 392.000000 29.999964
69.000000 389.000000 9.999977
393.000000 327.000000 79.999595
383.000000 337.000000 90.000313
124.000000 155.000000 139.999884
390.000000 328.000000 89.999610
388.000000 310.000000 109.999974
401.000000 437.000000 20.000420
181.000000 305.000000 149.999817
122.000000 121.000000 119.999998
81.000000 441.000000 20.000065
107.000000 303.000000 129.999801
51.000000 295.000000 60.000192
97.000000 458.000000 70.000150
112.000000 293.000000 140.000309
392.000000 147.000000 29.999844
395.000000 458.000000 -0.000345
396.000000 471.000000 20.000089
205.000000 445.000000 139.999722
392.000000 425.000000 49.999927
407.000000 291.000000 60.000455
364.000000 329.000000 109.999573
334.000000 449.000000 110.000287
377.000000 296.000000 129.999513
202.000000 396.000000 149.999929
68.000000 386.000000 19.999990
376.000000 332.000000 89.999690
442.000000 399.000000 20.000326
388.000000 295.000000 120.000295
387.000000 341.000000 50.000408
112.000000 81.000000 49.999621
410.000000 386.000000 50.000226
59.000000 311.000000 80.000359
330.000000 499.000000 80.000308
199.000000 332.000000 110.000351
202.000000 332.000000 140.000116
38.000000 196.000000 30.000366
206.000000 407.000000 150.000108
385.000000 458.000000 39.999801
178.000000 370.000000 150.000203
74.000000 419.000000 10.000074
417.000000 405.000000 29.999702
47.000000 272.000000 69.999870
164.000000 373.000000 160.000203
408.000000 409.000000 29.999548
376.000000 335.000000 99.999615
399.000000 396.000000 19.999683
334.000000 491.000000 79.999633
379.000000 478.000000 -0.000167
303.000000 471.000000 120.000457
291.000000 478.000000 120.000436
400.000000 433.000000 0.000031
90.000000 450.000000 59.999865
319.000000 291.000000 150.000192
33.000000 256.000000 20.000497
445.000000 393.000000 10.000151
341.000000 497.000000 69.999978
390.000000 240.000000 110.000036
276.000000 69.000000 19.999504
173.000000 57.000000 40.000059
209.000000 359.000000 139.999774
387.000000 392.000000 20.000481
318.000000 503.000000 89.999523
378.000000 478.000000 39.999991
84.000000 285.000000 119.999551
337.000000 335.000000 140.000134
117.000000 372.000000 109.999629
359.000000 458.000000 79.999820
146.000000 67.000000 60.000076
377.000000 406.000000 90.000477
381.000000 316.000000 109.999684
48.000000 183.000000 60.000220
302.000000 452.000000 130.000413
138.000000 100.000000 109.999758
268.000000 511.000000 20.000319
210.000000 324.000000 109.999505
331.000000 180.000000 139.999527
354.000000 422.000000 109.999787
287.000000 509.000000 80.000157
217.000000 437.000000 139.999915
348.000000 294.000000 139.999826
145.000000 109.000000 119.999748
86.000000 413.000000 69.999800
407.000000 365.000000 39.999844
393.000000 458.000000 29.999694
180.000000 409.000000 139.999597
79.000000 429.000000 0.000369
385.000000 468.000000 50.000300
167.000000 68.000000 70.000425
424.000000 392.000000 40.000496
334.000000 328.000000 139.999843
88.000000 115.000000 79.999614
185.000000 284.000000 160.000326
178.000000 122.000000 140.000324
96.000000 434.000000 69.999906
138.000000 390.000000 119.999927
379.000000 449.000000 60.000479
383.000000 360.000000 100.000229
394.000000 447.000000 40.000372
429.000000 374.000000 0.000267
250.000000 447.000000 140.000291
374.000000 395.000000 99.999977
421.000000 400.000000 29.999804
173.000000 498.000000 100.000223
112.000000 80.000000 29.999608
397.000000 307.000000 69.999990
94.000000 95.000000 30.000227
365.000000 214.000000 130.000457
69.000000 124.000000 -0.000140
214.000000 342.000000 129.999922
378.000000 324.000000 50.000407
170.000000 92.000000 110.000496
396.000000 206.000000 99.999936
385.000000 359.000000 89.999911
262.000000 483.000000 120.000212
73.000000 418.000000 0.000094
263.000000 117.000000 120.000412
392.000000 469.000000 40.000013
203.000000 340.000000 120.000411
206.000000 141.000000 149.999614
65.000000 250.000000 100.000372
408.000000 263.000000 89.999711
356.000000 326.000000 120.000249
390.000000 318.000000 90.000241
357.000000 369.000000 129.999641
200.000000 332.000000 149.999692
356.000000 314.000000 130.000478
206.000000 335.000000 150.000105
388.000000 349.000000 79.999724
422.000000 361.000000 29.999572
336.000000 384.000000 139.999898
371.000000 477.000000 49.999938
383.000000 332.000000 70.000333
358.000000 117.000000 49.999606
228.000000 511.000000 109.999685
391.000000 449.000000 50.000425
210.000000 331.000000 130.000294
414.000000 332.000000 10.000205
79.000000 429.000000 20.000389
425.000000 348.000000 19.999522
188.000000 500.000000 120.000132
414.000000 395.000000 19.999694
333.000000 502.000000 0.000474
163.000000 74.000000 80.000256
414.000000 352.000000 0.000273
396.000000 471.000000 29.999511
161.000000 113.000000 130.000121
38.000000 271.000000 0.000064
406.000000 390.000000 29.999509
255.000000 136.000000 140.000180
143.000000 362.000000 130.000256
205.000000 348.000000 149.999703
370.000000 484.000000 39.999679
361.000000 394.000000 119.999961
236.000000 511.000000 69.999764
161.000000 344.000000 150.000324
271.000000 99.000000 100.000087
347.000000 129.000000 90.000352
383.000000 473.000000 20.000348
418.000000 261.000000 69.999636
342.000000 477.000000 80.000249
240.000000 212.000000 159.999945
93.000000 387.000000 89.999525
214.000000 335.000000 130.000266
434.000000 365.000000 19.999711
377.000000 248.000000 120.000476
84.000000 227.000000 120.000431
391.000000 462.000000 39.999559
390.000000 473.000000 -0.000072
442.000000 378.000000 29.999932
357.000000 126.000000 69.999812
64.000000 143.000000 49.999661
339.000000 310.000000 139.999787
376.000000 446.000000 69.999556
421.000000 272.000000 29.999579
383.000000 398.000000 79.999947
377.000000 339.000000 90.000050
357.000000 461.000000 70.000494
381.000000 346.000000 99.999989
198.000000 335.000000 129.999550
383.000000 383.000000 89.999876
392.000000 395.000000 50.000489
385.000000 318.000000 50.000068
196.000000 506.000000 109.999506
183.000000 138.000000 150.000295
434.000000 396.000000 0.000059
38.000000 219.000000 50.000182
390.000000 284.000000 120.000395
365.000000 347.000000 129.999830
74.000000 118.000000 30.000426
207.000000 122.000000 140.000380
113.000000 116.000000 109.999784
416.000000 292.000000 30.000362
414.000000 279.000000 80.000030
441.000000 386.000000 0.000095
144.000000 337.000000 139.999525
386.000000 148.000000 60.000351
93.000000 409.000000 79.999575
170.000000 409.000000 129.999719
104.000000 348.000000 119.999514
377.000000 416.000000 80.000066
392.000000 410.000000 40.000224
322.000000 258.000000 150.000354
387.000000 142.000000 39.999842
378.000000 327.000000 109.999670
403.000000 268.000000 99.999822
219.000000 183.000000 160.000476
196.000000 361.000000 150.000187
436.000000 397.000000 30.000102
187.000000 334.000000 150.000416
361.000000 476.000000 60.000302
265.000000 462.000000 129.999811
357.000000 334.000000 129.999518
397.000000 317.000000 80.000196
201.000000 110.000000 129.999544
170.000000 292.000000 159.999874
376.000000 342.000000 110.000096
288.000000 382.000000 150.000470
385.000000 328.000000 40.000208
380.000000 263.000000 120.000184
279.000000 96.000000 90.000454
298.000000 508.000000 10.000017
391.000000 274.000000 119.999504
80.000000 121.000000 70.000114
414.000000 240.000000 70.000303
72.000000 385.000000 50.000489
312.000000 443.000000 129.999958
381.000000 307.000000 119.999893
147.000000 60.000000 29.999771
233.000000 512.000000 49.999755
129.000000 479.000000 69.999985
383.000000 474.000000 -0.000300
119.000000 474.000000 50.000440
162.000000 87.000000 99.999822
388.000000 320.000000 60.000475
208.000000 92.000000 110.000454
402.000000 441.000000 -0.000434
247.000000 61.000000 30.000254
60.000000 177.000000 89.999508
375.000000 338.000000 100.000112
388.000000 475.000000 30.000200
169.000000 361.000000 150.000305
73.000000 138.000000 69.999613
151.000000 130.000000 140.000243
292.000000 428.000000 139.999652
43.000000 288.000000 40.000209
411.000000 196.000000 69.999886
191.000000 440.000000 139.999870
188.000000 393.000000 150.000062
379.000000 331.000000 100.000426
421.000000 211.000000 10.000373
151.000000 489.000000 110.000018
214.000000 501.000000 120.000350
186.000000 475.000000 130.000205
119.000000 171.000000 139.999644
166.000000 495.000000 49.999638
94.000000 139.000000 110.000263
361.000000 113.000000 30.000475
287.000000 462.000000 129.999600
119.000000 472.000000 0.000324
336.000000 499.000000 59.999701
397.000000 309.000000 79.999503
396.000000 468.000000 9.999539
418.000000 219.000000 50.000021
188.000000 53.000000 9.999892
317.000000 484.000000 99.999771
87.000000 99.000000 9.999789
440.000000 400.000000 10.000026
77.000000 414.000000 50.000086
59.000000 334.000000 69.999692
389.000000 473.000000 10.000131
93.000000 364.000000 99.999586
191.000000 380.000000 140.000324
397.000000 463.000000 20.000440
314.000000 83.000000 -0.000144
404.000000 252.000000 89.999526
192.000000 55.000000 0.000057
37.000000 211.000000 39.999811
408.000000 337.000000 0.000463
386.000000 321.000000 50.000145
57.000000 307.000000 69.999726
399.000000 434.000000 9.999597
440.000000 394.000000 0.000167
194.000000 347.000000 139.999819
187.000000 359.000000 160.000408
82.000000 430.000000 30.000265
292.000000 510.000000 90.000293
179.000000 291.000000 160.000422
346.000000 484.000000 69.999785
433.000000 395.000000 19.999927
238.000000 463.000000 129.999988
431.000000 404.000000 10.000165
125.000000 346.000000 130.000258
364.000000 483.000000 50.000249
152.000000 60.000000 10.000471
412.000000 390.000000 50.000296
167.000000 492.000000 119.999873
162.000000 360.000000 140.000440
76.000000 394.000000 60.000355
404.000000 389.000000 0.000108
131.000000 68.000000 10.000393
79.000000 430.000000 9.999539
414.000000 282.000000 59.999976
171.000000 344.000000 160.000494
140.000000 307.000000 150.000051
371.000000 276.000000 130.000475
410.000000 320.000000 9.999772
399.000000 300.000000 60.000152
410.000000 275.000000 90.000213
178.000000 501.000000 69.999844
396.000000 463.000000 29.999717
270.000000 511.000000 0.000287
105.000000 365.000000 110.000111
36.000000 263.000000 29.999728
42.000000 269.000000 60.000204
152.000000 382.000000 129.999554
139.000000 124.000000 129.999830
178.000000 499.000000 9.999512
380.000000 329.000000 60.000364
195.000000 398.000000 149.999704
105.000000 138.000000 120.000289
130.000000 480.000000 19.999848
241.000000 504.000000 110.000227
249.000000 61.000000 0.000215
149.000000 63.000000 50.000394
435.000000 381.000000 19.999612
370.000000 120.000000 19.999582
395.000000 363.000000 50.000173
390.000000 455.000000 0.000083
345.000000 465.000000 89.999529
321.000000 451.000000 120.000069
232.000000 72.000000 69.999566
78.000000 441.000000 10.000433
411.000000 254.000000 79.999644
349.000000 104.000000 9.999972
40.000000 224.000000 59.999868
401.000000 417.000000 30.000379
55.000000 328.000000 60.000186
136.000000 66.000000 39.999869
387.000000 459.000000 19.999694
238.000000 120.000000 129.999648
380.000000 232.000000 119.999852
387.000000 336.000000 59.999680
386.000000 316.000000 100.000192
202.000000 323.000000 110.000169
421.000000 243.000000 39.999865
378.000000 477.000000 19.999946
403.000000 407.000000 0.000441
117.000000 473.000000 10.000461
388.000000 454.000000 40.000397
36.000000 209.000000 9.999788
344.000000 158.000000 120.000283
167.000000 319.000000 160.000206
80.000000 432.000000 39.999684
124.000000 318.000000 139.999804
379.000000 285.000000 130.000148
420.000000 205.000000 29.999982
364.000000 457.000000 60.000173
314.000000 319.000000 150.000372
271.000000 387.000000 149.999929
405.000000 324.000000 -0.000038
393.000000 305.000000 49.999780
380.000000 472.000000 50.000100
392.000000 455.000000 10.000360
430.000000 366.000000 30.000433
88.000000 433.000000 60.000203
400.000000 426.000000 20.000350
198.000000 506.000000 19.999553
369.000000 321.000000 109.999993
389.000000 376.000000 70.000300
447.000000 391.000000 19.999590
78.000000 255.000000 120.000420
201.000000 310.000000 150.000380
385.000000 330.000000 99.999671
313.000000 506.000000 50.000090
398.000000 286.000000 110.000315
366.000000 325.000000 119.999806
431.000000 389.000000 39.999680
71.000000 122.000000 9.999706
416.000000 393.000000 -0.000388
339.000000 98.000000 40.000373
354.000000 120.000000 59.999789
163.000000 480.000000 119.999792
209.000000 78.000000 90.000471
340.000000 454.000000 100.000347
344.000000 120.000000 79.999566
34.000000 221.000000 20.000076
130.000000 440.000000 100.000378
367.000000 328.000000 100.000402
372.000000 485.000000 29.999664
35.000000 247.000000 -0.000266
230.000000 454.000000 130.000398
155.000000 314.000000 150.000438
386.000000 168.000000 89.999942
423.000000 398.000000 20.000409
252.000000 68.000000 49.999609
405.000000 314.000000 30.000086
78.000000 140.000000 90.000406
373.000000 453.000000 60.000142
159.000000 328.000000 150.000142
74.000000 417.000000 30.000409
330.000000 91.000000 20.000081
388.000000 332.000000 80.000109
385.000000 328.000000 60.000013
174.000000 447.000000 130.000073
316.000000 226.000000 149.999931
393.000000 453.000000 30.000415
361.000000 321.000000 119.999624
376.000000 465.000000 60.000467
366.000000 448.000000 79.999941
58.000000 346.000000 50.000010
391.000000 384.000000 50.000228
162.000000 396.000000 129.999672
425.000000 378.000000 40.000076
421.000000 278.000000 -0.000240
179.000000 381.000000 150.000273
355.000000 483.000000 60.000125
82.000000 442.000000 29.999998
83.000000 108.000000 50.000310
407.000000 175.000000 49.999596
74.000000 418.000000 19.999690
132.000000 415.000000 109.999606
327.000000 489.000000 90.000109
408.000000 211.000000 79.999683
416.000000 201.000000 50.000427
69.000000 380.000000 40.000280
235.000000 151.000000 150.000472
369.000000 307.000000 130.000229
396.000000 164.000000 70.000265
308.000000 338.000000 149.999970
175.000000 330.000000 159.999778
150.000000 349.000000 139.999937
421.000000 219.000000 -0.000068
444.000000 384.000000 9.999661
407.000000 335.000000 29.999975
123.000000 480.000000 90.000020
388.000000 207.000000 110.000124
190.000000 372.000000 140.000446
127.000000 482.000000 30.000090
276.000000 476.000000 120.000370
413.000000 289.000000 49.999591
240.000000 510.000000 30.000054
410.000000 316.000000 20.000107
354.000000 109.000000 -0.000420
56.000000 226.000000 90.000305
55.000000 346.000000 20.000297
373.000000 329.000000 109.999831
421.000000 269.000000 20.000125
417.000000 194.000000 -0.000244
377.000000 477.000000 10.000096
311.000000 136.000000 120.000023
355.000000 326.000000 130.000433
84.000000 110.000000 60.000454
202.000000 506.000000 80.000296
398.000000 392.000000 0.000118
261.000000 501.000000 110.000266
386.000000 140.000000 10.000112
75.000000 210.000000 110.000483
418.000000 392.000000 39.999772
47.000000 172.000000 39.999530
201.000000 61.000000 50.000348
174.000000 426.000000 129.999769
406.000000 287.000000 89.999588
406.000000 294.000000 50.000482
178.000000 464.000000 129.999690
379.000000 481.000000 0.000359
66.000000 135.000000 40.000472
439.000000 380.000000 -0.000057
410.000000 300.000000 0.000483
400.000000 198.000000 90.000463
396.000000 305.000000 99.999628
112.000000 327.000000 129.999537
400.000000 351.000000 39.999731
285.000000 445.000000 140.000481
194.000000 345.000000 120.000109
395.000000 373.000000 49.999714
417.000000 277.000000 69.999982
220.000000 511.000000 100.000036
368.000000 181.000000 119.999800
330.000000 162.000000 130.000194
355.000000 188.000000 130.000376
158.000000 58.000000 20.000298
402.000000 419.000000 0.000043
389.000000 147.000000 50.000103
77.000000 161.000000 99.999915
99.000000 98.000000 69.999881
383.000000 472.000000 10.000356
123.000000 366.000000 120.000131
109.000000 78.000000 -0.000493
441.000000 394.000000 29.999848
118.000000 405.000000 100.000021
148.000000 454.000000 109.999506
416.000000 405.000000 10.000422
214.000000 331.000000 120.000073
377.000000 481.000000 9.999558
381.000000 413.000000 59.999620
400.000000 448.000000 30.000243
185.000000 358.000000 149.999663
194.000000 362.000000 139.999629
184.000000 183.000000 160.000453
391.000000 348.000000 50.000085
378.000000 477.000000 30.000336
314.000000 349.000000 150.000272
159.000000 302.000000 150.000093
70.000000 396.000000 29.999689
186.000000 428.000000 140.000092
384.000000 460.000000 50.000420
240.000000 438.000000 139.999721
384.000000 426.000000 59.999785
396.000000 389.000000 50.000117
210.000000 348.000000 139.999537
46.000000 171.000000 9.999837
173.000000 498.000000 30.000387

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,384 @@
383
27.850301 -17.970299 134.875148
-30.421501 -21.008499 144.254249
0.114400 -1.784400 50.132200
-18.264400 12.484400 101.627799
17.396600 -1.906600 99.023301
21.063600 -19.043600 132.826796
29.463299 -5.123300 142.671651
28.427000 -18.197000 149.973500
20.364199 6.405800 114.632099
14.811500 -9.141500 105.235749
19.542701 -11.952700 123.446353
-15.004000 -8.116000 98.497997
-10.693900 -4.016100 58.998050
-24.134400 11.784400 107.332801
-23.475999 8.946000 104.191998
-4.457700 9.027700 56.901148
16.912700 15.277300 98.476347
12.924100 12.075900 77.677051
-21.715099 6.515100 96.397452
10.053100 -2.053100 61.576548
8.974900 -5.644900 68.852447
8.249500 -14.839500 101.639749
29.422501 -20.732500 142.186247
27.104600 -21.824600 149.962300
31.013999 -2.164000 149.977000
27.157400 -17.317400 149.988700
30.981799 -14.521800 149.960900
31.027899 -19.127900 149.983950
20.507200 17.852800 112.518598
21.309300 -12.729300 134.384644
19.385099 -11.085100 123.957550
22.975500 -13.585500 143.232755
14.246800 -7.776800 92.238399
15.299200 -12.349200 106.839596
-20.686101 6.686100 104.721952
10.410300 -14.950300 109.945149
-0.572800 -12.837200 104.743602
9.430900 -11.520900 105.765453
22.088301 -9.988300 120.869147
18.696699 -9.706700 114.113353
20.051600 -15.941601 125.510798
17.014300 -12.824300 114.637149
25.541301 -12.251300 134.885648
22.033800 -2.333800 121.891898
-18.289400 -7.380600 96.930299
-21.954500 4.094500 101.622749
-19.513600 4.613600 100.078202
-20.256000 10.436000 98.992001
-13.608300 -11.011700 97.960850
-2.165500 -7.894500 80.802246
-2.200600 2.110600 56.369702
14.424000 10.726000 88.107003
-17.650600 6.960600 97.964700
-16.106900 1.746900 89.671550
3.865300 -3.635300 75.612649
3.290200 -2.310200 69.370102
-16.555599 8.445600 91.712202
-7.549400 1.549400 62.095299
7.074300 -4.804300 73.542148
10.674700 -9.114700 102.117354
6.940000 -9.100000 95.914998
-20.917200 -9.272800 92.751403
-4.043800 -2.546200 51.163101
-15.706300 -13.303700 92.791853
-22.591499 15.911500 100.584248
-15.927600 14.587600 91.711202
3.550800 8.709200 54.815400
-19.986700 12.906700 96.921649
-11.174600 7.344600 64.152697
5.729900 -1.889900 53.249949
7.298300 1.991700 57.419149
17.288300 -16.248301 111.504147
11.139900 -5.079900 66.779953
9.299900 -4.059900 60.559951
23.049200 11.560800 111.494597
24.139500 4.980500 116.704751
29.687400 -21.817400 149.958700
22.317100 -19.487100 141.113554
23.782200 -13.892200 146.856105
28.643601 -7.063600 145.816796
-19.830300 13.350300 103.164847
19.028700 14.271300 109.414352
28.074900 -4.714900 140.597449
22.833101 4.646900 119.306550
22.090100 5.439900 116.685051
22.567500 9.082500 114.078753
20.163701 14.096300 113.586848
20.742100 -11.562100 131.231049
21.981901 -17.111900 134.370944
25.385999 -12.786000 140.117995
24.287300 -11.777300 136.968650
27.245601 -13.955600 143.737795
27.890600 -16.050599 147.355294
21.251200 -8.951200 115.150604
12.877700 -11.097700 103.713851
-18.707900 5.677900 101.101053
12.688800 -9.448800 105.264399
-11.035400 -9.444600 102.652300
-14.368000 -10.892000 101.091003
-1.861500 -14.028500 102.634250
-13.923300 -12.566700 98.998351
12.485200 -11.985200 105.252599
11.048700 -13.378700 106.834346
15.585200 -10.855200 108.912598
16.027501 -12.237500 112.513748
14.253200 -14.333200 110.456603
16.070500 -14.640500 114.080253
17.983100 -12.533100 114.631549
6.535600 -13.215600 105.777803
21.772400 1.057600 117.201198
22.093599 -4.353600 119.821796
12.941200 -11.261200 110.465603
8.894700 -11.624700 107.357351
19.696600 0.693400 108.898298
21.726600 6.443400 112.543298
18.646500 -13.406500 116.678251
21.180000 -14.900000 129.675001
24.322701 -5.942700 126.056352
20.577200 -13.737200 125.553598
23.806999 -11.367000 134.358494
21.780000 -11.330000 131.770003
23.553400 -3.403400 121.911698
-18.976199 -4.463800 99.036901
-18.976499 -2.053500 99.036751
-20.277900 -7.612100 97.431053
-20.563300 -1.986700 97.458353
-21.594099 7.434100 103.177947
-20.604900 6.144900 101.112553
-19.292400 9.542400 100.588798
-22.819500 11.419500 103.675251
-21.773300 11.133300 102.113354
-16.047000 -8.803000 98.486497
-17.838200 -12.431800 97.955900
-18.931901 -9.888100 98.489047
-2.144400 1.054400 53.792799
-4.323100 1.703100 55.838451
1.430600 -2.270600 61.570298
-2.026100 -1.613900 55.831951
2.131900 -1.761900 54.815950
-0.320800 -1.229200 52.214602
6.954800 -1.014800 57.937399
4.719600 1.400400 55.329801
-6.380700 2.000700 58.964650
1.736200 -5.286200 72.513097
5.514400 -4.744400 71.962200
3.504500 -4.074500 74.042252
-0.940300 5.240300 57.939849
0.447400 8.312600 61.558698
7.754600 1.155400 61.057302
7.038400 3.821600 60.524201
-18.130300 12.180300 96.929849
0.591600 -4.271600 79.750803
-16.671001 -7.499000 95.374502
-17.649101 -4.930900 92.780453
-14.640000 -9.350000 96.914999
-9.162100 -7.997900 88.098953
-15.918000 -6.132000 86.515998
-19.701600 12.661600 100.069202
-20.835200 13.045200 96.912399
-18.631699 13.451700 92.279149
-18.708099 7.788100 96.405952
-7.977300 3.337300 60.541351
-10.023200 0.453200 62.598399
-7.388900 -3.921100 68.870547
-3.846100 -3.533900 69.391952
0.788000 -3.358000 76.674000
-2.012200 -3.767800 75.083903
-7.760200 6.150200 62.099899
-9.870600 7.370600 66.764703
-11.900100 5.990100 72.514947
3.315700 -5.645700 77.702851
-0.920200 -10.459800 101.614899
-1.343500 -7.016500 82.893248
6.011700 -11.191700 100.565848
7.105100 -12.185100 103.692551
-10.273400 -10.216600 99.028301
-11.712200 -9.327800 96.408902
-8.960200 -11.809800 97.454903
3.113900 -12.953900 100.591948
3.243300 -10.013300 101.081653
-20.770601 -11.609400 92.244699
-19.028101 -12.051900 90.675951
-20.208101 13.128100 90.710951
-9.834500 10.214500 64.157747
4.486300 2.443700 51.688151
9.673400 0.846600 60.536701
9.712600 8.327400 65.196298
13.512100 -4.832100 74.061052
12.061000 -4.051000 66.245499
22.982500 17.437500 112.026251
23.673800 14.956200 114.606899
20.499800 9.810200 108.359902
21.161500 11.518500 111.515747
22.374501 15.865500 108.362252
24.998800 -17.598800 145.279407
26.518900 -9.998900 142.679451
27.565800 -12.355800 145.307907
24.669799 -12.679800 143.214905
23.095200 -1.885200 121.892598
24.370300 1.799700 121.900148
21.694800 8.405200 114.607399
24.475301 -14.645300 142.167647
23.101000 -12.941000 136.965500
23.011600 -11.721600 136.445796
11.249500 -10.039500 102.144754
11.478300 -9.638300 105.789153
-12.076300 -11.093700 102.666850
-10.158400 -11.291600 100.555798
-14.430500 -13.689500 100.589748
-11.942100 -12.587900 101.628949
4.210800 -13.780800 102.150404
11.627100 -10.087100 103.713551
13.965000 -12.725000 108.367502
13.494400 -10.934400 107.342201
11.087800 -11.727800 107.343901
17.523701 -10.653700 114.596849
15.976999 -14.507000 112.003501
22.654100 0.555900 117.237048
21.217500 1.302500 117.223748
10.458900 -12.888900 110.959450
20.789201 -3.569200 115.119604
12.419000 -14.169000 106.289500
26.735001 -12.275000 134.897498
23.753101 -11.153100 131.261549
25.044499 -9.814500 134.397244
-15.024300 -9.735700 103.167847
-18.943901 -9.896100 101.638049
-19.183900 -0.826100 97.473053
-21.081500 4.011500 100.074252
-21.030300 -7.229700 97.474853
-20.216900 -5.253100 99.011551
-20.370299 9.710300 100.569848
-18.827300 4.747300 101.606349
-17.820599 -13.119400 96.429702
-19.615700 -11.634300 96.937149
-17.897401 -11.592600 99.541298
-4.505300 -1.134700 55.352351
-3.076800 -0.133200 54.281600
-1.984000 -0.956000 53.782999
-1.971800 5.601800 55.859101
4.345700 1.744300 56.382852
4.337700 0.212300 53.788849
-5.845100 -0.054900 57.392449
-2.207900 2.327900 56.896048
-4.803200 5.673200 58.448400
-3.315500 7.895500 58.437250
-4.058200 3.998200 57.390899
-2.918700 2.268700 55.330651
1.922000 -4.172000 72.991001
8.036200 6.673800 64.173097
9.331000 0.699000 62.070499
15.177400 9.722600 87.078702
-15.047600 -11.302400 96.401202
-18.230100 -10.259900 96.959949
-19.210901 -7.459100 95.914548
-20.057501 -6.162500 95.906248
-14.785000 9.135000 81.832497
-6.880700 -4.639300 67.304650
0.504400 -5.664400 76.667200
-9.644500 3.944500 63.637750
-5.252100 8.492100 60.543951
-8.323400 7.803400 64.193297
-7.812700 5.902700 64.168647
12.889700 -9.189700 101.594849
-8.747400 -8.232600 93.291300
-8.437700 -9.452300 99.006151
4.299700 -11.999700 101.089853
-13.059600 -9.500400 97.980200
-4.751400 -11.228600 101.629299
-5.702600 -11.687400 100.078702
-0.019300 -11.130700 99.550348
-1.125500 -12.214500 101.077253
1.704500 -9.164500 92.257249
-8.743600 -12.276400 95.388202
-6.535000 -12.745000 98.482497
-0.395100 -12.694900 102.657450
8.012100 -6.662100 76.156054
5.773300 -7.943300 83.946649
-13.410600 -8.179400 97.974700
2.629100 -10.759100 104.719552
17.136201 12.023800 100.573098
18.969300 1.950700 106.829646
18.233000 12.227000 105.786503
19.635699 9.214300 108.397852
-19.567501 14.097500 89.146254
-10.928400 9.608400 64.670801
4.128600 -1.358600 51.189301
23.612199 17.337800 114.111103
22.350301 12.439700 113.035152
20.050601 16.059400 108.890298
25.622900 -14.602900 141.656443
13.433900 -12.663900 105.271949
14.446700 -13.526700 106.293350
-12.458200 -10.991800 104.215898
-7.977000 -12.133000 102.136504
-10.337200 -11.122800 98.996401
8.685300 -12.285300 103.677651
11.915700 -12.805700 110.432853
15.323500 -12.373500 108.876748
21.036700 2.813300 115.143354
20.474001 -10.874000 126.566998
-15.678100 -9.831900 101.605949
-18.537900 -9.082100 100.051052
-19.415301 0.275300 95.892348
-20.074500 -1.855500 98.997751
-20.657700 -11.132300 96.921149
-16.127301 -11.362700 102.676350
-4.404800 -1.805200 55.352601
3.603800 0.256200 52.236902
-1.456500 2.376500 55.346751
-6.989300 -0.650700 59.515350
-3.508500 6.938500 57.420749
13.405600 2.894400 79.752803
5.013300 -5.403300 77.176647
-16.463399 -12.186600 95.398302
-17.237900 -8.492100 96.956049
-15.187700 -11.322300 99.526148
-19.380301 -9.519700 94.354851
-17.254100 -10.525900 93.792946
-10.367600 -8.342400 93.286200
-18.943799 -7.526200 94.333101
-18.886901 -5.823100 95.911548
-18.345499 13.475500 90.702251
0.806700 -5.676700 77.718351
1.046900 -4.706900 77.708451
-9.061500 5.131500 65.209248
-11.407800 7.057800 72.511097
-4.013600 -10.796400 100.058202
3.416100 -12.676100 104.238048
2.260000 -12.440000 102.655000
7.753900 -12.673900 102.156954
9.956900 -9.976900 102.113454
7.505000 -11.235000 104.212498
5.119000 -10.599000 102.669500
-3.021400 -11.178600 103.199297
-8.721000 -11.079000 99.034501
-5.856500 -11.553500 98.481747
3.042600 -10.732600 99.536298
1.399600 -11.809600 101.119803
-8.425600 8.965600 60.527201
2.854500 -0.104500 50.117250
20.102601 14.287400 110.996300
20.071300 15.338700 106.825646
25.300099 -13.550100 140.075045
-14.544200 -10.735800 102.672900
8.899800 -11.309800 103.694901
8.373500 -13.593500 103.701751
14.957000 -13.707000 108.393502
-14.790800 -10.369200 100.579598
-19.526100 -0.693900 99.016951
-19.891100 1.501100 99.004451
-20.159900 -11.180100 95.360052
-19.838100 -11.101900 93.795946
3.044600 0.755400 51.682301
3.687800 1.442200 52.738898
-6.885100 -3.294900 61.557448
-6.215400 1.495400 59.492300
-17.352500 -7.377500 94.313751
-16.239999 -6.860000 91.224998
-20.576800 0.046800 95.891598
-18.031599 5.911600 96.409202
-16.499700 13.289700 90.685151
-9.316800 8.566800 63.131600
-6.187100 -10.722900 98.486447
3.329400 -10.959400 102.659700
-9.227300 -10.502700 100.586348
-5.203100 -11.776900 96.948449
2.934500 -1.344500 50.157250
21.912201 13.157800 111.506097
-17.928601 0.158600 95.890698
-17.785900 3.815900 96.932049
-20.299200 3.889200 98.485397
4.120400 0.749600 54.270200
-17.981600 -6.818400 94.324201
-19.942101 -5.897900 94.318951
-18.396400 7.436400 94.846797
-9.592500 7.612500 63.663750
21.840700 14.839300 110.435353
-20.119800 2.629800 96.935099
21.831000 16.478999 112.030501
20.249299 14.330700 108.894648
21.416699 14.473300 113.053352
21.707799 13.162200 109.433902

View File

@ -0,0 +1,500 @@
500
231.000000 182.000000 0.000351
14.000000 115.000000 -15.999829
71.000000 94.000000 31.999592
68.000000 54.000000 47.999560
207.000000 119.000000 31.999602
108.000000 241.000000 -31.999965
36.000000 131.000000 -31.999798
61.000000 79.000000 -16.000061
158.000000 29.000000 47.999573
171.000000 20.000000 32.000102
80.000000 21.000000 15.999613
208.000000 209.000000 -32.000094
72.000000 154.000000 -0.000168
130.000000 195.000000 0.000267
159.000000 185.000000 0.000415
165.000000 172.000000 -15.999620
189.000000 138.000000 -16.000149
180.000000 211.000000 -48.000257
152.000000 182.000000 -32.000245
196.000000 216.000000 -0.000361
171.000000 63.000000 47.999650
8.000000 118.000000 -0.000377
167.000000 228.000000 0.000447
149.000000 64.000000 -0.000335
26.000000 166.000000 -31.999897
62.000000 132.000000 15.999507
129.000000 244.000000 -15.999563
223.000000 57.000000 15.999837
142.000000 25.000000 47.999532
119.000000 12.000000 15.999691
51.000000 213.000000 -32.000051
67.000000 59.000000 47.999558
244.000000 118.000000 16.000059
229.000000 186.000000 0.000022
151.000000 232.000000 0.000274
177.000000 166.000000 -0.000265
139.000000 71.000000 16.000400
201.000000 184.000000 16.000257
149.000000 26.000000 47.999937
144.000000 184.000000 -32.000347
212.000000 44.000000 16.000372
122.000000 243.000000 -32.000271
63.000000 226.000000 -15.999717
14.000000 92.000000 -0.000228
79.000000 191.000000 -48.000345
168.000000 174.000000 -31.999750
94.000000 239.000000 -15.999957
128.000000 196.000000 -0.000407
10.000000 151.000000 -0.000198
28.000000 63.000000 16.000490
50.000000 217.000000 -15.999698
147.000000 242.000000 -16.000115
11.000000 139.000000 -16.000482
208.000000 183.000000 16.000006
153.000000 28.000000 47.999911
63.000000 29.000000 15.999721
18.000000 173.000000 0.000064
80.000000 86.000000 31.999967
214.000000 131.000000 -31.999614
25.000000 164.000000 -32.000292
18.000000 81.000000 15.999688
174.000000 164.000000 -15.999519
112.000000 58.000000 48.000316
221.000000 196.000000 0.000020
87.000000 228.000000 0.000271
85.000000 82.000000 31.999577
136.000000 185.000000 -31.999946
139.000000 12.000000 15.999814
207.000000 136.000000 -31.999751
243.000000 127.000000 -16.000406
238.000000 83.000000 16.000043
236.000000 175.000000 0.000133
59.000000 39.000000 -0.000173
138.000000 58.000000 48.000435
63.000000 125.000000 -15.999958
148.000000 59.000000 47.999763
11.000000 116.000000 16.000295
12.000000 104.000000 16.000059
99.000000 195.000000 -47.999545
176.000000 168.000000 -32.000485
97.000000 186.000000 -0.000049
26.000000 69.000000 0.000408
67.000000 196.000000 -48.000408
197.000000 73.000000 -15.999752
180.000000 99.000000 15.999739
246.000000 145.000000 0.000341
54.000000 184.000000 15.999968
194.000000 78.000000 -15.999879
16.000000 144.000000 15.999772
100.000000 28.000000 47.999568
26.000000 108.000000 32.000427
188.000000 58.000000 48.000056
104.000000 23.000000 0.000019
186.000000 193.000000 -47.999712
242.000000 100.000000 16.000407
139.000000 12.000000 31.999602
229.000000 168.000000 -31.999564
96.000000 230.000000 -0.000241
144.000000 71.000000 31.999954
139.000000 184.000000 -16.000332
158.000000 226.000000 -48.000437
54.000000 143.000000 -31.999968
241.000000 163.000000 -0.000375
110.000000 59.000000 47.999725
88.000000 27.000000 0.000264
159.000000 25.000000 0.000204
228.000000 68.000000 0.000450
53.000000 114.000000 31.999861
76.000000 22.000000 16.000012
238.000000 172.000000 -16.000306
27.000000 174.000000 -32.000074
71.000000 64.000000 48.000089
58.000000 73.000000 -16.000054
226.000000 75.000000 31.999956
64.000000 224.000000 -32.000409
219.000000 79.000000 -16.000015
171.000000 219.000000 -48.000443
17.000000 149.000000 15.999620
85.000000 219.000000 -47.999948
139.000000 243.000000 -31.999927
64.000000 132.000000 -15.999923
133.000000 60.000000 0.000370
141.000000 13.000000 32.000016
144.000000 193.000000 0.000487
29.000000 77.000000 32.000389
186.000000 227.000000 -31.999584
51.000000 211.000000 -0.000140
100.000000 67.000000 -0.000192
153.000000 240.000000 -31.999932
184.000000 64.000000 48.000329
118.000000 233.000000 0.000081
37.000000 196.000000 -32.000450
196.000000 35.000000 32.000130
43.000000 51.000000 32.000190
97.000000 61.000000 47.999902
18.000000 174.000000 -15.999889
54.000000 112.000000 32.000389
244.000000 102.000000 -0.000141
26.000000 89.000000 31.999633
183.000000 101.000000 -0.000397
190.000000 155.000000 -32.000059
141.000000 61.000000 -0.000261
122.000000 69.000000 31.999905
159.000000 239.000000 -31.999703
180.000000 156.000000 -16.000295
122.000000 186.000000 -32.000017
159.000000 16.000000 31.999811
111.000000 62.000000 0.000081
30.000000 73.000000 32.000406
40.000000 131.000000 -32.000022
185.000000 50.000000 47.999556
46.000000 121.000000 32.000010
15.000000 91.000000 15.999817
139.000000 243.000000 -15.999875
194.000000 110.000000 -15.999682
200.000000 221.000000 -16.000194
146.000000 183.000000 -32.000064
106.000000 191.000000 0.000436
182.000000 156.000000 -0.000125
201.000000 71.000000 -16.000001
127.000000 59.000000 0.000459
141.000000 242.000000 -32.000493
171.000000 235.000000 -31.999615
61.000000 176.000000 15.999908
151.000000 14.000000 31.999740
121.000000 185.000000 -16.000410
9.000000 110.000000 -0.000308
36.000000 124.000000 31.999681
162.000000 16.000000 16.000300
80.000000 234.000000 -16.000029
15.000000 164.000000 -15.999884
208.000000 72.000000 -16.000103
67.000000 114.000000 15.999868
120.000000 60.000000 0.000358
153.000000 24.000000 -0.000315
167.000000 77.000000 0.000084
88.000000 178.000000 -0.000296
178.000000 88.000000 31.999579
75.000000 99.000000 16.000467
151.000000 241.000000 -31.999550
47.000000 183.000000 15.999840
151.000000 180.000000 -15.999625
112.000000 230.000000 -47.999580
152.000000 60.000000 47.999920
145.000000 183.000000 -15.999679
62.000000 123.000000 -16.000320
228.000000 142.000000 -32.000272
106.000000 232.000000 0.000122
89.000000 33.000000 48.000060
118.000000 231.000000 -48.000438
162.000000 239.000000 -15.999565
196.000000 220.000000 -31.999656
189.000000 117.000000 15.999870
73.000000 46.000000 48.000414
193.000000 37.000000 0.000188
187.000000 221.000000 0.000304
61.000000 140.000000 15.999972
115.000000 184.000000 -15.999817
153.000000 231.000000 -0.000374
46.000000 134.000000 -31.999890
68.000000 201.000000 -47.999923
217.000000 55.000000 -0.000048
200.000000 34.000000 16.000119
152.000000 195.000000 -48.000153
146.000000 72.000000 32.000142
105.000000 242.000000 -15.999819
158.000000 69.000000 0.000177
145.000000 72.000000 15.999652
103.000000 73.000000 32.000330
246.000000 112.000000 -0.000307
243.000000 128.000000 16.000331
46.000000 48.000000 0.000354
99.000000 15.000000 31.999993
96.000000 70.000000 0.000313
192.000000 129.000000 15.999724
171.000000 36.000000 48.000142
56.000000 41.000000 -0.000237
87.000000 236.000000 -32.000264
110.000000 242.000000 -32.000440
90.000000 26.000000 0.000233
219.000000 176.000000 16.000414
196.000000 32.000000 15.999647
225.000000 119.000000 31.999763
168.000000 81.000000 31.999513
103.000000 182.000000 -31.999641
28.000000 192.000000 -16.000020
225.000000 136.000000 -32.000475
62.000000 117.000000 -15.999916
58.000000 182.000000 16.000479
94.000000 71.000000 0.000277
210.000000 43.000000 16.000458
238.000000 86.000000 -0.000143
186.000000 28.000000 32.000422
208.000000 46.000000 32.000427
99.000000 60.000000 47.999544
85.000000 36.000000 47.999560
14.000000 140.000000 16.000064
174.000000 91.000000 16.000080
72.000000 33.000000 0.000351
230.000000 95.000000 31.999702
153.000000 15.000000 31.999736
180.000000 44.000000 48.000142
147.000000 13.000000 16.000173
168.000000 27.000000 0.000135
16.000000 168.000000 -16.000330
12.000000 98.000000 0.000077
84.000000 88.000000 15.999770
175.000000 162.000000 -15.999729
122.000000 12.000000 31.999587
194.000000 145.000000 16.000214
245.000000 104.000000 0.000096
38.000000 50.000000 16.000261
102.000000 231.000000 -0.000273
120.000000 70.000000 32.000247
103.000000 241.000000 -15.999562
24.000000 73.000000 0.000059
153.000000 241.000000 -16.000022
80.000000 29.000000 -0.000425
73.000000 223.000000 0.000246
25.000000 91.000000 -15.999716
110.000000 13.000000 31.999612
142.000000 230.000000 -47.999894
23.000000 185.000000 -16.000220
226.000000 180.000000 -31.999881
230.000000 105.000000 32.000364
80.000000 169.000000 -31.999656
219.000000 203.000000 -16.000266
69.000000 142.000000 -0.000292
33.000000 61.000000 0.000446
66.000000 119.000000 15.999737
29.000000 178.000000 -31.999839
122.000000 195.000000 0.000250
95.000000 79.000000 15.999537
53.000000 141.000000 -32.000021
228.000000 113.000000 31.999506
110.000000 196.000000 -48.000009
84.000000 167.000000 -16.000145
221.000000 123.000000 32.000377
192.000000 126.000000 -16.000016
163.000000 237.000000 -32.000336
107.000000 73.000000 15.999636
30.000000 59.000000 15.999555
143.000000 233.000000 -0.000014
76.000000 233.000000 -16.000291
140.000000 24.000000 48.000373
13.000000 122.000000 -16.000396
119.000000 243.000000 -15.999928
219.000000 52.000000 15.999516
39.000000 207.000000 -16.000205
11.000000 153.000000 0.000400
153.000000 227.000000 -47.999632
197.000000 182.000000 15.999689
96.000000 15.000000 16.000408
189.000000 27.000000 16.000370
85.000000 173.000000 -32.000317
137.000000 185.000000 -15.999535
186.000000 113.000000 0.000316
47.000000 72.000000 -16.000307
26.000000 147.000000 -31.999760
34.000000 59.000000 0.000272
184.000000 191.000000 -47.999729
135.000000 195.000000 0.000041
137.000000 22.000000 0.000252
137.000000 70.000000 16.000342
25.000000 164.000000 16.000081
241.000000 162.000000 -16.000253
25.000000 91.000000 31.999907
204.000000 44.000000 -0.000409
110.000000 184.000000 -32.000070
71.000000 191.000000 -47.999714
186.000000 141.000000 -0.000049
112.000000 22.000000 -0.000413
27.000000 187.000000 -0.000197
28.000000 139.000000 -31.999749
155.000000 76.000000 16.000041
31.000000 135.000000 -31.999815
99.000000 240.000000 -32.000440
218.000000 59.000000 32.000098
240.000000 164.000000 -16.000179
186.000000 62.000000 48.000381
193.000000 120.000000 -15.999543
87.000000 19.000000 32.000031
185.000000 148.000000 -0.000396
187.000000 139.000000 -0.000262
194.000000 177.000000 15.999986
13.000000 133.000000 15.999525
217.000000 131.000000 -32.000238
73.000000 229.000000 -31.999844
218.000000 196.000000 -31.999779
62.000000 218.000000 -0.000483
131.000000 12.000000 16.000284
68.000000 136.000000 -0.000446
14.000000 94.000000 16.000185
112.000000 197.000000 -48.000241
223.000000 198.000000 -15.999801
71.000000 161.000000 -32.000219
86.000000 18.000000 16.000351
100.000000 227.000000 -47.999777
17.000000 169.000000 -0.000308
118.000000 24.000000 47.999953
190.000000 100.000000 31.999686
72.000000 103.000000 0.000019
214.000000 124.000000 32.000046
221.000000 132.000000 -32.000248
81.000000 217.000000 -48.000242
54.000000 71.000000 -16.000327
14.000000 161.000000 -16.000004
64.000000 31.000000 31.999705
196.000000 223.000000 -16.000117
114.000000 194.000000 0.000448
239.000000 109.000000 -15.999611
242.000000 155.000000 -15.999961
62.000000 138.000000 15.999829
155.000000 188.000000 -0.000170
12.000000 131.000000 15.999532
230.000000 150.000000 -31.999836
12.000000 124.000000 -15.999937
244.000000 137.000000 -15.999895
38.000000 200.000000 0.000110
175.000000 93.000000 16.000389
40.000000 124.000000 32.000203
129.000000 11.000000 15.999840
39.000000 48.000000 16.000091
23.000000 70.000000 15.999560
89.000000 222.000000 -47.999557
73.000000 26.000000 31.999999
242.000000 94.000000 -0.000065
229.000000 148.000000 -32.000276
86.000000 237.000000 -15.999800
229.000000 190.000000 -15.999638
115.000000 71.000000 15.999835
180.000000 95.000000 -0.000262
247.000000 137.000000 0.000076
130.000000 69.000000 31.999978
38.000000 205.000000 -15.999885
95.000000 238.000000 -31.999829
155.000000 179.000000 -16.000164
25.000000 153.000000 -32.000133
17.000000 106.000000 -15.999715
178.000000 167.000000 -31.999967
209.000000 207.000000 -0.000472
68.000000 34.000000 0.000071
239.000000 146.000000 15.999682
81.000000 38.000000 47.999976
110.000000 23.000000 -0.000396
27.000000 81.000000 31.999842
136.000000 70.000000 32.000427
145.000000 232.000000 0.000270
140.000000 231.000000 -47.999598
148.000000 196.000000 -48.000069
16.000000 111.000000 -16.000408
108.000000 14.000000 31.999518
240.000000 91.000000 16.000149
230.000000 160.000000 -32.000275
64.000000 123.000000 15.999728
16.000000 87.000000 15.999844
8.000000 141.000000 0.000100
222.000000 194.000000 -0.000178
160.000000 61.000000 48.000409
174.000000 20.000000 15.999672
171.000000 174.000000 0.000162
84.000000 81.000000 -0.000264
151.000000 75.000000 15.999741
36.000000 79.000000 -16.000373
163.000000 18.000000 31.999651
68.000000 116.000000 -0.000288
185.000000 205.000000 -48.000148
193.000000 135.000000 16.000057
187.000000 119.000000 0.000122
19.000000 80.000000 0.000444
173.000000 64.000000 47.999899
237.000000 82.000000 0.000371
212.000000 211.000000 -15.999928
229.000000 87.000000 31.999870
69.000000 114.000000 0.000236
97.000000 194.000000 -48.000360
36.000000 176.000000 15.999577
55.000000 213.000000 -0.000157
189.000000 228.000000 -15.999840
110.000000 192.000000 -0.000275
174.000000 235.000000 -15.999655
73.000000 99.000000 -0.000327
28.000000 116.000000 31.999974
229.000000 107.000000 31.999858
153.000000 14.000000 15.999576
103.000000 14.000000 16.000290
130.000000 186.000000 -31.999906
162.000000 62.000000 48.000005
75.000000 160.000000 0.000127
13.000000 161.000000 -0.000169
183.000000 222.000000 -0.000352
107.000000 182.000000 -15.999640
105.000000 13.000000 15.999856
50.000000 38.000000 16.000248
175.000000 86.000000 0.000015
30.000000 196.000000 -15.999867
51.000000 42.000000 31.999990
241.000000 93.000000 15.999799
131.000000 243.000000 -16.000487
243.000000 102.000000 15.999527
30.000000 182.000000 -32.000239
120.000000 185.000000 -31.999833
66.000000 136.000000 -16.000264
200.000000 42.000000 -0.000351
25.000000 102.000000 32.000231
176.000000 87.000000 32.000019
160.000000 194.000000 -47.999614
96.000000 240.000000 -16.000345
230.000000 91.000000 -15.999643
243.000000 157.000000 -0.000306
243.000000 153.000000 -16.000310
217.000000 124.000000 32.000136
188.000000 197.000000 -47.999767
121.000000 70.000000 15.999790
242.000000 134.000000 16.000201
165.000000 229.000000 -0.000410
102.000000 24.000000 -0.000139
230.000000 164.000000 16.000285
182.000000 32.000000 0.000135
247.000000 114.000000 -0.000002
43.000000 204.000000 -32.000367
210.000000 212.000000 -15.999682
37.000000 59.000000 32.000195
94.000000 16.000000 15.999830
112.000000 25.000000 48.000203
95.000000 17.000000 31.999534
171.000000 192.000000 -48.000241
125.000000 60.000000 0.000292
12.000000 151.000000 -15.999890
162.000000 193.000000 -48.000247
161.000000 184.000000 0.000343
70.000000 107.000000 -0.000360
31.000000 120.000000 32.000491
73.000000 209.000000 -47.999995
106.000000 73.000000 31.999769
145.000000 63.000000 -0.000340
183.000000 152.000000 0.000134
138.000000 197.000000 -47.999966
106.000000 182.000000 -32.000377
95.000000 176.000000 -15.999590
61.000000 115.000000 -16.000234
80.000000 169.000000 0.000431
149.000000 23.000000 0.000338
242.000000 121.000000 -16.000055
63.000000 130.000000 16.000208
229.000000 65.000000 15.999791
152.000000 73.000000 31.999837
9.000000 143.000000 -0.000190
13.000000 100.000000 15.999721
78.000000 89.000000 0.000382
175.000000 226.000000 -0.000207
79.000000 64.000000 47.999724
165.000000 83.000000 15.999635
173.000000 191.000000 -48.000118
67.000000 141.000000 -15.999508
149.000000 229.000000 -48.000104
75.000000 156.000000 -15.999668
13.000000 155.000000 -15.999930
110.000000 71.000000 32.000201

View File

@ -1,6 +1,7 @@
Algebraic_foundations
Alpha_shapes_3
Arithmetic_kernel
CGAL_Core
Cartesian_kernel
Circulator
Filtered_kernel

View File

@ -0,0 +1,15 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
cmake_minimum_required(VERSION 3.1...3.20)
project(Alpha_wrap_3_Benchmark)
find_package(CGAL REQUIRED)
include_directories (BEFORE ../../include ./Quality ./Robustness) # AW3 includes
include_directories (BEFORE ../../../CGAL-Patches/include)
# create a target per cppfile
create_single_source_cgal_program("Performance/performance_benchmark.cpp")
create_single_source_cgal_program("Quality/quality_benchmark.cpp")
create_single_source_cgal_program("Robustness/robustness_benchmark.cpp")

View File

@ -0,0 +1,61 @@
# Copyright (c) 2019-2023 Google LLC (USA).
# All rights reserved.
#
# This file is part of CGAL (www.cgal.org).
#
# $URL$
# $Id$
# SPDX-License-Identifier: GPL-3.0-or-later
#
#
# Author(s) : Pierre Alliez
# Michael Hemmer
# Cedric Portaneri
#
#!/usr/bin/python
import os, sys, subprocess, datetime, time, getopt
def compute_performance_benchmark_data(execname, filename, alpha):
output = ""
cmd = ("/usr/bin/time", "-v",
execname, "-i",
filename, "-a", alpha)
proc = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
start_new_session=True)
outs, errs = proc.communicate()
output = outs.decode("utf-8") + errs.decode("utf-8")
for output_line in output.split("\n"):
if "User time (seconds): " in output_line:
print(output_line[len("User time (seconds): "):])
continue
if "Maximum resident set size (kbytes): " in output_line:
print(output_line[len("Maximum resident set size (kbytes): "):])
continue
def main(argv):
execname=""
filename=""
alpha=""
try:
opts, args = getopt.getopt(sys.argv[1:], 'e:i:a:')
except getopt.GetoptError:
sys.exit(2)
for opt, arg in opts:
if opt == "-e":
execname = arg
elif opt == "-i":
filename = arg
elif opt == "-a":
alpha = arg
compute_performance_benchmark_data(execname, filename, alpha)
if __name__ == "__main__":
main(sys.argv[1:])

View File

@ -0,0 +1,156 @@
# Copyright (c) 2019-2023 Google LLC (USA).
# All rights reserved.
#
# This file is part of CGAL (www.cgal.org).
#
# $URL$
# $Id$
# SPDX-License-Identifier: GPL-3.0-or-later
#
#
# Author(s) : Pierre Alliez
# Michael Hemmer
# Cedric Portaneri
#
#!/usr/bin/python
import os, sys, subprocess, datetime, time, signal, getopt
import numpy as np
import matplotlib.pyplot as plt
def main(argv):
inputdir=""
outputdir=""
commit_hash=""
alpha=""
do_diff=False
diffdir=""
diff_hash=""
try:
opts, args = getopt.getopt(sys.argv[1:], 'i:a:o:c:d:p:')
except getopt.GetoptError:
sys.exit(2)
for opt, arg in opts:
if opt == "-i":
inputdir = arg
elif opt == "-a":
alpha = arg
elif opt == "-o":
outputdir = arg
elif opt == "-c":
commit_hash = arg
elif opt == "-d":
diff_hash = arg
do_diff = True
elif opt == "-p":
diffdir = arg
all_metric = {
"Time_(second)" : {},
"Memory_Peak_(kbytes)" : {}}
num_input = 0
for filename in os.listdir(inputdir) :
new_path = os.path.join(inputdir,filename)
new_file = open(new_path)
is_empty_new = os.path.getsize(new_path) <= 1
if do_diff :
old_path = os.path.join(diffdir,filename)
old_file = open(old_path)
is_empty_old = os.path.getsize(old_path) <= 1
for key in all_metric:
if is_empty_new or is_empty_old :
new_val = 0.
old_val = 0.
else :
new_val = float(new_file.readline().rstrip('\n'))
old_val = float(old_file.readline().rstrip('\n'))
mesh_id = str(filename.split('.')[0])
all_metric[key][mesh_id] = [new_val, old_val]
else :
for key in all_metric:
if is_empty_new :
new_val = 0.
else :
new_val = float(new_file.readline().rstrip('\n'))
mesh_id = str(filename.split('.')[0])
all_metric[key][mesh_id] = [new_val, new_val]
num_input = num_input+1
# update .pdf chart
date_now = datetime.datetime.now()
date_for_filename = str(date_now.year) +"_"+ str(date_now.month) +"_"+ str(date_now.day) +"_"+ str(date_now.hour) +"h"+ str(date_now.minute) +"mn"
for key in all_metric:
goal = 0
num_el = range(len(all_metric[key]))
avg_diff_to_goal = 0.
avg = 0.
x1 = []
x2 = []
for value in all_metric[key].values() :
avg += value[0]
diff_to_goal = abs(value[1]-goal) - abs(value[0]-goal)
avg_diff_to_goal += diff_to_goal
x1.append(value[0])
x2.append(value[1])
avg_diff_to_goal /= float(len(all_metric[key]))
avg /= float(len(all_metric[key]))
plt.figure(figsize=(8,8))
if do_diff :
plt.hist(x2, bins=100, color='tab:green', alpha=0.5)
plt.hist(x1, bins=100, color='tab:blue', alpha=0.5)
plt.vlines(x = goal, ymin=plt.ylim()[0], ymax=plt.ylim()[1], linestyles='dashed')
title = ""
if do_diff :
title += "Diff between " + commit_hash + " and " + diff_hash + " on " + str(num_input) + " meshes from Thingi10K\nAlpha = Bbox diag length / " + alpha
else :
title += "Benchmarking on " + str(num_input) + " meshes from Thingi10K\nAlpha = Bbox diag length / " + alpha
avg_str = str(format(abs(avg), '.2f'))
if key == "Time_(second)" :
title += "\nIn average we spend " + avg_str + " seconds"
else :
title += "\nIn average we use up to " + avg_str + " kbytes"
if do_diff and avg_diff_to_goal == 0. :
title += "\nNo change between the two commits"
elif do_diff :
avg_diff_str = str(format(abs(avg_diff_to_goal), '.2f'))
if key == "Time_(second)" :
if avg_diff_to_goal < 0 :
title += "\nIn average we get slower by "
else :
title += "\nIn average we get faster "
title += avg_diff_str + " seconds"
else :
if avg_diff_to_goal < 0 :
title += "\nIn average we use " + avg_diff_str + " more"
else :
title += "\nIn average we use " + avg_diff_str + " less"
title += " kbytes"
plt.title(title, fontsize=15)
plt.xlabel(key.replace("_"," "), fontsize=14)
plt.ylabel("# of meshes", fontsize=14)
plt.tick_params(axis="x", labelsize=9)
plt.tick_params(axis="y", labelsize=9)
chart_filename = ""
if do_diff :
chart_filename += "diff_"+commit_hash+"_"+diff_hash+"_"+key+"_"+date_for_filename+".pdf"
else :
chart_filename += "results_"+commit_hash+"_"+key+"_"+date_for_filename+".pdf"
chart_path = os.path.join(outputdir+"/charts",chart_filename)
if os.path.isfile(chart_path) :
os.remove(chart_path)
plt.savefig(chart_path, bbox_inches="tight")
plt.close()
print("pdf updated")
sys.exit()
if __name__ == "__main__":
main(sys.argv[1:])

View File

@ -0,0 +1,65 @@
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/alpha_wrap_3.h>
#include <CGAL/IO/polygon_soup_io.h>
#include <array>
#include <iostream>
#include <string>
#include <vector>
using K = CGAL::Exact_predicates_inexact_constructions_kernel;
using Point_3 = K::Point_3;
using Vector_3 = K::Vector_3;
using Mesh = CGAL::Surface_mesh<Point_3>;
namespace PMP = CGAL::Polygon_mesh_processing;
int main(int argc, char** argv)
{
const int argc_check = argc - 1;
const char* entry_name_ptr = nullptr;
double relative_alpha_ratio = 20., relative_offset_ratio = 600.;
for(int i=1; i<argc; ++i)
{
if(!strcmp("-i", argv[i]) && i < argc_check)
entry_name_ptr = argv[++i];
else if(!strcmp("-a", argv[i]) && i < argc_check)
relative_alpha_ratio = std::stod(argv[++i]);
else if(!strcmp("-d", argv[i]) && i < argc_check)
relative_offset_ratio = std::stod(argv[++i]);
}
if(argc < 3 || relative_alpha_ratio <= 0.)
{
std::cerr << "Error: bad input parameters." << std::endl;
return EXIT_FAILURE;
}
std::vector<Point_3> points;
std::vector<std::array<std::size_t, 3> > faces;
if(!CGAL::IO::read_polygon_soup(entry_name_ptr, points, faces) || faces.empty())
{
std::cerr << "Error: Invalid input data." << std::endl;
return EXIT_FAILURE;
}
CGAL::Bbox_3 bbox;
for(const Point_3& p : points)
bbox += p.bbox();
const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) +
CGAL::square(bbox.ymax() - bbox.ymin()) +
CGAL::square(bbox.zmax() - bbox.zmin()));
const double alpha = diag_length / relative_alpha_ratio;
const double offset = diag_length / relative_offset_ratio;
Mesh wrap;
CGAL::alpha_wrap_3(points, faces, alpha, offset, wrap);
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,54 @@
# Copyright (c) 2019-2023 Google LLC (USA).
# All rights reserved.
#
# This file is part of CGAL (www.cgal.org).
#
# $URL$
# $Id$
# SPDX-License-Identifier: GPL-3.0-or-later
#
#
# Author(s) : Pierre Alliez
# Michael Hemmer
# Cedric Portaneri
#
#!/usr/bin/python
import os, sys, subprocess, datetime, time, getopt
def compute_quality_benchmark_data(execname, filename, alpha):
output = ""
cmd = (execname, "-i",
filename, "-a", alpha)
proc = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
start_new_session=True)
outs, errs = proc.communicate()
output = outs.decode("utf-8") + errs.decode("utf-8")
print(output)
def main(argv):
execname=""
filename=""
alpha=""
try:
opts, args = getopt.getopt(sys.argv[1:], 'e:i:a:')
except getopt.GetoptError:
sys.exit(2)
for opt, arg in opts:
if opt == "-e":
execname = arg
elif opt == "-i":
filename = arg
elif opt == "-a":
alpha = arg
compute_quality_benchmark_data(execname, filename, alpha)
if __name__ == "__main__":
main(sys.argv[1:])

View File

@ -0,0 +1,151 @@
// Copyright (c) 2019-2022 Google LLC (USA).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org).
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Pierre Alliez
// Michael Hemmer
// Cedric Portaneri
#ifndef CGAL_ALPHA_WRAP_3_BENCHMARK_ALPHA_WRAP_3_QUALITY_DISTANCE_H_
#define CGAL_ALPHA_WRAP_3_BENCHMARK_ALPHA_WRAP_3_QUALITY_DISTANCE_H_
#include <CGAL/AABB_face_graph_triangle_primitive.h>
#include <CGAL/AABB_traits.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/bounding_box.h>
#include <CGAL/Polygon_mesh_processing/bbox.h>
#include <CGAL/Polygon_mesh_processing/distance.h>
#include <CGAL/point_generators_3.h>
#include <CGAL/Search_traits_3.h>
namespace Aw3i {
enum Distance_metric { HAUSDORFF = 0, MEAN = 1, RMS = 2 };
template <typename Point, typename AABBTree>
inline double approximate_hausdorff_distance(const std::vector<Point>& sample_points,
const AABBTree& tree,
Point& hint)
{
double hdist = 0;
for(const Point& pt : sample_points)
{
hint = tree.closest_point(pt, hint);
auto dist = CGAL::squared_distance(hint, pt);
double d = CGAL::to_double(CGAL::approximate_sqrt(dist));
if(d > hdist)
hdist = d;
}
return hdist;
}
template <typename Point, typename AABBTree>
inline double approximate_mean_distance(const std::vector<Point>& sample_points,
const AABBTree& tree,
Point& hint)
{
double mdist = 0;
for(const Point& pt : sample_points)
{
hint = tree.closest_point(pt, hint);
auto dist = CGAL::squared_distance(hint, pt);
double d = CGAL::to_double(CGAL::approximate_sqrt(dist));
mdist += d;
}
return mdist / sample_points.size();
}
template <typename Point, typename AABBTree>
inline double approximate_rms_distance(const std::vector<Point>& sample_points,
const AABBTree& tree,
Point& hint)
{
double rmsdist = 0;
for(const Point& pt : sample_points)
{
hint = tree.closest_point(pt, hint);
auto dist = CGAL::squared_distance(hint, pt);
rmsdist += CGAL::to_double(dist);
}
return CGAL::to_double(CGAL::approximate_sqrt(rmsdist / sample_points.size()));
}
template <typename TriangleMesh>
inline double approximate_distance(const TriangleMesh& tm1,
const TriangleMesh& tm2,
const Distance_metric& metric)
{
using GT = typename CGAL::GetGeomTraits<TriangleMesh>::type;
using Point_3 = typename GT::Point_3;
using Primitive = CGAL::AABB_face_graph_triangle_primitive<TriangleMesh>;
using AABB_traits = CGAL::AABB_traits<GT, Primitive>;
using AABB_tree = CGAL::AABB_tree<AABB_traits>;
using CGAL::parameters::choose_parameter;
using CGAL::parameters::get_parameter;
std::vector<Point_3> original_sample_points;
CGAL::Polygon_mesh_processing::sample_triangle_mesh(tm1, std::back_inserter(original_sample_points),
CGAL::parameters::all_default());
std::vector<Point_3> sample_points(std::begin(original_sample_points),
std::end(original_sample_points));
CGAL::spatial_sort(sample_points.begin(), sample_points.end());
AABB_tree tree(faces(tm2).first, faces(tm2).second, tm2);
tree.build();
auto vpm_2 = get(CGAL::vertex_point, tm2);
Point_3 hint = get(vpm_2, *vertices(tm2).first);
if(metric == HAUSDORFF)
return approximate_hausdorff_distance(sample_points, tree, hint);
else if(metric == MEAN)
return approximate_mean_distance(sample_points, tree, hint);
else if(metric == RMS)
return approximate_rms_distance(sample_points, tree, hint);
else
std::cerr << "Metric unknown\n" << std::endl;
return -1.0;
}
template <typename TriangleMesh>
double get_longest_diag_bbox(const TriangleMesh& tm)
{
CGAL::Bbox_3 bbox = CGAL::Polygon_mesh_processing::bbox(tm);
return std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) +
CGAL::square(bbox.ymax() - bbox.ymin()) +
CGAL::square(bbox.zmax() - bbox.zmin()));
}
template <typename TriangleMesh>
inline double approximate_distance_relative_to_bbox(const TriangleMesh& tm1,
const TriangleMesh& tm2,
const Distance_metric& metric)
{
double longest_diag_length = get_longest_diag_bbox(tm1);
return approximate_distance(tm1, tm2, metric) / longest_diag_length;
}
template <typename TriangleMesh, typename FT>
inline double approximate_distance_relative_to_bbox(const TriangleMesh& tm1,
const TriangleMesh& tm2,
const Distance_metric& metric,
const FT& longest_diag_length)
{
return approximate_distance(tm1, tm2, metric) / CGAL::to_double(longest_diag_length);
}
} // namespace Aw3i
#endif // CGAL_CGAL_ALPHA_WRAP_3_BENCHMARK_ALPHA_WRAP_3_QUALITY_DISTANCE_H_

View File

@ -0,0 +1,182 @@
# Copyright (c) 2019-2023 Google LLC (USA).
# All rights reserved.
#
# This file is part of CGAL (www.cgal.org).
#
# $URL$
# $Id$
# SPDX-License-Identifier: GPL-3.0-or-later
#
#
# Author(s) : Pierre Alliez
# Michael Hemmer
# Cedric Portaneri
#
#!/usr/bin/python
import os, sys, subprocess, datetime, time, signal, getopt
import numpy as np
import matplotlib.pyplot as plt
def main(argv):
inputdir=""
outputdir=""
commit_hash=""
alpha=""
do_diff=False
diffdir=""
diff_hash=""
try:
opts, args = getopt.getopt(sys.argv[1:], 'i:a:o:c:d:p:')
except getopt.GetoptError:
sys.exit(2)
for opt, arg in opts:
if opt == "-i":
inputdir = arg
elif opt == "-a":
alpha = arg
elif opt == "-o":
outputdir = arg
elif opt == "-c":
commit_hash = arg
elif opt == "-d":
diff_hash = arg
do_diff = True
elif opt == "-p":
diffdir = arg
all_metric = {
"Mean_Min_Angle_(degree)" : {},
"Mean_Max_Angle_(degree)" : {},
"Mean_Radius_Ratio" : {},
"Mean_Edge_Ratio" : {},
"Mean_Aspect_Ratio" : {},
"Complexity_(#_of_triangle)" : {},
"#_of_almost_degenerate_triangle" : {},
"Hausdorff_distance_output_to_input_(%_of_bbox_diag)" : {}}
num_input = 0
print("inputdir = ", inputdir)
for filename in os.listdir(inputdir) :
new_path = os.path.join(inputdir,filename)
new_file = open(new_path)
if do_diff :
old_path = os.path.join(diffdir,filename)
old_file = open(old_path)
is_empty_old = os.path.getsize(old_path) <= 1
for key in all_metric :
try :
new_val = float(new_file.readline().rstrip('\n'))
old_val = float(old_file.readline().rstrip('\n'))
mesh_id = str(filename.split('.')[0])
all_metric[key][mesh_id] = [new_val, old_val]
except ValueError:
pass
else :
for key in all_metric :
try :
new_val = float(new_file.readline().rstrip('\n'))
mesh_id = str(filename.split('.')[0])
all_metric[key][mesh_id] = [new_val, new_val]
except ValueError:
pass
num_input = num_input+1
# update .pdf chart
date_now = datetime.datetime.now()
date_for_filename = str(date_now.year) +"_"+ str(date_now.month) +"_"+ str(date_now.day) +"_"+ str(date_now.hour) +"h"+ str(date_now.minute) +"mn"
for key in all_metric:
goal = 0
if key == "Mean_Min_Angle_(degree)" or key == "Mean_Max_Angle_(degree)":
goal = 60
elif key == "Mean_Radius_Ratio" or key == "Mean_Edge_Ratio" or key == "Mean_Aspect_Ratio" :
goal = 1
num_el = range(len(all_metric[key]))
avg_diff_to_goal = 0.
avg = 0.
x1 = []
x2 = []
for value in all_metric[key].values() :
avg += value[0]
diff_to_goal = abs(value[1]-goal) - abs(value[0]-goal)
avg_diff_to_goal += diff_to_goal
x1.append(value[0])
x2.append(value[1])
avg_diff_to_goal /= float(len(all_metric[key]))
avg /= float(len(all_metric[key]))
plt.figure(figsize=(8,8))
if do_diff :
plt.hist(x2, bins=100, color='tab:green', alpha=0.5)
plt.hist(x1, bins=100, color='tab:blue', alpha=0.5)
plt.vlines(x = goal, ymin=plt.ylim()[0], ymax=plt.ylim()[1], linestyles='dashed')
title = ""
if do_diff :
title += "Diff between " + commit_hash + " and " + diff_hash + " on " + str(num_input) + " meshes from Thingi10K\nAlpha = Bbox diag length / " + alpha
else :
title += "Benchmarking on " + str(num_input) + " meshes from Thingi10K\nAlpha = Bbox diag length / " + alpha
avg_str = str(format(abs(avg), '.2f'))
if key == "Mean_Min_Angle_(degree)" or key == "Mean_Max_Angle_(degree)":
title += "\nIn average we have " + avg_str + "°"
elif key == "Mean_Radius_Ratio" or key == "Mean_Edge_Ratio" or key == "Mean_Aspect_Ratio" :
title += "\nIn average we have a ratio of " + avg_str
elif key == "Hausdorff_distance_output_to_input_(%_of_bbox_diag)" :
title += "\nIn average we have a distance of " + avg_str + "% of bbox diag"
elif key == "Complexity_(#_of_triangle)" or key == "#_of_almost_degenerate_triangle" :
title += "\nIn average we have " + avg_str + " triangles"
if do_diff and avg_diff_to_goal == 0. :
title += "\nNo change between the two commits"
elif do_diff :
avg_diff_str = str(format(abs(avg_diff_to_goal), '.2f'))
if key == "Mean_Min_Angle_(degree)" or key == "Mean_Max_Angle_(degree)":
if avg_diff_to_goal < 0 :
title += "\nIn average we loose "
else :
title += "\nIn average we gain "
title += avg_diff_str + "° toward 60°"
elif key == "Mean_Radius_Ratio" or key == "Mean_Edge_Ratio" or key == "Mean_Aspect_Ratio" :
if avg_diff_to_goal < 0 :
title += "\nIn average we loose "
else :
title += "\nIn average we gain "
title += avg_diff_str + " of ratio toward 1"
elif key == "Hausdorff_distance_output_to_input_(%_of_bbox_diag)" :
if avg_diff_to_goal < 0 :
title += "\nIn average we increase by "
else :
title += "\nIn average we reduce by "
title += avg_diff_str + " the bbox ratio"
elif key == "Complexity_(#_of_triangle)" or key == "#_of_almost_degenerate_triangle" :
if avg_diff_to_goal < 0 :
title += "\nIn average we get " + avg_diff_str + " more"
else :
title += "\nIn average we get " + avg_diff_str + " less"
title += " triangles"
plt.title(title, fontsize=15)
plt.xlabel(key.replace("_"," "), fontsize=14)
plt.ylabel("# of meshes", fontsize=14)
plt.tick_params(axis="x", labelsize=9)
plt.tick_params(axis="y", labelsize=9)
chart_filename = ""
if do_diff :
chart_filename += "diff_"+commit_hash+"_"+diff_hash+"_"+key+"_"+date_for_filename+".pdf"
else :
chart_filename += "results_"+commit_hash+"_"+key+"_"+date_for_filename+".pdf"
chart_path = os.path.join(outputdir+"/charts",chart_filename)
if os.path.isfile(chart_path) :
os.remove(chart_path)
plt.savefig(chart_path, bbox_inches="tight")
plt.close()
print("pdf updated")
sys.exit()
if __name__ == "__main__":
main(sys.argv[1:])

View File

@ -0,0 +1,271 @@
#include <distance_utils.h>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/alpha_wrap_3.h>
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
#include <array>
#include <cmath>
#include <iostream>
using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
using Point_3 = Kernel::Point_3;
using Vector_3 = Kernel::Vector_3;
using Triangle_3 = Kernel::Triangle_3;
using FT = Kernel::FT;
using Mesh = CGAL::Surface_mesh<Point_3>;
using face_descriptor = boost::graph_traits<Mesh>::face_descriptor;
using Oracle = CGAL::Alpha_wraps_3::internal::Triangle_mesh_oracle<Kernel>;
using Dt = CGAL::Alpha_wraps_3::internal::Alpha_wrapper_3<Oracle>::Triangulation;
namespace PMP = CGAL::Polygon_mesh_processing;
std::array<FT, 3> triangle_angles(const Triangle_3& tr)
{
FT sq_a = CGAL::squared_distance(tr[0], tr[1]);
FT sq_b = CGAL::squared_distance(tr[1], tr[2]);
FT sq_c = CGAL::squared_distance(tr[2], tr[0]);
FT two_ab = 2. * CGAL::sqrt(sq_a) * CGAL::sqrt(sq_b);
FT two_bc = 2. * CGAL::sqrt(sq_b) * CGAL::sqrt(sq_c);
FT two_ca = 2. * CGAL::sqrt(sq_c) * CGAL::sqrt(sq_a);
FT angle_a = (sq_b + sq_c - sq_a) / two_bc;
FT angle_b = (sq_c + sq_a - sq_b) / two_ca;
FT angle_c = (sq_a + sq_b - sq_c) / two_ab;
if(angle_a < -1.) angle_a = -1.;
if(angle_b < -1.) angle_b = -1.;
if(angle_c < -1.) angle_c = -1.;
if(angle_a > 1.) angle_a = 1.;
if(angle_b > 1.) angle_b = 1.;
if(angle_c > 1.) angle_c = 1.;
angle_a = std::acos(angle_a);
angle_b = std::acos(angle_b);
angle_c = std::acos(angle_c);
return {angle_a, angle_b, angle_c};
}
bool is_almost_degenerate(const Triangle_3& tr,
double threshold)
{
FT sq_area = tr.squared_area();
return (CGAL::sqrt(CGAL::to_double(sq_area)) < threshold);
}
auto surface_mesh_face_to_triangle(const face_descriptor fd,
const Mesh& sm)
{
typename boost::graph_traits<Mesh>::halfedge_descriptor hd = halfedge(fd,sm);
return Triangle_3(sm.point(target(hd,sm)),
sm.point(target(next(hd,sm),sm)),
sm.point(target(next(next(hd,sm),sm),sm)));
}
double mean_min_angle(const Mesh& mesh)
{
double mean_min_angle = 0.;
for(const face_descriptor f : faces(mesh))
{
const Triangle_3 tr = surface_mesh_face_to_triangle(f, mesh);
std::array<FT, 3> angles = triangle_angles(tr);
FT min_angle = std::min({angles[0], angles[1], angles[2]});
min_angle = min_angle * (180.0 / CGAL_PI);
mean_min_angle += min_angle;
}
mean_min_angle /= static_cast<double>(mesh.number_of_faces());
return mean_min_angle;
}
double mean_max_angle(const Mesh& mesh)
{
double mean_max_angle = 0.;
for(const face_descriptor f : faces(mesh))
{
const Triangle_3 tr = surface_mesh_face_to_triangle(f, mesh);
std::array<FT, 3> angles = triangle_angles(tr);
FT max_angle = std::max({angles[0], angles[1], angles[2]});
max_angle = max_angle * (180.0 / CGAL_PI);
mean_max_angle += max_angle;
}
mean_max_angle /= static_cast<double>(mesh.number_of_faces());
return mean_max_angle;
}
double mean_radius_ratio(const Mesh& mesh,
double degenerate_threshold)
{
double mean_radius_ratio = 0.;
size_t num_almost_degenerate_tri = 0;
for(const face_descriptor f : faces(mesh))
{
const Triangle_3 tr = surface_mesh_face_to_triangle(f, mesh);
if(is_almost_degenerate(tr, degenerate_threshold))
{
++num_almost_degenerate_tri;
continue;
}
FT circumsphere_radius = std::sqrt(CGAL::squared_radius(tr[0], tr[1], tr[2]));
FT a = std::sqrt(CGAL::squared_distance(tr[0], tr[1]));
FT b = std::sqrt(CGAL::squared_distance(tr[1], tr[2]));
FT c = std::sqrt(CGAL::squared_distance(tr[2], tr[0]));
FT s = 0.5 * (a + b + c);
FT inscribed_radius = std::sqrt((s * (s - a) * (s - b) * (s - c)) / s);
FT radius_ratio = circumsphere_radius / inscribed_radius;
radius_ratio /= 2.; // normalized
mean_radius_ratio += radius_ratio;
}
mean_radius_ratio /= static_cast<double>(mesh.number_of_faces() - num_almost_degenerate_tri);
return mean_radius_ratio;
}
double mean_edge_ratio(const Mesh& mesh,
double degenerate_threshold)
{
double mean_edge_ratio = 0.;
size_t num_almost_degenerate_tri = 0;
for(const face_descriptor f : faces(mesh))
{
const Triangle_3 tr = surface_mesh_face_to_triangle(f, mesh);
if(is_almost_degenerate(tr, degenerate_threshold))
{
++num_almost_degenerate_tri;
continue;
}
FT a = std::sqrt(CGAL::squared_distance(tr[0], tr[1]));
FT b = std::sqrt(CGAL::squared_distance(tr[1], tr[2]));
FT c = std::sqrt(CGAL::squared_distance(tr[2], tr[0]));
FT min_edge = std::min({a, b, c});
FT max_edge = std::max({a, b, c});
FT edge_ratio = max_edge / min_edge;
mean_edge_ratio += edge_ratio;
}
mean_edge_ratio /= static_cast<double>(mesh.number_of_faces() - num_almost_degenerate_tri);
return mean_edge_ratio;
}
double mean_aspect_ratio(const Mesh& mesh,
double degenerate_threshold)
{
double mean_aspect_ratio = 0.;
size_t num_almost_degenerate_tri = 0;
for(const face_descriptor f : faces(mesh))
{
const Triangle_3 tr = surface_mesh_face_to_triangle(f, mesh);
if(is_almost_degenerate(tr, degenerate_threshold))
{
++num_almost_degenerate_tri;
continue;
}
FT a = std::sqrt(CGAL::squared_distance(tr[0], tr[1]));
FT b = std::sqrt(CGAL::squared_distance(tr[1], tr[2]));
FT c = std::sqrt(CGAL::squared_distance(tr[2], tr[0]));
FT s = 0.5 * (a + b + c);
FT inscribed_radius = std::sqrt((s * (s - a) * (s - b) * (s - c)) / s);
FT max_edge = std::max({a, b, c});
FT aspect_ratio = max_edge / inscribed_radius;
aspect_ratio /= (2. * std::sqrt(3.)); // normalized
mean_aspect_ratio += aspect_ratio;
}
mean_aspect_ratio /= static_cast<double>(mesh.number_of_faces() - num_almost_degenerate_tri);
return mean_aspect_ratio;
}
size_t num_almost_degenerate_tri(const Mesh& mesh,
double degenerate_threshold)
{
size_t num_almost_degenerate_tri = 0;
for(const face_descriptor f : faces(mesh))
{
const Triangle_3 tr = surface_mesh_face_to_triangle(f, mesh);
if(is_almost_degenerate(tr, degenerate_threshold))
{
++num_almost_degenerate_tri;
}
}
return num_almost_degenerate_tri;
}
int main(int argc, char** argv)
{
const int argc_check = argc - 1;
char *entry_name_ptr = nullptr;
double relative_alpha_ratio = 20.;
double relative_offset_ratio = 600.;
for(int i=1; i<argc; ++i)
{
if(!strcmp("-i", argv[i]) && i < argc_check) {
entry_name_ptr = argv[++i];
} else if(!strcmp("-a", argv[i]) && i < argc_check) {
relative_alpha_ratio = std::stod(argv[++i]);
} else if(!strcmp("-d", argv[i]) && i < argc_check) {
relative_offset_ratio = std::stod(argv[++i]);
}
}
if(argc < 3 || relative_alpha_ratio <= 0.)
{
std::cerr << "Error: bad input parameters." << std::endl;
return EXIT_FAILURE;
}
Mesh input_mesh;
if(!PMP::IO::read_polygon_mesh(entry_name_ptr, input_mesh) ||
is_empty(input_mesh) ||
!is_triangle_mesh(input_mesh))
{
return EXIT_FAILURE;
}
CGAL::Bbox_3 bbox = PMP::bbox(input_mesh);
const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) +
CGAL::square(bbox.ymax() - bbox.ymin()) +
CGAL::square(bbox.zmax() - bbox.zmin()));
const double alpha = diag_length / relative_alpha_ratio;
const double offset = diag_length / relative_offset_ratio;
Mesh wrap;
CGAL::alpha_wrap_3(input_mesh, alpha, offset, wrap);
double degenerate_threshold = 0.;
for(const face_descriptor f : faces(wrap))
{
const Triangle_3 tr = surface_mesh_face_to_triangle(f, wrap);
degenerate_threshold += CGAL::sqrt(CGAL::to_double(tr.squared_area()));
}
degenerate_threshold /= wrap.number_of_faces();
degenerate_threshold /= 1000;
std::cout << mean_min_angle(wrap) << "\n";
std::cout << mean_max_angle(wrap) << "\n";
std::cout << mean_radius_ratio(wrap, degenerate_threshold) << "\n";
std::cout << mean_edge_ratio(wrap, degenerate_threshold) << "\n";
std::cout << mean_aspect_ratio(wrap, degenerate_threshold) << "\n";
std::cout << wrap.number_of_faces() << "\n";
std::cout << num_almost_degenerate_tri(wrap, degenerate_threshold) << "\n";
std::cout << 100. * approximate_distance_relative_to_bbox(wrap, input_mesh, Aw3i::HAUSDORFF) << "\n";
return 0;
}

View File

@ -0,0 +1,97 @@
# Copyright (c) 2019-2023 Google LLC (USA).
# All rights reserved.
#
# This file is part of CGAL (www.cgal.org).
#
# $URL$
# $Id$
# SPDX-License-Identifier: GPL-3.0-or-later
#
#
# Author(s) : Pierre Alliez
# Michael Hemmer
# Cedric Portaneri
#
#!/usr/bin/python
import os, sys, subprocess, datetime, time, signal, getopt
def signal_handler(signum, frame):
raise Exception("Timed out!")
def compute_robustness_benchmark_data(execname, filename, alpha, max_time):
exit_codes = {
0 : "VALID_SOLID_OUTPUT",
1 : "INPUT_IS_INVALID",
2 : "OUTPUT_IS_NOT_TRIANGLE_MESH",
3 : "OUTPUT_IS_COMBINATORIAL_NON_MANIFOLD",
4 : "OUTPUT_HAS_BORDERS",
5 : "OUTPUT_HAS_DEGENERATED_FACES",
6 : "OUTPUT_HAS_GEOMETRIC_SELF_INTERSECTIONS",
7 : "OUTPUT_DOES_NOT_BOUND_VOLUME",
8 : "OUTPUT_DOES_NOT_CONTAIN_INPUT",
9 : "OUTPUT_DISTANCE_IS_TOO_LARGE",
10 : "SIGSEGV",
11 : "SIGABRT",
12 : "SIGFPE",
13 : "TIMEOUT"
}
exit_code = 0
output = ""
cmd = ("/usr/bin/time", "-v",
execname, "-i",
filename, "-a", alpha)
proc = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
start_new_session=True)
try:
outs, errs = proc.communicate(timeout=int(max_time))
exit_code = proc.returncode
output = outs.decode("utf-8") + errs.decode("utf-8")
for output_line in output.split("\n"):
if output_line == "Command terminated by signal 11":
exit_code = 10
continue
elif output_line == "Command terminated by signal 6":
exit_code = 11
continue
elif output_line == "Command terminated by signal 8":
exit_code = 12
continue
except subprocess.TimeoutExpired:
os.killpg(os.getpgid(proc.pid), signal.SIGTERM)
exit_code = 13
output = "process ran too long"
print(exit_codes[exit_code])
def main(argv):
execname=""
filename=""
alpha=""
max_time=""
try:
opts, args = getopt.getopt(sys.argv[1:], 'e:i:a:t:')
except getopt.GetoptError:
sys.exit(2)
for opt, arg in opts:
if opt == "-e":
execname = arg
elif opt == "-i":
filename = arg
elif opt == "-a":
alpha = arg
elif opt == "-t":
max_time = arg
compute_robustness_benchmark_data(execname, filename, alpha, max_time)
if __name__ == "__main__":
main(sys.argv[1:])

View File

@ -0,0 +1,156 @@
# Copyright (c) 2019-2023 Google LLC (USA).
# All rights reserved.
#
# This file is part of CGAL (www.cgal.org).
#
# $URL$
# $Id$
# SPDX-License-Identifier: GPL-3.0-or-later
#
#
# Author(s) : Pierre Alliez
# Michael Hemmer
# Cedric Portaneri
#
#!/usr/bin/python
import os, sys, subprocess, datetime, time, signal, getopt
import numpy as np
import matplotlib.pyplot as plt
def main(argv):
inputdir=""
outputdir=""
commit_hash=""
alpha=""
try:
opts, args = getopt.getopt(sys.argv[1:], 'i:a:o:c:')
except getopt.GetoptError:
sys.exit(2)
for opt, arg in opts:
if opt == "-i":
inputdir = arg
elif opt == "-a":
alpha = arg
elif opt == "-o":
outputdir = arg
elif opt == "-c":
commit_hash = arg
exit_codes = {
0 : "VALID_SOLID_OUTPUT",
1 : "INPUT_IS_INVALID",
2 : "OUTPUT_IS_NOT_TRIANGLE_MESH",
3 : "OUTPUT_IS_COMBINATORIAL_NON_MANIFOLD",
4 : "OUTPUT_HAS_BORDERS",
5 : "OUTPUT_HAS_DEGENERATED_FACES",
6 : "OUTPUT_HAS_GEOMETRIC_SELF_INTERSECTIONS",
7 : "OUTPUT_DOES_NOT_BOUND_VOLUME",
8 : "OUTPUT_DOES_NOT_CONTAIN_INPUT",
9 : "OUTPUT_DISTANCE_IS_TOO_LARGE",
10 : "SIGSEGV",
11 : "SIGABRT",
12 : "SIGFPE",
13 : "TIMEOUT"
}
current_run_data = {
"VALID_SOLID_OUTPUT" : 0,
"INPUT_IS_INVALID" : 0,
"OUTPUT_IS_NOT_TRIANGLE_MESH" : 0,
"OUTPUT_IS_COMBINATORIAL_NON_MANIFOLD" : 0,
"OUTPUT_HAS_BORDERS" : 0,
"OUTPUT_HAS_DEGENERATED_FACES" : 0,
"OUTPUT_HAS_GEOMETRIC_SELF_INTERSECTIONS" : 0,
"OUTPUT_DOES_NOT_BOUND_VOLUME" : 0,
"OUTPUT_DOES_NOT_CONTAIN_INPUT" : 0,
"OUTPUT_DISTANCE_IS_TOO_LARGE" : 0,
"SIGSEGV" : 0,
"SIGABRT" : 0,
"SIGFPE" : 0,
"TIMEOUT" : 0
}
filenames_per_codes = {}
for key in current_run_data :
filenames_per_codes[key] = []
print("inputdir = ", inputdir)
num_input = 0
for filename in os.listdir(inputdir) :
print("filename = ", filename)
f = open(os.path.join(inputdir,filename))
status = f.readline().rstrip('\n');
current_run_data[status] += 1
filenames_per_codes[status].append(filename.rstrip('.log'))
num_input = num_input+1
# sort current_run_data by value
current_run_data = {k: v for k, v in sorted(current_run_data.items(), key=lambda item: item[1], reverse=True)}
# update chart data files
date_now = datetime.datetime.now()
date = str(date_now.year) +"-"+ str(date_now.month) +"-"+ str(date_now.day) +" "+ str(date_now.hour) +"h"+ str(date_now.minute) +"mn"
for key_filename in current_run_data:
f = open(os.path.join(outputdir+"/charts_data", key_filename+".txt"), "a+")
f.write(str(current_run_data[key_filename]) + " " + commit_hash + " " + date + "\n")
print("chart data updated")
# update .pdf chart
chart = plt.figure(figsize=(10, 7))
colormap = ["tab:blue","tab:orange","tab:green","tab:red","tab:purple","tab:brown","tab:pink","tab:gray","tab:olive","tab:cyan","b","palegreen", "peachpuff"]
plt.gca().set_prop_cycle('color', colormap)
plt.style.use('tableau-colorblind10')
for key_filename in current_run_data:
f = open(os.path.join(outputdir+"/charts_data", key_filename+".txt"), "r")
lines = f.readlines()
x_number_values = []
y_number_values = []
i = 0
for line in lines :
if i < (len(lines) - 10) :
i=i+1
continue
i=i+1
words = line.strip().split()
x_number_values.append(words[1]+"\n"+words[2]+"\n"+words[3])
y_number_values.append(int(words[0]))
plt.plot(x_number_values, y_number_values, marker='o', label=key_filename+": "+str(current_run_data[key_filename]))
plt.xlabel("Version", fontsize=14)
plt.ylabel("# of mesh", fontsize=14)
plt.tick_params(axis="both", labelsize=9)
plt.title("Benchmarking on " + str(num_input) + " meshes from Thingi10K\nAlpha = Bbox diag length / " + alpha, fontsize=15)
plt.legend(loc='lower left', bbox_to_anchor= (1.01, 0.58), ncol=1,
borderaxespad=0, frameon=False)
date_for_filename = str(date_now.year) +"-"+ str(date_now.month) +"-"+ str(date_now.day) +"-"+ str(date_now.hour) +"h"+ str(date_now.minute) +"mn"
chart_filename = os.path.join(outputdir+"/charts","benchmarking_version_"+commit_hash+"-"+date_for_filename+".pdf")
if os.path.isfile(chart_filename) :
os.remove(chart_filename)
chart.savefig(chart_filename, bbox_inches="tight")
plt.close(chart)
print("pdf updated")
# dump filenames per codes
log_dirname = os.path.join(outputdir, "log/"+commit_hash+"-"+date_for_filename)
if not os.path.exists(log_dirname):
os.mkdir(log_dirname)
for key in filenames_per_codes :
file = open(os.path.join(log_dirname, key+".txt"), "w+")
for filename in filenames_per_codes[key] :
file.write(filename + "\n")
file.close()
sys.exit()
if __name__ == "__main__":
main(sys.argv[1:])

View File

@ -0,0 +1,111 @@
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/alpha_wrap_3.h>
#include <CGAL/Alpha_wrap_3/internal/validation.h>
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
using Point_3 = Kernel::Point_3;
using Mesh = CGAL::Surface_mesh<Point_3>;
namespace CGAL {
namespace Alpha_wraps_3 {
namespace internal {
namespace {
enum Robustness_benchmark_exit_code
{
// Success
VALID_SOLID_OUTPUT = 0,
// Failure
INPUT_IS_INVALID = 1,
OUTPUT_IS_NOT_TRIANGLE_MESH = 2,
OUTPUT_IS_COMBINATORIAL_NON_MANIFOLD = 3,
OUTPUT_HAS_BORDERS = 4,
OUTPUT_HAS_DEGENERATED_FACES = 5,
OUTPUT_HAS_GEOMETRIC_SELF_INTERSECTIONS = 6,
OUTPUT_DOES_NOT_BOUND_VOLUME = 7,
OUTPUT_DOES_NOT_CONTAIN_INPUT = 8,
OUTPUT_DISTANCE_IS_TOO_LARGE = 9,
};
} // namespace
} // namespace internal
} // namespace Alpha_wraps_3
} // namespace CGAL
namespace PMP = CGAL::Polygon_mesh_processing;
namespace AW3i = CGAL::Alpha_wraps_3::internal;
int main(int argc, char** argv)
{
const int argc_check = argc - 1;
char* entry_name_ptr = nullptr;
double relative_alpha_ratio = 20.;
double relative_offset_ratio = 600.;
for(int i=1; i<argc; ++i)
{
if(!strcmp("-i", argv[i]) && i < argc_check) {
entry_name_ptr = argv[++i];
} else if(!strcmp("-a", argv[i]) && i < argc_check) {
relative_alpha_ratio = std::stod(argv[++i]);
} else if(!strcmp("-d", argv[i]) && i < argc_check) {
relative_offset_ratio = std::stod(argv[++i]);
}
}
if(argc < 3 || relative_alpha_ratio <= 0.)
return AW3i::INPUT_IS_INVALID;
Mesh input_mesh;
if(!PMP::IO::read_polygon_mesh(entry_name_ptr, input_mesh) ||
is_empty(input_mesh) ||
!is_triangle_mesh(input_mesh)
#ifndef CGAL_ALPHA_WRAP_3_TOLERATE_DEGENERACIES
|| AW3i::has_degenerated_faces(input_mesh)
#endif
)
{
return AW3i::INPUT_IS_INVALID;
}
const CGAL::Bbox_3 bbox = PMP::bbox(input_mesh);
const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) +
CGAL::square(bbox.ymax() - bbox.ymin()) +
CGAL::square(bbox.zmax() - bbox.zmin()));
const double alpha = diag_length / relative_alpha_ratio;
const double offset = diag_length / relative_offset_ratio;
Mesh wrap;
alpha_wrap_3(input_mesh, alpha, offset, wrap);
if(!is_triangle_mesh(wrap))
return AW3i::OUTPUT_IS_NOT_TRIANGLE_MESH;
if(!is_closed(wrap))
return AW3i::OUTPUT_HAS_BORDERS;
if(AW3i::has_degenerated_faces(wrap))
return AW3i::OUTPUT_HAS_DEGENERATED_FACES;
if(AW3i::is_combinatorially_non_manifold(wrap))
return AW3i::OUTPUT_IS_COMBINATORIAL_NON_MANIFOLD;
if(PMP::does_self_intersect(wrap))
return AW3i::OUTPUT_HAS_GEOMETRIC_SELF_INTERSECTIONS;
if(!PMP::does_bound_a_volume(wrap))
return AW3i::OUTPUT_DOES_NOT_BOUND_VOLUME;
if(!AW3i::is_outer_wrap_of_triangle_mesh(wrap, input_mesh))
return AW3i::OUTPUT_DOES_NOT_CONTAIN_INPUT;
if(!AW3i::has_expected_Hausdorff_distance(wrap, input_mesh, alpha, offset))
return AW3i::OUTPUT_DISTANCE_IS_TOO_LARGE;
return AW3i::VALID_SOLID_OUTPUT;
}

View File

@ -0,0 +1,86 @@
# Copyright (c) 2019-2023 Google LLC (USA).
# All rights reserved.
#
# This file is part of the 3D Alpha Wrapping package, which is being prepared for
# submission to CGAL (www.cgal.org).
#
# $URL$
# $Id$
# SPDX-License-Identifier: GPL-3.0-or-later
#
#
# Author(s) : Pierre Alliez
# Michael Hemmer
# Cedric Portaneri
# Mael Rouxel-Labbé
#
#!/bin/bash
# $1: directory containing the alpha wrap project
# $2: directory containing the output results
# $3: alpha value
# $4: timeout value in seconds
# $5: hash of the latest commit
# $6: the input file path
function compute_benchmark_data() {
filename=$(basename -- "$6")
filename="${filename%.*}"
python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Robustness/compute_robustness_benchmark_data.py \
-e $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/build-release/robustness_benchmark -i $6 -a $3 -t $4 \
> $2/Robustness/results/$5/$filename.log
python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/compute_performance_benchmark_data.py \
-e $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/build-release/performance_benchmark -i $6 -a $3 \
> $2/Performance/results/$5/$filename.log
python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/compute_quality_benchmark_data.py \
-e $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/build-release/quality_benchmark -i $6 -a $3 \
> $2/Quality/results/$5/$filename.log
}
export -f compute_benchmark_data
# $1: directory containing the alpha wrap project
# $2: directory containing the input data folder
# $3: directory containing the output results
# $4: alpha value
# $5: timeout value for robustness benchmark in seconds
# $6: number of virtual thread used
# $7: hash of the latest commit
# $8: hash of a commit to perform the diff with latest
cd $1
mkdir -p $3/Robustness/results/$7
mkdir -p $3/Performance/results/$7
mkdir -p $3/Quality/results/$7
mkdir -p $3/Robustness/charts_data
mkdir -p $3/Performance/charts_data
mkdir -p $3/Quality/charts_data
mkdir -p $3/Robustness/charts
mkdir -p $3/Performance/charts
mkdir -p $3/Quality/charts
mkdir -p $3/Robustness/log
mkdir -p $3/Performance/log
mkdir -p $3/Quality/log
mkdir -p $3/charts
find $2 -mindepth 1 | parallel -j$6 compute_benchmark_data $1 $3 $4 $5 $7 :::
python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Robustness/generate_robustness_benchmark_charts.py -i $3/Robustness/results/$7 -o $3/Robustness -a $4 -c $7
if [ -z "$8" ]; then
python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/generate_performance_benchmark_charts.py -i $3/Performance/results/$7 -o $3/Performance -a $4 -c $7;
else
python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/generate_performance_benchmark_charts.py -i $3/Performance/results/$7 -o $3/Performance -a $4 -c $7 -p $3/Performance/results/$8 -d $8;
fi
if [ -z "$8" ]; then
python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/generate_quality_benchmark_charts.py -i $3/Quality/results/$7 -o $3/Quality -a $4 -c $7;
else
python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/generate_quality_benchmark_charts.py -i $3/Quality/results/$7 -o $3/Quality -a $4 -c $7 -p $3/Quality/results/$8 -d $8;
fi
charts_path="$(ls "$3/Robustness/charts"/* -dArt | tail -n 1) $(ls "$3/Performance/charts"/* -dArt | tail -n 2) $(ls "$3/Quality/charts"/* -dArt | tail -n 9)"
pdfjam --nup 2x6 $charts_path --outfile $3/charts/results_$7_$8_alpha_$4_$(date '+%Y-%m-%d_%H:%M:%S').pdf

View File

@ -13,3 +13,5 @@ create_single_source_cgal_program("point_set_wrap.cpp")
create_single_source_cgal_program("wrap_from_cavity.cpp")
create_single_source_cgal_program("mixed_inputs_wrap.cpp")
create_single_source_cgal_program("volumetric_wrap.cpp")
create_single_source_cgal_program("successive_wraps.cpp")
create_single_source_cgal_program("pause_and_resume_wrapping.cpp")

View File

@ -103,10 +103,10 @@ int main(int argc, char** argv)
oracle.add_segment_soup(segments, CGAL::parameters::default_values());
oracle.add_point_set(ps_points, CGAL::parameters::default_values());
CGAL::Alpha_wraps_3::internal::Alpha_wrap_3<Oracle> aw3(oracle);
CGAL::Alpha_wraps_3::internal::Alpha_wrapper_3<Oracle> aw3(oracle);
Mesh output_mesh;
aw3(alpha, offset, output_mesh);
Mesh wrap;
aw3(alpha, offset, wrap);
t.stop();
std::cout << "Took " << t.time() << std::endl;
@ -120,10 +120,11 @@ int main(int argc, char** argv)
std::string ps_name = std::string(ps_filename);
ps_name = ps_name.substr(ps_name.find_last_of("/") + 1, ps_name.length() - 1);
ps_name = ps_name.substr(0, ps_name.find_last_of("."));
std::string output_name = ts_name + "_" + ss_name + "_" + ps_name + "_" + std::to_string(static_cast<int>(relative_alpha))
+ "_" + std::to_string(static_cast<int>(relative_offset)) + ".off";
std::string output_name = ts_name + "_" + ss_name + "_" + ps_name + "_"
+ std::to_string(static_cast<int>(relative_alpha)) + "_"
+ std::to_string(static_cast<int>(relative_offset)) + ".off";
std::cout << "Writing to " << output_name << std::endl;
CGAL::IO::write_polygon_mesh(output_name, output_mesh, CGAL::parameters::stream_precision(17));
CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17));
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,19 @@
#ifndef CGAL_ALPHA_WRAP_3_EXAMPLES_OUTPUT_HELPER_H
#define CGAL_ALPHA_WRAP_3_EXAMPLES_OUTPUT_HELPER_H
#include <string>
std::string generate_output_name(std::string input_name,
const double alpha,
const double offset)
{
input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1);
input_name = input_name.substr(0, input_name.find_last_of("."));
std::string output_name = input_name
+ "_" + std::to_string(static_cast<int>(alpha))
+ "_" + std::to_string(static_cast<int>(offset)) + ".off";
return output_name;
}
#endif // CGAL_ALPHA_WRAP_3_EXAMPLES_OUTPUT_HELPER_H

View File

@ -0,0 +1,164 @@
// This example demonstrates how to interrupt the wrapping process before it has terminated,
// and how to resume afterwards.
//
// -------------------------------- !! Warning !! --------------------------------------------------
// By default, the wrapper uses an unsorted LIFO queue of faces to refine. This means that
// the intermediate result is not very useful because the algorithm carves deep and not wide
// (somewhat like a DFS vs a BFS).
//
// The sorted queue option is enabled with the macro below to make the refinement algorithm
// more uniform. The downside is that it is slower.
// -------------------------------------------------------------------------------------------------
#define CGAL_AW3_USE_SORTED_PRIORITY_QUEUE
#include "output_helper.h"
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/alpha_wrap_3.h>
#include <CGAL/IO/polygon_soup_io.h>
#include <CGAL/Polygon_mesh_processing/measure.h>
#include <CGAL/Random.h>
#include <CGAL/Timer.h>
#include <iostream>
#include <string>
namespace AW3 = CGAL::Alpha_wraps_3;
namespace PMP = CGAL::Polygon_mesh_processing;
using K = CGAL::Exact_predicates_inexact_constructions_kernel;
using Point_3 = K::Point_3;
using Points = std::vector<Point_3>;
using Face = std::array<std::size_t, 3>;
using Faces = std::vector<Face>;
using Mesh = CGAL::Surface_mesh<Point_3>;
using face_descriptor = boost::graph_traits<Mesh>::face_descriptor;
struct Interrupter_visitor
: public AW3::internal::Wrapping_default_visitor
{
using Base = AW3::internal::Wrapping_default_visitor;
CGAL::Real_timer timer;
double max_time = -1; // in seconds
public:
void set_max_time(double t) { max_time = t; }
public:
template <typename AlphaWrapper>
void on_flood_fill_begin(const AlphaWrapper&)
{
std::cout << "Starting timer..." << std::endl;
timer.start();
}
template <typename Wrapper>
bool go_further(const Wrapper&)
{
if(timer.time() > max_time)
{
timer.stop();
std::cout << "Paused after " << timer.time() << " s." << std::endl;
return false;
}
return true;
}
};
int main(int argc, char** argv)
{
std::cout.precision(17);
std::cerr.precision(17);
CGAL::Random rng;
std::cout << "Random seed = " << rng.get_seed() << std::endl;
const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/armadillo.off");
// = read the soup
Points points;
Faces faces;
if(!CGAL::IO::read_polygon_soup(filename, points, faces) || faces.empty())
{
std::cerr << "Invalid soup input: " << filename << std::endl;
return EXIT_FAILURE;
}
std::cout << "Input: " << points.size() << " points, " << faces.size() << " faces" << std::endl;
// Compute the alpha and offset values
const double relative_alpha = (argc > 2) ? std::stod(argv[2]) : rng.get_double(150., 200.);
const double relative_offset = (argc > 3) ? std::stod(argv[3]) : 600.;
std::cout << "relative_alpha = " << relative_alpha << std::endl;
CGAL::Bbox_3 bbox;
for(const Point_3& p : points)
bbox += p.bbox();
const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) +
CGAL::square(bbox.ymax() - bbox.ymin()) +
CGAL::square(bbox.zmax() - bbox.zmin()));
const double alpha = diag_length / relative_alpha;
const double offset = diag_length / relative_offset;
// Build the wrapper
using Oracle = CGAL::Alpha_wraps_3::internal::Triangle_soup_oracle<K>;
Oracle oracle(alpha);
oracle.add_triangle_soup(points, faces, CGAL::parameters::default_values());
CGAL::Alpha_wraps_3::internal::Alpha_wrapper_3<Oracle> aw3(oracle);
// --- Launch the wrapping, and pause when the algorithm has spent 1s flooding
Interrupter_visitor interrupter;
interrupter.set_max_time(1.);
Mesh wrap;
aw3(alpha, offset, wrap, CGAL::parameters::visitor(interrupter));
std::cout << ">>> The current wrap has " << num_vertices(wrap) << " vertices" << std::endl;
CGAL::IO::write_polygon_mesh("stopped_1.off", wrap, CGAL::parameters::stream_precision(17));
// --- Restart from the previous state, and pause a bit further
interrupter.set_max_time(2.);
aw3(alpha, offset, wrap, CGAL::parameters::visitor(interrupter)
.refine_triangulation(true));
std::cout << ">>> The current wrap has " << num_vertices(wrap) << " vertices" << std::endl;
CGAL::IO::write_polygon_mesh("stopped_2.off", wrap, CGAL::parameters::stream_precision(17));
// --- Restart from the previous state, and let it finish
aw3(alpha, offset, wrap, CGAL::parameters::refine_triangulation(true));
std::cout << ">>> The final (resumed) wrap has " << num_vertices(wrap) << " vertices" << std::endl;
std::string output_name = generate_output_name(filename, relative_alpha, relative_offset);
std::cout << "Writing to " << "resumed_" + output_name << std::endl;
CGAL::IO::write_polygon_mesh("resumed_" + output_name, wrap, CGAL::parameters::stream_precision(17));
// --- Get the final wrap, in one go:
Mesh single_pass_wrap;
CGAL::alpha_wrap_3(points, faces, alpha, offset, single_pass_wrap);
std::cout << ">>> The final (from scratch) wrap has " << num_vertices(single_pass_wrap) << " vertices" << std::endl;
output_name = generate_output_name(filename, relative_alpha, relative_offset);
std::cout << "Writing to " << output_name << std::endl;
CGAL::IO::write_polygon_mesh(output_name, single_pass_wrap, CGAL::parameters::stream_precision(17));
// --- Compare the results to ensure both approaches yield identical meshes
std::vector<std::pair<face_descriptor, face_descriptor> > common;
std::vector<face_descriptor> m1_only;
std::vector<face_descriptor> m2_only;
PMP::match_faces(wrap, single_pass_wrap,
std::back_inserter(common),
std::back_inserter(m1_only),
std::back_inserter(m2_only));
if(!m1_only.empty() || !m2_only.empty())
{
std::cerr << "Error: The two wraps should have been identical!" << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

View File

@ -1,3 +1,5 @@
#include "output_helper.h"
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
@ -23,7 +25,7 @@ int main(int argc, char** argv)
Point_container points;
if(!CGAL::IO::read_points(filename, std::back_inserter(points)) || points.empty())
{
std::cerr << "Invalid input." << std::endl;
std::cerr << "Invalid input:" << filename << std::endl;
return EXIT_FAILURE;
}
@ -53,11 +55,7 @@ int main(int argc, char** argv)
std::cout << "Took " << t.time() << " s." << std::endl;
// Save the result
std::string input_name = std::string(filename);
input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1);
input_name = input_name.substr(0, input_name.find_last_of("."));
std::string output_name = input_name + "_" + std::to_string(static_cast<int>(relative_alpha))
+ "_" + std::to_string(static_cast<int>(relative_offset)) + ".off";
const std::string output_name = generate_output_name(filename, relative_alpha, relative_offset);
std::cout << "Writing to " << output_name << std::endl;
CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17));

View File

@ -0,0 +1,135 @@
// In this example, we reuse the underlying triangulation of the previous state, and carve using
// a new (smaller) alpha value. This enables considerable speed-up: the cumulated time taken
// to run `n` successive instances of `{alpha_wrap(alpha_i)}_(i=1...n)` will be roughly equal
// to the time taken to the single instance of alpha_wrap(alpha_n) from scratch.
//
// The speed-up increases with the number of intermediate results, and on the gap between
// alpha values: if alpha_2 is close to alpha_1, practically no new computation are required,
// and the speed-up is almost 100%.
//
// -------------------------------- !! Warning !! --------------------------------------------------
// The result of:
// > alpha_wrap(alpha_1, ...)
// > alpha_wrap(alpha_2, ..., reuse)
// is not exactly identical to calling directly:
// > alpha_wrap(alpha_2, ..., do_not_reuse)
// because the queues are sorted slightly differently and the AABB tree is rebuilt differently
// to optimize the runtime.
// -------------------------------------------------------------------------------------------------
#include "output_helper.h"
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/alpha_wrap_3.h>
#include <CGAL/Polygon_mesh_processing/bbox.h>
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
#include <CGAL/Real_timer.h>
#include <iostream>
#include <string>
namespace PMP = CGAL::Polygon_mesh_processing;
using K = CGAL::Exact_predicates_inexact_constructions_kernel;
using FT = K::FT;
using Point_3 = K::Point_3;
using Mesh = CGAL::Surface_mesh<Point_3>;
int main(int argc, char** argv)
{
std::cout.precision(17);
std::cerr.precision(17);
// Read the input
const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/cube.off");
std::cout << "Reading " << filename << "..." << std::endl;
Mesh mesh;
if(!PMP::IO::read_polygon_mesh(filename, mesh) || is_empty(mesh) || !is_triangle_mesh(mesh))
{
std::cerr << "Invalid input:" << filename << std::endl;
return EXIT_FAILURE;
}
std::cout << "Input: " << num_vertices(mesh) << " vertices, " << num_faces(mesh) << " faces" << std::endl;
const CGAL::Bbox_3 bbox = CGAL::Polygon_mesh_processing::bbox(mesh);
const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) +
CGAL::square(bbox.ymax() - bbox.ymin()) +
CGAL::square(bbox.zmax() - bbox.zmin()));
// We want decreasing alphas, and these are relative ratios, so they need to be increasing
const std::vector<FT> relative_alphas = { 1, 50, 100, 150, 200, 250 };
const FT relative_offset = 600;
// ===============================================================================================
// Naive approach:
CGAL::Real_timer t;
double total_time = 0.;
for(std::size_t i=0; i<relative_alphas.size(); ++i)
{
t.reset();
t.start();
const double alpha = diag_length / relative_alphas[i];
const double offset = diag_length / relative_offset;
std::cout << ">>> [" << i << "] alpha: " << alpha << " offset: " << offset << std::endl;
Mesh wrap;
CGAL::alpha_wrap_3(mesh, alpha, offset, wrap);
t.stop();
std::cout << " Result: " << num_vertices(wrap) << " vertices, " << num_faces(wrap) << " faces" << std::endl;
std::cout << " Elapsed time: " << t.time() << " s." << std::endl;
total_time += t.time();
}
std::cout << "Total elapsed time (naive): " << total_time << " s.\n" << std::endl;
// ===============================================================================================
// Re-use approach
total_time = 0.;
t.reset();
using Oracle = CGAL::Alpha_wraps_3::internal::Triangle_mesh_oracle<K>;
using Wrapper = CGAL::Alpha_wraps_3::internal::Alpha_wrapper_3<Oracle>;
Wrapper wrapper; // contains the triangulation that is being refined iteratively
for(std::size_t i=0; i<relative_alphas.size(); ++i)
{
t.reset();
t.start();
const double alpha = diag_length / relative_alphas[i];
const double offset = diag_length / relative_offset;
std::cout << ">>> [" << i << "] alpha: " << alpha << " offset: " << offset << std::endl;
// The triangle mesh oracle should be initialized with alpha to internally perform a split
// of too-big facets while building the AABB Tree. This split in fact yields a significant
// speed-up for meshes with elements that are large compared to alpha. This speed-up makes it
// faster to re-build the AABB tree for every value of alpha than to use a non-optimized tree.
Oracle oracle(alpha);
oracle.add_triangle_mesh(mesh, CGAL::parameters::default_values());
wrapper.oracle() = oracle;
Mesh wrap;
wrapper(alpha, offset, wrap, CGAL::parameters::refine_triangulation((i != 0)));
t.stop();
std::cout << " Result: " << num_vertices(wrap) << " vertices, " << num_faces(wrap) << " faces" << std::endl;
std::cout << " Elapsed time: " << t.time() << " s." << std::endl;
total_time += t.time();
}
std::cout << "Total elapsed time (successive): " << total_time << " s." << std::endl;
return EXIT_SUCCESS;
}

View File

@ -1,3 +1,5 @@
#include "output_helper.h"
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
@ -25,7 +27,7 @@ int main(int argc, char** argv)
Mesh mesh;
if(!PMP::IO::read_polygon_mesh(filename, mesh) || is_empty(mesh) || !is_triangle_mesh(mesh))
{
std::cerr << "Invalid input." << std::endl;
std::cerr << "Invalid input:" << filename << std::endl;
return EXIT_FAILURE;
}
@ -56,12 +58,7 @@ int main(int argc, char** argv)
std::cout << "Took " << t.time() << " s." << std::endl;
// Save the result
std::string input_name = std::string(filename);
input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1);
input_name = input_name.substr(0, input_name.find_last_of("."));
std::string output_name = input_name
+ "_" + std::to_string(static_cast<int>(relative_alpha))
+ "_" + std::to_string(static_cast<int>(relative_offset)) + ".off";
const std::string output_name = generate_output_name(filename, relative_alpha, relative_offset);
std::cout << "Writing to " << output_name << std::endl;
CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17));

View File

@ -1,3 +1,5 @@
#include "output_helper.h"
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
@ -30,7 +32,7 @@ int main(int argc, char** argv)
std::vector<std::array<std::size_t, 3> > faces;
if(!CGAL::IO::read_polygon_soup(filename, points, faces) || faces.empty())
{
std::cerr << "Invalid input." << std::endl;
std::cerr << "Invalid input:" << filename << std::endl;
return EXIT_FAILURE;
}
@ -63,12 +65,7 @@ int main(int argc, char** argv)
std::cout << "Took " << t.time() << " s." << std::endl;
// Save the result
std::string input_name = std::string(filename);
input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1);
input_name = input_name.substr(0, input_name.find_last_of("."));
std::string output_name = input_name
+ "_" + std::to_string(static_cast<int>(relative_alpha))
+ "_" + std::to_string(static_cast<int>(relative_offset)) + ".off";
const std::string output_name = generate_output_name(filename, relative_alpha, relative_offset);
std::cout << "Writing to " << output_name << std::endl;
CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17));

View File

@ -1,3 +1,5 @@
#include "output_helper.h"
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
@ -70,7 +72,7 @@ int main(int argc, char** argv)
Faces faces;
if(!CGAL::IO::read_polygon_soup(filename, points, faces) || faces.empty())
{
std::cerr << "Invalid input." << std::endl;
std::cerr << "Invalid input:" << filename << std::endl;
return EXIT_FAILURE;
}
@ -101,7 +103,7 @@ int main(int argc, char** argv)
Oracle oracle(K{});
oracle.add_triangle_soup(points, faces, CGAL::parameters::default_values());
CGAL::Alpha_wraps_3::internal::Alpha_wrap_3<Oracle, Delaunay_triangulation> aw3(oracle);
CGAL::Alpha_wraps_3::internal::Alpha_wrapper_3<Oracle, Delaunay_triangulation> aw3(oracle);
Mesh wrap;
aw3(alpha, offset, wrap);
@ -113,12 +115,7 @@ int main(int argc, char** argv)
auto dt = aw3.triangulation();
// Save the result
std::string input_name = std::string(filename);
input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1);
input_name = input_name.substr(0, input_name.find_last_of("."));
std::string output_name = input_name
+ "_" + std::to_string(static_cast<int>(relative_alpha))
+ "_" + std::to_string(static_cast<int>(relative_offset)) + ".off";
const std::string output_name = generate_output_name(filename, relative_alpha, relative_offset);
std::cout << "Writing to " << output_name << std::endl;
CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17));

View File

@ -1,3 +1,5 @@
#include "output_helper.h"
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
@ -25,13 +27,13 @@ int main(int argc, char** argv)
if(!PMP::IO::read_polygon_mesh(filename, input) ||
is_empty(input) || !is_triangle_mesh(input))
{
std::cerr << "Invalid input." << std::endl;
std::cerr << "Invalid input:" << filename << std::endl;
return EXIT_FAILURE;
}
std::cout << "Input: " << num_vertices(input) << " vertices, " << num_faces(input) << " faces" << std::endl;
const double relative_alpha = (argc > 2) ? std::stod(argv[2]) : 30.;
const double relative_alpha = (argc > 2) ? std::stod(argv[2]) : 40.;
const double relative_offset = (argc > 3) ? std::stod(argv[3]) : 600.;
// Compute the alpha and offset values

View File

@ -20,18 +20,26 @@ namespace CGAL {
namespace Alpha_wraps_3 {
namespace internal {
enum class Cell_label
{
// Cells that have been carved
OUTSIDE,
// Cells that have not yet been carved
INSIDE,
// OUTSIDE cells that have been labeled "inside" again as to make the result manifold
MANIFOLD
};
template < typename GT,
typename Cb = CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3<GT> >
class Alpha_wrap_triangulation_cell_base_3
: public Cb
{
private:
bool outside = false;
public:
typedef typename Cb::Vertex_handle Vertex_handle;
typedef typename Cb::Cell_handle Cell_handle;
public:
template < typename TDS2 >
struct Rebind_TDS
{
@ -39,6 +47,14 @@ public:
using Other = Alpha_wrap_triangulation_cell_base_3<GT, Cb2>;
};
private:
Cell_label m_label = Cell_label::INSIDE;
#ifndef CGAL_AW3_USE_SORTED_PRIORITY_QUEUE
unsigned int m_erase_counter;
#endif
public:
Alpha_wrap_triangulation_cell_base_3()
: Cb()
{}
@ -55,8 +71,26 @@ public:
: Cb(v0, v1, v2, v3, n0, n1, n2, n3)
{}
bool is_outside() const { return outside; }
bool& is_outside() { return outside; }
public:
Cell_label label() const { return m_label; }
void set_label(const Cell_label label) { m_label = label; }
bool is_inside() const { return m_label == Cell_label::INSIDE; }
bool is_outside() const { return m_label == Cell_label::OUTSIDE; }
#ifndef CGAL_AW3_USE_SORTED_PRIORITY_QUEUE
unsigned int erase_counter() const
{
return m_erase_counter;
}
void set_erase_counter(unsigned int c)
{
m_erase_counter = c;
}
void increment_erase_counter()
{
++m_erase_counter;
}
#endif
};
template <typename Cb>

View File

@ -321,7 +321,6 @@ public:
typename AABB_tree::Bounding_box bbox() const
{
CGAL_precondition(!empty());
return tree().bbox();
}

View File

@ -28,6 +28,7 @@
#include <iostream>
#include <iterator>
#include <functional>
#include <memory>
#include <vector>
namespace CGAL {
@ -41,6 +42,7 @@ struct PS_oracle_traits
using Geom_traits = Alpha_wrap_AABB_geom_traits<GT_>; // Wrap the kernel to add Ball_3 + custom Do_intersect_3
using Points = std::vector<typename GT_::Point_3>;
using Points_ptr = std::shared_ptr<Points>;
using PR_iterator = typename Points::const_iterator;
using Primitive = AABB_primitive<PR_iterator,
@ -69,26 +71,29 @@ public:
private:
using Points = typename PSOT::Points;
using Points_ptr = typename PSOT::Points_ptr;
using AABB_tree = typename PSOT::AABB_tree;
using Oracle_base = AABB_tree_oracle<Geom_traits, AABB_tree, CGAL::Default, BaseOracle>;
private:
Points m_points;
Points_ptr m_points_ptr;
public:
// Constructors
Point_set_oracle()
: Oracle_base(BaseOracle(), Base_GT())
{ }
Point_set_oracle(const BaseOracle& base_oracle,
const Base_GT& gt = Base_GT())
: Oracle_base(base_oracle, gt)
{ }
{
m_points_ptr = std::make_shared<Points>();
}
Point_set_oracle(const Base_GT& gt,
const BaseOracle& base_oracle = BaseOracle())
: Oracle_base(base_oracle, gt)
: Point_set_oracle(base_oracle, gt)
{ }
Point_set_oracle()
: Point_set_oracle(BaseOracle(), Base_GT())
{ }
public:
@ -101,21 +106,27 @@ public:
if(points.empty())
{
#ifdef CGAL_AW3_DEBUG
std::cout << "Warning: Input is empty " << std::endl;
std::cout << "Warning: Input is empty (PS)" << std::endl;
#endif
return;
}
const std::size_t old_size = m_points.size();
m_points.insert(std::cend(m_points), std::cbegin(points), std::cend(points));
const std::size_t old_size = m_points_ptr->size();
m_points_ptr->insert(std::cend(*m_points_ptr), std::cbegin(points), std::cend(points));
#ifdef CGAL_AW3_DEBUG
std::cout << "Insert into AABB tree (points)..." << std::endl;
#endif
this->tree().insert(std::next(std::cbegin(m_points), old_size), std::cend(m_points));
this->tree().insert(std::next(std::cbegin(*m_points_ptr), old_size), std::cend(*m_points_ptr));
CGAL_postcondition(this->tree().size() == m_points.size());
// Manually constructing it here purely for profiling reasons: if we keep the lazy approach,
// it will be done at the first treatment of a facet that needs a Steiner point.
// So if one wanted to bench the flood fill runtime, it would be skewed by the time it takes
// to accelerate the tree.
this->tree().accelerate_distance_queries();
CGAL_postcondition(this->tree().size() == m_points_ptr->size());
}
};

View File

@ -28,6 +28,7 @@
#include <iostream>
#include <iterator>
#include <functional>
#include <memory>
#include <vector>
namespace CGAL {
@ -40,7 +41,9 @@ struct SS_oracle_traits
{
using Geom_traits = Alpha_wrap_AABB_geom_traits<GT_>; // Wrap the kernel to add Ball_3 + custom Do_intersect_3
using Segments = std::vector<typename GT_::Segment_3>;
using Segment = typename GT_::Segment_3;
using Segments = std::vector<Segment>;
using Segments_ptr = std::shared_ptr<Segments>;
using SR_iterator = typename Segments::const_iterator;
using Primitive = AABB_primitive<SR_iterator,
@ -68,27 +71,31 @@ public:
using Geom_traits = typename SSOT::Geom_traits;
private:
using Segment = typename SSOT::Segment;
using Segments = typename SSOT::Segments;
using Segments_ptr = typename SSOT::Segments_ptr;
using AABB_tree = typename SSOT::AABB_tree;
using Oracle_base = AABB_tree_oracle<Geom_traits, AABB_tree, CGAL::Default, BaseOracle>;
private:
Segments m_segments;
Segments_ptr m_segments_ptr;
public:
// Constructors
Segment_soup_oracle()
: Oracle_base(BaseOracle(), Base_GT())
{ }
Segment_soup_oracle(const BaseOracle& base_oracle,
const Base_GT& gt = Base_GT())
: Oracle_base(base_oracle, gt)
{ }
{
m_segments_ptr = std::make_shared<Segments>();
}
Segment_soup_oracle(const Base_GT& gt,
const BaseOracle& base_oracle = BaseOracle())
: Oracle_base(base_oracle, gt)
: Segment_soup_oracle(base_oracle, gt)
{ }
Segment_soup_oracle()
: Segment_soup_oracle(BaseOracle(), Base_GT())
{ }
public:
@ -100,20 +107,40 @@ public:
if(segments.empty())
{
#ifdef CGAL_AW3_DEBUG
std::cout << "Warning: Input is empty " << std::endl;
std::cout << "Warning: Input is empty (SS)" << std::endl;
#endif
return;
}
const std::size_t old_size = m_segments.size();
m_segments.insert(std::cend(m_segments), std::cbegin(segments), std::cend(segments));
typename Geom_traits::Is_degenerate_3 is_degenerate = this->geom_traits().is_degenerate_3_object();
const std::size_t old_size = m_segments_ptr->size();
for(const Segment& s : segments)
{
if(is_degenerate(s))
{
#ifdef CGAL_AW3_DEBUG
std::cerr << "Warning: ignoring degenerate segment " << s << std::endl;
#endif
continue;
}
m_segments_ptr->push_back(s);
}
#ifdef CGAL_AW3_DEBUG
std::cout << "Insert into AABB tree (segments)..." << std::endl;
#endif
this->tree().insert(std::next(std::cbegin(m_segments), old_size), std::cend(m_segments));
this->tree().insert(std::next(std::cbegin(*m_segments_ptr), old_size), std::cend(*m_segments_ptr));
CGAL_postcondition(this->tree().size() == m_segments.size());
// Manually constructing it here purely for profiling reasons: if we keep the lazy approach,
// it will be done at the first treatment of a facet that needs a Steiner point.
// So if one wanted to bench the flood fill runtime, it would be skewed by the time it takes
// to accelerate the tree.
this->tree().accelerate_distance_queries();
CGAL_postcondition(this->tree().size() == m_segments_ptr->size());
}
};

View File

@ -135,7 +135,7 @@ public:
if(is_empty(tmesh))
{
#ifdef CGAL_AW3_DEBUG
std::cout << "Warning: Input is empty " << std::endl;
std::cout << "Warning: Input is empty (TM)" << std::endl;
#endif
return;
}
@ -153,7 +153,12 @@ public:
for(face_descriptor f : faces(tmesh))
{
if(Polygon_mesh_processing::is_degenerate_triangle_face(f, tmesh, np))
{
#ifdef CGAL_AW3_DEBUG
std::cerr << "Warning: ignoring degenerate face " << f << std::endl;
#endif
continue;
}
const Point_ref p0 = get(vpm, source(halfedge(f, tmesh), tmesh));
const Point_ref p1 = get(vpm, target(halfedge(f, tmesh), tmesh));
@ -164,6 +169,12 @@ public:
Splitter_base::split_and_insert_datum(tr, this->tree(), this->geom_traits());
}
// Manually constructing it here purely for profiling reasons: if we keep the lazy approach,
// it will be done at the first treatment of a facet that needs a Steiner point.
// So if one wanted to bench the flood fill runtime, it would be skewed by the time it takes
// to accelerate the tree.
this->tree().accelerate_distance_queries();
#ifdef CGAL_AW3_DEBUG
std::cout << "Tree: " << this->tree().size() << " primitives (" << num_faces(tmesh) << " faces in input)" << std::endl;
#endif

View File

@ -133,7 +133,7 @@ public:
if(points.empty() || faces.empty())
{
#ifdef CGAL_AW3_DEBUG
std::cout << "Warning: Input is empty " << std::endl;
std::cout << "Warning: Input is empty (TS)" << std::endl;
#endif
return;
}
@ -164,11 +164,22 @@ public:
const Triangle_3 tr = triangle(p0, p1, p2);
if(is_degenerate(tr))
{
#ifdef CGAL_AW3_DEBUG
std::cerr << "Warning: ignoring degenerate face " << tr << std::endl;
#endif
continue;
}
Splitter_base::split_and_insert_datum(tr, this->tree(), this->geom_traits());
}
// Manually constructing it here purely for profiling reasons: if we keep the lazy approach,
// it will be done at the first treatment of a facet that needs a Steiner point.
// So if one wanted to bench the flood fill runtime, it would be skewed by the time it takes
// to accelerate the tree.
this->tree().accelerate_distance_queries();
#ifdef CGAL_AW3_DEBUG
std::cout << "Tree: " << this->tree().size() << " primitives (" << faces.size() << " faces in input)" << std::endl;
#endif
@ -179,12 +190,31 @@ public:
void add_triangle_soup(const TriangleRange& triangles,
const CGAL_NP_CLASS& /*np*/ = CGAL::parameters::default_values())
{
if(triangles.empty())
{
#ifdef CGAL_AW3_DEBUG
std::cout << "Warning: Input is empty (TS)" << std::endl;
#endif
return;
}
#ifdef CGAL_AW3_DEBUG
std::cout << "Insert into AABB Tree (triangles)..." << std::endl;
#endif
typename Geom_traits::Is_degenerate_3 is_degenerate = this->geom_traits().is_degenerate_3_object();
Splitter_base::reserve(triangles.size());
for(const Triangle_3& tr : triangles)
{
if(is_degenerate(tr))
{
#ifdef CGAL_AW3_DEBUG
std::cerr << "Warning: ignoring degenerate triangle " << tr << std::endl;
#endif
continue;
}
Splitter_base::split_and_insert_datum(tr, this->tree(), this->geom_traits());
}

View File

@ -27,27 +27,29 @@ namespace CGAL {
namespace Alpha_wraps_3 {
namespace internal {
#ifdef CGAL_AW3_USE_SORTED_PRIORITY_QUEUE
// Represents an alpha-traversable facet in the mutable priority queue
template <typename DT3>
template <typename Tr>
class Gate
{
using Facet = typename DT3::Facet;
using FT = typename DT3::Geom_traits::FT;
using Facet = typename Tr::Facet;
using FT = typename Tr::Geom_traits::FT;
private:
Facet m_facet;
FT m_priority; // circumsphere sq_radius
bool m_is_artificial_facet;
bool m_is_permissive_facet;
public:
// Constructors
Gate(const Facet& facet,
const FT& priority,
const bool is_artificial_facet)
const bool is_permissive_facet)
:
m_facet(facet),
m_priority(priority),
m_is_artificial_facet(is_artificial_facet)
m_is_permissive_facet(is_permissive_facet)
{
CGAL_assertion(priority >= 0);
}
@ -60,34 +62,85 @@ public:
public:
const Facet& facet() const { return m_facet; }
const FT& priority() const { return m_priority; }
bool is_artificial_facet() const { return m_is_artificial_facet; }
bool is_permissive_facet() const { return m_is_permissive_facet; }
};
struct Less_gate
{
template <typename DT3>
bool operator()(const Gate<DT3>& a, const Gate<DT3>& b) const
template <typename Tr>
bool operator()(const Gate<Tr>& a, const Gate<Tr>& b) const
{
// @fixme? make it a total order by comparing addresses if both gates are bbox facets
if(a.is_artificial_facet())
return true;
else if(b.is_artificial_facet())
return false;
// If one is permissive and the other is not, give priority to the permissive facet.
//
// The permissive facet are given highest priority because they need to be treated
// regardless of their circumradius. Treating them first allow the part that depends
// on alpha to be treated uniformly in a way: whatever the alpha, all permissive faces
// will first be treated.
if(a.is_permissive_facet() != b.is_permissive_facet())
return a.is_permissive_facet();
if(a.priority() == b.priority())
{
// arbitrary, the sole purpose is to make it a total order for determinism
if(a.facet().first->time_stamp() == b.facet().first->time_stamp())
return a.facet().second < b.facet().second;
return a.facet().first->time_stamp() < b.facet().first->time_stamp();
}
return a.priority() > b.priority();
}
};
template <typename DT3>
#else // CGAL_AW3_USE_SORTED_PRIORITY_QUEUE
// Represents an alpha-traversable facet in the mutable priority queue
template <typename Tr>
class Gate
{
using Facet = typename Tr::Facet;
using FT = typename Tr::Geom_traits::FT;
private:
Facet m_facet, m_mirror_facet;
const unsigned int m_erase_counter_mem;
const unsigned int m_mirror_erase_counter_mem;
public:
// Constructors
Gate(const Facet& facet,
const Tr& tr)
:
m_facet(facet),
m_mirror_facet(tr.mirror_facet(facet)),
m_erase_counter_mem(m_facet.first->erase_counter()),
m_mirror_erase_counter_mem(m_mirror_facet.first->erase_counter())
{
}
public:
const Facet& facet() const { return m_facet; }
bool is_zombie() const
{
return (m_facet.first->erase_counter() != m_erase_counter_mem) ||
(m_mirror_facet.first->erase_counter() != m_mirror_erase_counter_mem);
}
};
#endif // CGAL_AW3_USE_SORTED_PRIORITY_QUEUE
template <typename Tr>
struct Gate_ID_PM
{
using key_type = Gate<DT3>;
using key_type = Gate<Tr>;
using value_type = std::size_t;
using reference = std::size_t;
using category = boost::readable_property_map_tag;
inline friend value_type get(Gate_ID_PM, const key_type& k)
{
using Facet = typename DT3::Facet;
using Facet = typename Tr::Facet;
const Facet& f = k.facet();
return (4 * f.first->time_stamp() + f.second);

View File

@ -40,16 +40,16 @@ struct Orientation_of_circumcenter
}
};
template <typename Dt>
template <typename Tr>
bool
less_squared_radius_of_min_empty_sphere(typename Dt::Geom_traits::FT sq_alpha,
const typename Dt::Facet& fh,
const Dt& dt)
less_squared_radius_of_min_empty_sphere(typename Tr::Geom_traits::FT sq_alpha,
const typename Tr::Facet& fh,
const Tr& tr)
{
using Cell_handle = typename Dt::Cell_handle;
using Point = typename Dt::Point;
using Cell_handle = typename Tr::Cell_handle;
using Point = typename Tr::Point;
using CK = typename Dt::Geom_traits;
using CK = typename Tr::Geom_traits;
using Exact_kernel = typename Exact_kernel_selector<CK>::Exact_kernel;
using Approximate_kernel = Simple_cartesian<Interval_nt_advanced>;
using C2A = Cartesian_converter<CK, Approximate_kernel>;
@ -61,21 +61,30 @@ less_squared_radius_of_min_empty_sphere(typename Dt::Geom_traits::FT sq_alpha,
Orientation_of_circumcenter orientation_of_circumcenter;
#ifdef CGAL_AW3_DEBUG_TRAVERSABILITY
std::cout << "Checking for traversability of facet" << std::endl;
#endif
const Cell_handle c = fh.first;
const int ic = fh.second;
const Cell_handle n = c->neighbor(ic);
const Point& p1 = dt.point(c, Dt::vertex_triple_index(ic,0));
const Point& p2 = dt.point(c, Dt::vertex_triple_index(ic,1));
const Point& p3 = dt.point(c, Dt::vertex_triple_index(ic,2));
const Point& p1 = tr.point(c, Tr::vertex_triple_index(ic,0));
const Point& p2 = tr.point(c, Tr::vertex_triple_index(ic,1));
const Point& p3 = tr.point(c, Tr::vertex_triple_index(ic,2));
// This is not actually possible in the context of alpha wrapping, but keeping it for genericity
// and because it does not cost anything.
if(dt.is_infinite(n))
if(tr.is_infinite(n))
{
#ifdef CGAL_AW3_DEBUG_TRAVERSABILITY
std::cerr << "Warning: computing less_squared_radius_of_min_empty_sphere() with an infinite neighbor?" << std::endl;
#endif
CGAL_assertion(!tr.is_infinite(c));
Orientation ori = orientation_of_circumcenter(p1, p2, p3,
dt.point(c, 0), dt.point(c, 1),
dt.point(c, 2), dt.point(c, 3));
tr.point(c, 0), tr.point(c, 1),
tr.point(c, 2), tr.point(c, 3));
if(ori == POSITIVE)
{
@ -84,18 +93,22 @@ less_squared_radius_of_min_empty_sphere(typename Dt::Geom_traits::FT sq_alpha,
}
else
{
Comparison_result cr = compare_squared_radius(dt.point(c, 0), dt.point(c, 1),
dt.point(c, 2), dt.point(c, 3),
Comparison_result cr = compare_squared_radius(tr.point(c, 0), tr.point(c, 1),
tr.point(c, 2), tr.point(c, 3),
sq_alpha);
return cr == LARGER;
}
}
if(dt.is_infinite(c))
if(tr.is_infinite(c))
{
Orientation ori = orientation_of_circumcenter(p1, p2, p3,
dt.point(n, 0), dt.point(n, 1),
dt.point(n, 2), dt.point(n, 3));
tr.point(n, 0), tr.point(n, 1),
tr.point(n, 2), tr.point(n, 3));
#ifdef CGAL_AW3_DEBUG_TRAVERSABILITY
std::cout << "Cell 'c' is infinite; Orientation: " << ori << std::endl;
#endif
if(ori == NEGATIVE)
{
@ -104,8 +117,8 @@ less_squared_radius_of_min_empty_sphere(typename Dt::Geom_traits::FT sq_alpha,
}
else
{
Comparison_result cr = compare_squared_radius(dt.point(n, 0), dt.point(n, 1),
dt.point(n, 2), dt.point(n, 3),
Comparison_result cr = compare_squared_radius(tr.point(n, 0), tr.point(n, 1),
tr.point(n, 2), tr.point(n, 3),
sq_alpha);
return cr == LARGER;
}
@ -113,40 +126,40 @@ less_squared_radius_of_min_empty_sphere(typename Dt::Geom_traits::FT sq_alpha,
// both c and n are finite
if(orientation_of_circumcenter(p1, p2, p3,
dt.point(c, 0), dt.point(c, 1), dt.point(c, 2), dt.point(c, 3)) !=
tr.point(c, 0), tr.point(c, 1), tr.point(c, 2), tr.point(c, 3)) !=
orientation_of_circumcenter(p1, p2, p3,
dt.point(n, 0), dt.point(n, 1), dt.point(n, 2), dt.point(n, 3)))
tr.point(n, 0), tr.point(n, 1), tr.point(n, 2), tr.point(n, 3)))
{
Comparison_result cr = compare_squared_radius(p1, p2, p3, sq_alpha);
#ifdef CGAL_AW3_DEBUG_TRAVERSABILITY
std::cout << "dual crosses the face; CR: "
<< typename Dt::Geom_traits().compute_squared_radius_3_object()(p1, p2, p3)
<< typename Tr::Geom_traits().compute_squared_radius_3_object()(p1, p2, p3)
<< " sq alpha " << sq_alpha << std::endl;
#endif
return cr == LARGER;
}
else
{
Comparison_result cr = compare_squared_radius(dt.point(c, 0), dt.point(c, 1),
dt.point(c, 2), dt.point(c, 3),
Comparison_result cr = compare_squared_radius(tr.point(c, 0), tr.point(c, 1),
tr.point(c, 2), tr.point(c, 3),
sq_alpha);
#ifdef CGAL_AW3_DEBUG_TRAVERSABILITY
std::cout << "dual does not cross the face; CR(c): "
<< typename Dt::Geom_traits().compute_squared_radius_3_object()(dt.point(c, 0), dt.point(c, 1),
dt.point(c, 2), dt.point(c, 3))
<< typename Tr::Geom_traits().compute_squared_radius_3_object()(tr.point(c, 0), tr.point(c, 1),
tr.point(c, 2), tr.point(c, 3))
<< " sq alpha " << sq_alpha << std::endl;
#endif
if(cr != LARGER)
return false;
cr = compare_squared_radius(dt.point(n, 0), dt.point(n, 1),
dt.point(n, 2), dt.point(n, 3),
cr = compare_squared_radius(tr.point(n, 0), tr.point(n, 1),
tr.point(n, 2), tr.point(n, 3),
sq_alpha);
#ifdef CGAL_AW3_DEBUG_TRAVERSABILITY
std::cout << "dual does not cross the face; CR(n): "
<< typename Dt::Geom_traits().compute_squared_radius_3_object()(dt.point(n, 0), dt.point(n, 1),
dt.point(n, 2), dt.point(n, 3))
<< typename Tr::Geom_traits().compute_squared_radius_3_object()(tr.point(n, 0), tr.point(n, 1),
tr.point(n, 2), tr.point(n, 3))
<< " sq alpha " << sq_alpha << std::endl;
#endif
@ -154,6 +167,100 @@ less_squared_radius_of_min_empty_sphere(typename Dt::Geom_traits::FT sq_alpha,
}
}
template <typename Tr>
typename Tr::Geom_traits::FT
smallest_squared_radius_3(const typename Tr::Facet& fh,
const Tr& tr)
{
using Cell_handle = typename Tr::Cell_handle;
using Point = typename Tr::Point;
using FT = typename Tr::Geom_traits::FT;
using CK = typename Tr::Geom_traits;
using Exact_kernel = typename Exact_kernel_selector<CK>::Exact_kernel;
using Approximate_kernel = Simple_cartesian<Interval_nt_advanced>;
using C2A = Cartesian_converter<CK, Approximate_kernel>;
using C2E = typename Exact_kernel_selector<CK>::C2E;
using Orientation_of_circumcenter = Filtered_predicate<Orientation_of_circumcenter<Exact_kernel>,
Orientation_of_circumcenter<Approximate_kernel>,
C2E, C2A>;
Orientation_of_circumcenter orientation_of_circumcenter;
auto squared_radius = tr.geom_traits().compute_squared_radius_3_object();
#ifdef CGAL_AW3_DEBUG_TRAVERSABILITY
std::cout << "Computing circumradius of facet" << std::endl;
#endif
CGAL_precondition(!tr.is_infinite(fh));
const Cell_handle c = fh.first;
const int ic = fh.second;
const Cell_handle n = c->neighbor(ic);
const Point& p1 = tr.point(c, Tr::vertex_triple_index(ic,0));
const Point& p2 = tr.point(c, Tr::vertex_triple_index(ic,1));
const Point& p3 = tr.point(c, Tr::vertex_triple_index(ic,2));
// This is not actually possible in the context of alpha wrapping, but keeping it for genericity
// and because it does not cost anything.
if(tr.is_infinite(n))
{
CGAL_assertion(!tr.is_infinite(c));
Orientation ori = orientation_of_circumcenter(p1, p2, p3,
tr.point(c, 0), tr.point(c, 1),
tr.point(c, 2), tr.point(c, 3));
if(ori == POSITIVE)
return squared_radius(p1, p2, p3);
else
return squared_radius(tr.point(c, 0), tr.point(c, 1), tr.point(c, 2), tr.point(c, 3));
}
if(tr.is_infinite(c))
{
Orientation ori = orientation_of_circumcenter(p1, p2, p3,
tr.point(n, 0), tr.point(n, 1),
tr.point(n, 2), tr.point(n, 3));
#ifdef CGAL_AW3_DEBUG_TRAVERSABILITY
std::cout << "Cell 'c' is infinite; Orientation: " << ori << std::endl;
#endif
if(ori == NEGATIVE)
return squared_radius(p1, p2, p3);
else
return squared_radius(tr.point(n, 0), tr.point(n, 1), tr.point(n, 2), tr.point(n, 3));
}
// both c and n are finite
if(orientation_of_circumcenter(p1, p2, p3,
tr.point(c, 0), tr.point(c, 1), tr.point(c, 2), tr.point(c, 3)) !=
orientation_of_circumcenter(p1, p2, p3,
tr.point(n, 0), tr.point(n, 1), tr.point(n, 2), tr.point(n, 3)))
{
#ifdef CGAL_AW3_DEBUG_TRAVERSABILITY
std::cout << "dual crosses the face; CR: " << squared_radius(p1, p2, p3) << std::endl;
#endif
return squared_radius(p1, p2, p3);
}
else
{
const FT cr = squared_radius(tr.point(c, 0), tr.point(c, 1), tr.point(c, 2), tr.point(c, 3));
const FT cnr = squared_radius(tr.point(n, 0), tr.point(n, 1), tr.point(n, 2), tr.point(n, 3));
#ifdef CGAL_AW3_DEBUG_TRAVERSABILITY
std::cout << "dual does not cross the face; CR(c): " << cr << " CRn: " << cnr << std::endl;
#endif
return (CGAL::min)(cr, cnr);
}
}
} // namespace internal
} // namespace Alpha_wraps_3
} // namespace CGAL

View File

@ -117,7 +117,7 @@ bool has_expected_Hausdorff_distance(const TriangleMesh& wrap,
template <typename TriangleMesh, typename NamedParameters = parameters::Default_named_parameters>
bool is_valid_wrap(const TriangleMesh& wrap,
const bool check_manifoldness = true,
const bool check_manifoldness,
const NamedParameters& np = parameters::default_values())
{
namespace PMP = CGAL::Polygon_mesh_processing;
@ -203,6 +203,13 @@ bool is_valid_wrap(const TriangleMesh& wrap,
return true;
}
template <typename TriangleMesh, typename NamedParameters = parameters::Default_named_parameters>
bool is_valid_wrap(const TriangleMesh& wrap,
const NamedParameters& np = parameters::default_values())
{
return is_valid_wrap(wrap, true /*consider manifoldness*/, np);
}
template <typename InputTriangleMesh, typename OutputTriangleMesh,
typename InputNamedParameters = parameters::Default_named_parameters,
typename OutputNamedParameters = parameters::Default_named_parameters>

View File

@ -105,7 +105,7 @@ void alpha_wrap_3(const PointRange& points,
using NP_helper = Point_set_processing_3_np_helper<PointRange, InputNamedParameters>;
using Geom_traits = typename NP_helper::Geom_traits;
using Oracle = Alpha_wraps_3::internal::Triangle_soup_oracle<Geom_traits>;
using AW3 = Alpha_wraps_3::internal::Alpha_wrap_3<Oracle>;
using AW3 = Alpha_wraps_3::internal::Alpha_wrapper_3<Oracle>;
Geom_traits gt = choose_parameter<Geom_traits>(get_parameter(in_np, internal_np::geom_traits));
@ -254,7 +254,7 @@ void alpha_wrap_3(const TriangleMesh& tmesh,
using Geom_traits = typename GetGeomTraits<TriangleMesh, InputNamedParameters>::type;
using Oracle = Alpha_wraps_3::internal::Triangle_mesh_oracle<Geom_traits>;
using AW3 = Alpha_wraps_3::internal::Alpha_wrap_3<Oracle>;
using AW3 = Alpha_wraps_3::internal::Alpha_wrapper_3<Oracle>;
Geom_traits gt = choose_parameter<Geom_traits>(get_parameter(in_np, internal_np::geom_traits));
@ -350,7 +350,7 @@ void alpha_wrap_3(const PointRange& points,
using NP_helper = Point_set_processing_3_np_helper<PointRange, InputNamedParameters>;
using Geom_traits = typename NP_helper::Geom_traits;
using Oracle = Alpha_wraps_3::internal::Point_set_oracle<Geom_traits>;
using AW3 = Alpha_wraps_3::internal::Alpha_wrap_3<Oracle>;
using AW3 = Alpha_wraps_3::internal::Alpha_wrapper_3<Oracle>;
Geom_traits gt = choose_parameter<Geom_traits>(get_parameter(in_np, internal_np::geom_traits));

View File

@ -4,6 +4,7 @@ Alpha_wrap_3
Arithmetic_kernel
BGL
Box_intersection_d
CGAL_Core
Cartesian_kernel
Circulator
Distance_2

View File

@ -1,12 +1,13 @@
#define CGAL_AW3_TIMER
#define CGAL_AW3_DEBUG
#define CGAL_AW3_DEBUG_MANIFOLDNESS
// #define CGAL_AW3_DEBUG_INITIALIZATION
#include <CGAL/Surface_mesh.h>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/alpha_wrap_3.h>
#include "alpha_wrap_validation.h"
#include <CGAL/Alpha_wrap_3/internal/validation.h>
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
@ -27,7 +28,7 @@ void generate_random_seeds(const Oracle& oracle,
Seeds& seeds,
CGAL::Random& r)
{
const auto bbox = CGAL::Alpha_wraps_3::internal::Alpha_wrap_3<Oracle>(oracle).construct_bbox(offset);
const auto bbox = CGAL::Alpha_wraps_3::internal::Alpha_wrapper_3<Oracle>(oracle).construct_bbox(offset);
const double sq_offset = CGAL::square(offset);
while(seeds.size() < 3)
@ -69,7 +70,7 @@ void alpha_wrap_triangle_mesh(Mesh& input_mesh,
Oracle oracle;
oracle.add_triangle_mesh(input_mesh);
AW3::internal::Alpha_wrap_3<Oracle> aw3(oracle);
AW3::internal::Alpha_wrapper_3<Oracle> aw3(oracle);
if(seeds.empty())
generate_random_seeds(oracle, offset, seeds, r);

View File

@ -1,11 +1,12 @@
#define CGAL_AW3_TIMER
#define CGAL_AW3_DEBUG
#define CGAL_AW3_DEBUG_MANIFOLDNESS
//#define CGAL_AW3_DEBUG_STEINER_COMPUTATION
//#define CGAL_AW3_DEBUG_INITIALIZATION
//#define CGAL_AW3_DEBUG_QUEUE
#include <CGAL/alpha_wrap_3.h>
#include "alpha_wrap_validation.h"
#include <CGAL/Alpha_wrap_3/internal/validation.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>

View File

@ -1,10 +1,11 @@
#define CGAL_AW3_TIMER
#define CGAL_AW3_DEBUG
#define CGAL_AW3_DEBUG_MANIFOLDNESS
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/alpha_wrap_3.h>
#include "alpha_wrap_validation.h"
#include <CGAL/Alpha_wrap_3/internal/validation.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/IO/polygon_soup_io.h>
@ -52,7 +53,7 @@ void alpha_wrap_triangle_soup(Points& pr,
// AW3
Oracle oracle;
oracle.add_triangle_soup(pr, fr);
AW3::internal::Alpha_wrap_3<Oracle> aw3(oracle);
AW3::internal::Alpha_wrapper_3<Oracle> aw3(oracle);
Mesh wrap;
aw3(alpha, offset, wrap, CGAL::parameters::do_enforce_manifoldness(false));

View File

@ -1,12 +1,12 @@
#define CGAL_AW3_TIMER
//#define CGAL_AW3_DEBUG
//#define CGAL_AW3_DEBUG_MANIFOLDNESS
#define CGAL_AW3_DEBUG_MANIFOLDNESS
//#define CGAL_AW3_DEBUG_STEINER_COMPUTATION
//#define CGAL_AW3_DEBUG_INITIALIZATION
//#define CGAL_AW3_DEBUG_QUEUE
#include <CGAL/alpha_wrap_3.h>
#include "alpha_wrap_validation.h"
#include <CGAL/Alpha_wrap_3/internal/validation.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>

View File

@ -27,7 +27,7 @@ namespace Qt {
}
template < class Gt >
class Parabola_segment_2 : public Parabola_2< Gt >
struct Parabola_segment_2 : public Parabola_2< Gt >
{
typedef CGAL::Parabola_2<Gt> Base;
typedef typename Base::Site_2 Site_2;
@ -39,10 +39,10 @@ class Parabola_segment_2 : public Parabola_2< Gt >
using Base::t;
using Base::f;
protected:
Point_2 p1, p2;
public:
Parabola_segment_2() : Parabola_2< Gt >() {}
template<class ApolloniusSite>

View File

@ -19,6 +19,10 @@
#ifdef CGAL_USE_BOOST_MP
#ifdef CGAL_USE_CORE
#include <CGAL/CORE_arithmetic_kernel.h>
#endif
//Currently already included in boost_mp.h
//#include <boost/multiprecision/cpp_int.hpp>
//#ifdef CGAL_USE_GMP
@ -26,20 +30,29 @@
//#endif
// FIXME: the could be several kernels based on Boost.Multiprecision.
namespace CGAL {
/** \ingroup CGAL_Arithmetic_kernel
* \brief The Boost.Multiprecision set of exact number types
*/
#if !defined(CGAL_USE_CORE) || defined(CGAL_CORE_USE_GMP_BACKEND)
struct BOOST_cpp_arithmetic_kernel : internal::Arithmetic_kernel_base {
typedef boost::multiprecision::cpp_int Integer;
typedef boost::multiprecision::cpp_rational Rational;
};
#else
typedef CORE_arithmetic_kernel BOOST_cpp_arithmetic_kernel;
#endif
#ifdef CGAL_USE_GMP
#if !defined(CGAL_USE_CORE) || !defined(CGAL_CORE_USE_GMP_BACKEND)
struct BOOST_gmp_arithmetic_kernel : internal::Arithmetic_kernel_base {
typedef boost::multiprecision::mpz_int Integer;
typedef boost::multiprecision::mpq_rational Rational;
};
#else
typedef CORE_arithmetic_kernel BOOST_gmp_arithmetic_kernel;
#endif
#endif
template <class T1, class T2, class T3, class T4, class T5>

View File

@ -55,14 +55,6 @@ public:
};
template <>
struct Get_arithmetic_kernel<CORE::BigInt>{
typedef CORE_arithmetic_kernel Arithmetic_kernel;
};
template <>
struct Get_arithmetic_kernel<CORE::BigRat>{
typedef CORE_arithmetic_kernel Arithmetic_kernel;
};
template <>
struct Get_arithmetic_kernel<CORE::Expr>{
typedef CORE_arithmetic_kernel Arithmetic_kernel;
@ -74,6 +66,8 @@ struct Get_arithmetic_kernel<CORE::BigFloat>{
} //namespace CGAL
#include <CGAL/BOOST_MP_arithmetic_kernel.h>
#endif // CGAL_USE_CORE
#endif // CGAL_CORE_ARITHMETIC_KERNEL_H

View File

@ -15,7 +15,6 @@
#include <CGAL/Arrangement_with_history_2.h>
#include <CGAL/Cartesian.h>
#include <CGAL/Arr_default_dcel.h>
#include <CGAL/Arr_segment_traits_2.h>
#include <CGAL/Arr_linear_traits_2.h>
#include <CGAL/Arr_polyline_traits_2.h>

View File

@ -12,13 +12,12 @@ if(POLICY CMP0071)
cmake_policy(SET CMP0071 NEW)
endif()
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Core Qt5)
find_package(Qt5 QUIET COMPONENTS Widgets)
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Core Qt6)
find_package(Qt6 QUIET COMPONENTS Widgets)
if (CGAL_Qt5_FOUND AND Qt5_FOUND)
include(${CGAL_USE_FILE})
if (CGAL_Qt6_FOUND AND Qt6_FOUND)
add_compile_definitions(QT_NO_KEYWORDS)
include_directories( BEFORE ./ )
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Arrangement package includes
add_definitions(-DQT_NO_KEYWORDS)
@ -50,7 +49,7 @@ if (CGAL_Qt5_FOUND AND Qt5_FOUND)
endif()
qt5_wrap_ui(arrangement_2_uis
qt6_wrap_ui(arrangement_2_uis
ArrangementDemoWindow.ui
NewTabDialog.ui
OverlayDialog.ui
@ -58,7 +57,7 @@ if (CGAL_Qt5_FOUND AND Qt5_FOUND)
AlgebraicCurveInputDialog.ui
RationalCurveInputDialog.ui)
qt5_wrap_cpp(CGAL_Qt5_MOC_FILES
qt6_wrap_cpp(CGAL_Qt6_MOC_FILES
ArrangementDemoWindow.h
ArrangementDemoTab.h
GraphicsViewCurveInput.h
@ -70,7 +69,7 @@ if (CGAL_Qt5_FOUND AND Qt5_FOUND)
ColorItemEditor.h
PropertyValueDelegate.h)
qt5_add_resources(CGAL_Qt5_RESOURCE_FILES Arrangement_on_surface_2.qrc)
qt6_add_resources(CGAL_Qt6_RESOURCE_FILES Arrangement_on_surface_2.qrc)
add_executable(arrangement_2
arrangement_2.cpp
@ -107,11 +106,11 @@ if (CGAL_Qt5_FOUND AND Qt5_FOUND)
ArrangementIO.cpp
${UTILS_COMPILE_FILES}
${arrangement_2_uis}
${CGAL_Qt5_RESOURCE_FILES}
${CGAL_Qt5_MOC_FILES})
${CGAL_Qt6_RESOURCE_FILES}
${CGAL_Qt6_MOC_FILES})
target_link_libraries(arrangement_2 PRIVATE Qt5::Widgets)
target_link_libraries(arrangement_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5)
target_link_libraries(arrangement_2 PRIVATE Qt6::Widgets)
target_link_libraries(arrangement_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6)
if(CGAL_Core_FOUND)
target_link_libraries(arrangement_2 PRIVATE CGAL::CGAL_Core)
endif()
@ -124,11 +123,11 @@ if (CGAL_Qt5_FOUND AND Qt5_FOUND)
else()
set(MISSING_DEPS "")
if(NOT CGAL_Qt5_FOUND)
set(MISSING_DEPS "the CGAL Qt5 library, ${MISSING_DEPS}")
if(NOT CGAL_Qt6_FOUND)
set(MISSING_DEPS "the CGAL Qt6 library, ${MISSING_DEPS}")
endif()
if(NOT Qt5_FOUND)
set(MISSING_DEPS "Qt5, ${MISSING_DEPS}")
if(NOT Qt6_FOUND)
set(MISSING_DEPS "Qt6, ${MISSING_DEPS}")
endif()
message("NOTICE: This demo requires ${MISSING_DEPS} and will not be compiled.")
endif()

View File

@ -22,7 +22,7 @@ PropertyValueDelegate::PropertyValueDelegate( QObject* parent ):
QItemEditorFactory* factory = new QItemEditorFactory;
QItemEditorCreatorBase* creator =
new QStandardItemEditorCreator< PositiveSpinBox >( );
factory->registerEditor( QVariant::UInt, creator );
factory->registerEditor( QMetaType::UInt, creator );
this->setItemEditorFactory( factory );
}

View File

@ -11,7 +11,7 @@
#include "IntersectCurves.h"
#include "ArrangementTypes.h"
#include <boost/function_output_iterator.hpp>
#include <boost/iterator/function_output_iterator.hpp>
template <typename Traits_>

View File

@ -202,7 +202,7 @@ operator()(const Point_2& p, const X_monotone_curve_2& curve) const {
auto points = painterOstream.getPointsList(curve);
QPoint p_viewport =
view->mapFromScene(QPointF{p.x().doubleValue(), p.y().doubleValue()});
view->mapFromScene(QPointF{CGAL::to_double(p.x()), CGAL::to_double(p.y())});
double min_dist = (std::numeric_limits<double>::max)();
for (auto& vec : points) {

View File

@ -19,7 +19,7 @@ int main(int argc, char* argv[])
QCoreApplication::setOrganizationName("CGAL");
QCoreApplication::setApplicationName("2D Arrangements Demo");
// Import resources from libCGAL (Qt5).
// Import resources from libCGAL (Qt6).
CGAL_QT_INIT_RESOURCES;
ArrangementDemoWindow demoWindow;

View File

@ -69,10 +69,10 @@ class Arrangement_2 { ... };
An instance of this template represents an arrangement embedded in the
plane. When the template is instantiated, the `GeometryTraits`
parameter must be substituted with a type that defines a set of
parameter must be substituted by a type that defines a set of
geometric-object types, such as point and curve, and a set of
operations on objects of these types (see Section \ref
aos_sec-geom_traits); the `Dcel` parameter must be substituted with a
aos_sec-geom_traits); the `Dcel` parameter must be substituted by a
type that represents a doubly-connected edge list (\dcel) data
structure. It defines types of topological objects, such as vertices,
edges, and faces, and the operations required to maintain the
@ -91,7 +91,7 @@ An instance of this template represents a two-dimensional arrangement
embedded in a surface in three dimensional space. When the template is
instantiated, the `GeometryTraits` parameter must be substituted as
described above; the `TopologyTraits` parameter must be substituted
with a type that deals with the topology of the surface (see Section
by a type that deals with the topology of the surface (see Section
\ref aos_sec-topol_traits). In particular, it maintains a
representation of the arrangement graph embedded in the surface using
a doubly-connected edge list (\dcel) data-structure suitable for
@ -390,7 +390,7 @@ the `Arrangement_2` class template; their description follows.
<UL>
<LI>The `Traits` template-parameter should be instantiated with a
<LI>The `Traits` template-parameter should be substituted by a
model of the `ArrangementBasicTraits_2` concept and optionally
additional geometry traits concepts. A model of the
`ArrangementBasicTraits_2` concept defines the types of
@ -415,14 +415,15 @@ the `Arrangement_2` class template; their description follows.
rational functions. We exemplify the usage of these traits classes
in Section \ref aos_sec-geom_traits.
<LI>The `Dcel` template-parameter should be instantiated with a class
<LI>The `Dcel` template-parameter should be substituted by a class
that models the `ArrangementDcel` concept, which is used to represent
the topological layout of the arrangement. This parameter is
substituted with `Arr_default_dcel<Traits>` by default, and
substituted by `Arr_default_dcel<Traits>` by default, and
we use this default value in this and in the following three
sections. However, in many applications it is necessary to
extend the \dcel features. This is done by substituting the
`Dcel` parameter with a different type; see Section \ref arr_ssecex_dcel
sections. However, in many applications it is necessary to extend the
\dcel features. This is done by substituting the `Dcel` parameter with
a different type (typically, a different instance of the
`Arr_dcel<>` class template); see Section \ref arr_ssecex_dcel
for further explanations and examples.
</UL>
@ -1001,7 +1002,7 @@ segments common to all examples that do not construct new geometric
objects. They are kept in the header file
`arr_inexact_construction_segments.h`. In these examples the `Traits`
parameter of the `Arrangement_2<Traits, Dcel>` class template is
substituted with an instance of the
substituted by an instance of the
`Arr_non_caching_segment_traits_2<Kernel>` class template. The
`Arr_non_caching_segment_traits_2` class template is instantiated with
the predefined kernel that evaluates predicates in an exact manner,
@ -1438,7 +1439,7 @@ vary according to the user choice.} for answering queries:
The landmark strategy requires that the type of the attached
arrangement be an instance of the `Arrangement_2<Traits,Dcel>` class
template, where the `Traits` parameter is substituted with a
template, where the `Traits` parameter is substituted by a
geometry-traits class that models the `ArrangementLandmarkTraits_2`
concept, which refines the basic `ArrangementBasicTraits_2` concept;
see Section \ref aos_sssec-tr_landmarks_concept for details. Most
@ -1742,7 +1743,7 @@ query results, and insert \f$c\f$ at its proper
location.\cgalFootnote{The \cgalFootnoteCode{CGAL::insert_non_intersecting_curve<>()}
function template, as all other functions reviewed in this section, is
parameterized by an arrangement type and a point-location type (The
latter must be substituted with a model of the
latter must be substituted by a model of the
`ArrangementPointLocation_2` concept).} The insertion operation thus
hardly requires any geometric operations on top of the ones needed to
answer the point-location queries. Moreover, it is sufficient that the
@ -1846,7 +1847,7 @@ condition. Consider the call \link CGAL::insert<>() `insert(arr, c,
pl)`\endlink, where \f$c\f$ is not necessarily \f$x\f$-monotone. In
this case the type of `arr` must be an instance of the
`Arrangement_2<Traits, Dcel>` class template, where the `Traits`
template parameter is substituted with a traits class that models the
template parameter is substituted by a traits class that models the
concept `ArrangementTraits_2`, which refines the
`ArrangementXMonotoneTraits_2` concept. It has to define an additional
\link ArrangementTraits_2::Curve_2 `Curve_2`\endlink type, which may
@ -2267,7 +2268,7 @@ accepts the name of an input file that contains the plain-text
description of the geometric objects and an output iterator for
storing the newly constructed objects. When the function is
instantiated, the first template parameter, namely `Type`, must be
substituted with the type of objects to read. It is assumed that an
substituted by the type of objects to read. It is assumed that an
extractor operator (`>>`) that extracts objects of the given type from
the input stream is available. The listing of the function template,
which is defined in the file `read_objects.h`, is omitted here
@ -2704,7 +2705,7 @@ All the free functions that operate on arrangements of bounded curves
of unbounded curves. For example, consider a container of linear
curves that has to be inserted into an arrangement object, the type of
which is an instance of the `Arrangement_2<Traits,Dcel>` class
template, where the `Traits` parameter is substituted with the traits
template, where the `Traits` parameter is substituted by the traits
class that handles linear curves; see Section \ref
arr_sssectr_linear. You can do it incrementally; namely, insert the
curves one by one as follows:
@ -3485,7 +3486,7 @@ point-location strategy.
The type of an arrangement associated with the landmark point-location
strategy (see Section \ref arr_ssecpl) must be an instance of the
`Arrangement_on_surface_2<GeomTraits, TopolTraits>` class template,
where the `GeomTraits` parameter is substituted with a model of the
where the `GeomTraits` parameter is substituted by a model of the
concept `ArrangementLandmarkTraits_2`. (Naturally, it can also model
either the `ArrangementXMonotoneTraits_2` concept or the
`ArrangementTraits_2` concept.) The `ArrangementLandmarkTraits_2`
@ -4541,7 +4542,7 @@ PkgBooleanSetOperations2Ref. Note that it is not a model of the
computations with square root numbers, which makes it attractive for
arrangements induced by line segments, circular arcs, and whole
circles. When the traits class-template is instantiated, the `Kernel`
template parameter must be substituted with a geometric kernel that
template parameter must be substituted by a geometric kernel that
models the `Kernel` concept. Always plug in a kernel that uses a
rational number type, such as
`Exact_predicates_exact_constructions_kernel`. Observe that the nested
@ -4722,20 +4723,20 @@ follows:
<UL>
<LI>The `RatKernel` template parameter must be substituted with a
<LI>The `RatKernel` template parameter must be substituted by a
geometric kernel whose field type is an exact rational type. It is
used to define basic geometric entities (e.g., a line segment or a
circle) with rational coefficients. Typically we use one of the
standard \cgal kernels, instantiated with the number type
`NtTraits::Rational` (see below).
<LI>The `AlgKernel` template parameter must be substituted with a
<LI>The `AlgKernel` template parameter must be substituted by a
geometric kernel whose field type is an exact algebraic type. It is
used to define points with algebraic coordinates. Typically, we use
one of the standard \cgal kernels, instantiated with the number type
`NtTraits::Algebraic` (see below).
<LI>The `NtTraits` template parameter must be substituted with a type
<LI>The `NtTraits` template parameter must be substituted by a type
that encapsulates all the numeric operations needed for performing
geometric computation carried out by the geometric traits class. It
defines the `Integer`, `Rational`, and `Algebraic` number-types, and
@ -4916,7 +4917,7 @@ provided by the traits in form of functors.
When the `Arr_rational_function_traits_2<AlgebraicKernel_d_1>` class
template is instantiated, the template parameter must be substituted
with a model of the `AlgebraicKernel_d_1` concept. Models of this
by a model of the `AlgebraicKernel_d_1` concept. Models of this
concept, such as the `Algebraic_kernel_d_1<Coefficient>` class
template provided by the package \ref PkgAlgebraicFoundations are
meant to support algebraic functionalities on univariate polynomials
@ -5176,11 +5177,11 @@ polynomial. Currently supported integral number types are `Gmpz`,
statements included in the header file `integer_type.h`, the listings
of which are omitted here. This header file is used by the two example
programs listed in this section. The template parameter `Coefficient`
can be substituted in addition with an instance of the
can be substituted in addition by an instance of the
`Sqrt_extension<A,B>` class template, where the template parameters
`NT` and `Root` are substituted in turn with one of the integral
`NT` and `Root` are substituted in turn by one of the integral
number types above. Finally, the template parameter `Coefficient` can
be substituted also with a rational number type, where the type of the
be substituted also by a rational number type, where the type of the
numerator and denominator is one of the types above.
The type \link Arr_algebraic_segment_traits_2::Curve_2
@ -5487,7 +5488,7 @@ decorator used to attach a data field to curves and to
\f$x\f$-monotone curves. It is a class template named
`Arr_curve_data_traits_2<BaseTraits, XMonotoneCurveData, Merge,
CurveData, Convert>` parameterized by a base-traits class, which must
be substituted with one of the geometric traits models described in
be substituted by one of the geometric traits models described in
the previous subsections or with a user-defined traits model, when the
decorator is instantiated. The curve-data decorator derives from the
base-traits class, and in particular inherits its \link
@ -5703,20 +5704,25 @@ objects, so that when one object changes state, all its dependents are
notified and updated automatically. The observed object does not know
anything about the observers. It merely "publishes" information about
changes when they occur. In our case observers can be attached to an
arrangement object. An attached observer receives notifications about
the changes this arrangement undergoes.
arrangement object.
An observer object, the type of which is an instance of the
`Arr_observer<Arrangement>` class template, stores a pointer to an
arrangement object. When the `Arr_observer<Arrangement>` class
template is instantiated, the `Arrangement` parameter must be
substituted with the type of the arrangement object. The observer
receives notifications <em>just before</em> a structural change occurs
in the arrangement and <em>immediately after</em> such a change takes
place. `Arr_observer` serves as a base class for other
observer classes and defines a set of virtual notification
functions, with default empty implementations. The set of functions
can be divided into three categories, as follows:
An observer object that observes changes in an arrangement object
stores a pointer to the attached arrangement object. It receives
notifications about the changes this arrangement undergoes. The
observer receives notifications <em>just before</em> a structural
change occurs in the arrangement and <em>immediately after</em> such a
change takes place. An observer object that observes changes in an
arrangement object of type `Arrangement` must be of a type derived
from `Arrangement::Observer`, which is an alias to
`Aos_observer<Arrangement_on_surface_2>`, where
`Arrangement_on_surface_2` is the type of the arrangement object or
its base type. An instance of `Aos_observer<>` serves as a base type
for other observer classes and defines a set of virtual notification
functions, with default empty implementations. You can also use the
template alias `Arr_observer<Arrangement_2>`, where `Arrangement_2` is
the type of the arrangement object in case it is derived from an
instance of the template `Arrangement_on_surface_2`. The set of
functions can be divided into three categories, as follows:
<OL>
@ -5782,10 +5788,10 @@ the call to `after_global_change()`.
</OL>
See the Reference Manual for a detailed specification of the
`Arr_observer` class template and the prototypes of all notification
`Aos_observer` class template and the prototypes of all notification
functions.
Each arrangement object stores a list of pointers to `Arr_observer`
Each arrangement object stores a list of pointers to `Aos_observer`
objects. This list may be empty, in which case the arrangement does
not have to notify any external class on the structural changes it
undergoes. If, however, there are observers associated with the
@ -5799,7 +5805,7 @@ invoked for each observer.
<!-- This allows for the nesting of \Index{observer} objects. -->
Concrete arrangement-observer classes should inherit from
`Arr_observer`. When an observer is constructed, it is attached to a
`Aos_observer`. When an observer is constructed, it is attached to a
valid arrangement supplied to the observed constructor, or
alternatively the observer can be attached to the arrangement at a
later time. When this happens, the observer object inserts itself
@ -5809,8 +5815,8 @@ thereafter. Subsequently, the observer object unregisters itself by
removing itself from this list just before it is destroyed. Most
concrete observer-classes do not need to use the full set of
notifications. Thus, the bodies of all notification methods defined in
the base class `Arr_observer` are empty. A concrete observer that
inherits from `Arr_observer` needs to override only the relevant
the base class `Aos_observer` are empty. A concrete observer that
inherits from `Aos_observer` needs to override only the relevant
notification methods. The remaining methods are invoked when
corresponding changes occur, but they do nothing.
@ -5877,12 +5883,12 @@ applications.
All examples presented so far use the default \dcel; namely, they
employ the `Arr_default_dcel<Traits>` instance. This is done
implicitly, as an instance of this class template serves as the
default parameter for the `Arrangement_2` class template; see Section
\ref aos_ssec-basic-arr_class. The default \dcel class associates
points with vertices and \f$x\f$-monotone curves with halfedges, but
nothing more. In this section we show how to use alternative
\dcel types to extend the desired \dcel records.
implicitly, as this instance of the `Arr_default_dcel` class template
serves as the default parameter for the `Arrangement_2` class
template; see Section \ref aos_ssec-basic-arr_class. The default \dcel
class associates points with vertices and \f$x\f$-monotone curves with
halfedges, but nothing more. In this section we show how to use
alternative \dcel types to extend the desired \dcel records.
<!-- ------------------------------------------------------------------------- -->
\subsubsection arr_sssecex_dcel_face Extending the DCEL Faces
@ -6102,7 +6108,7 @@ ovl_traits)`\endlink constructs the arrangement `arr_o`, which is the
overlay of two input arrangement `arr_r` and `arr_b`. All three
arrangements must use the same geometric primitives. In other words,
their types are instances of the `Arrangement_2<Traits,Dcel>` class
template, where the `Traits` parameter is substituted with three
template, where the `Traits` parameter is substituted by three
geometry-traits classes, respectively. The geometry-traits classes of
the input arrangements must be convertible to the geometry-traits
class of the resulting arrangement.\cgalFootnote{It is sufficient that
@ -6111,17 +6117,17 @@ of arrangements derive from a common ancestor that models the
geometry-traits concept.} Typically, all three arrangements use the
same geometry-traits class.
The `overlay()` function template is suitable for
arrangements that do not store any additional data with their
\dcel records; namely, arrangements defined using an instance of
the default \dcel class-template `Arr_default_dcel`. Typically,
the overlay arrangement in this case does not store extra data with
its \dcel records as well (or if it does, the additional
data-fields cannot be computed by the overlay operation). The overlay
arrangement is equivalent to the arrangement induced by all curves of
`arr_r` and `arr_b`. Indeed, it is possible to obtain the same result
using the standard insertion-operations instead, but, as mentioned
above, this is less efficient.
The `overlay()` function template is suitable for arrangements that do
not store any additional data with their \dcel records; namely,
arrangements defined using the default \dcel, which is the instance
`Arr_default_dcel<Traits>`. Typically, the overlay arrangement in this
case does not store extra data with its \dcel records as well. (If it
does, the additional data-fields cannot be computed by the overlay
operation in this case.) The overlay arrangement is equivalent to the
arrangement induced by all curves of `arr_r` and `arr_b`. Indeed, it
is possible to obtain the same result using the standard
insertion-operations instead, but, as mentioned above, this is less
efficient.
<!-- ------------------------------------------------------------------------- -->
\cgalFigureBegin{aos_figex_overlay,overlay.png}
@ -6163,7 +6169,7 @@ arrangement that results from overlaying two face-extended
arrangements typically also stores additional data-fields with its
faces. The types of such arrangements, for example, could be instances
of the `Arrangement_2<Traits,Dcel>` class template, where the `Dcel`
parameters are substituted with instances of the
parameters are substituted by instances of the
`Arr_face_extended_dcel` class template (see Section \ref
arr_sssecex_dcel_face). The data field that is attached to an overlay
face can be computed from the data fields of the two faces (in `arr_r`
@ -6173,7 +6179,7 @@ data fields with all their \dcel records typically also stores
additional data-fields with all its \dcel records. The types of
such arrangements, for example, could be instances of the
`Arrangement_2<Traits,Dcel>` class template, where the `Dcel`
parameters are substituted with instances of the `Arr_extended_dcel`
parameters are substituted by instances of the `Arr_extended_dcel`
class template (see Section \ref arr_sssecex_dcel_all). The data field
attached to an overlay feature can be computed from the data fields of
the two features (in `arr_r` and `arr_b`) that induce the overlay
@ -6188,7 +6194,7 @@ of the overlay traits can be an instance of the class template
`Arr_face_overlay_traits<ArrangementR,ArrangementB,ArrangementO,OverlayFaceData>`,
which models the concept `OverlayTraits`. An object of this type
operates on face-extended arrangements. When instantiated, the
`OverlayFaceData` parameter must be substituted with a functor that is
`OverlayFaceData` parameter must be substituted by a functor that is
capable of combining two face-data fields of types
`ArrangementR::Dcel::Face_data` and `ArrangementB::Dcel::Face_data`
and computing the output `ArrangementO::Dcel::Face_data` object. The
@ -6203,7 +6209,7 @@ flag. A polygon is represented as a <em>marked</em> arrangement face
(whose flag is set). The example uses an instance of the
`Arr_face_overlay_traits<ArrR,ArrB,ArrO,OverlayFaceData>` class
template as the face-overlay traits class where the `OverlayFaceData`
template parameter is substituted with a functor that simply performs
template parameter is substituted by a functor that simply performs
a logical <em>and</em> operation on Boolean flags. As a result, a face
in the overlay arrangement is marked only when it corresponds to an
overlapping region of two marked faces in the input
@ -6401,12 +6407,12 @@ between these curves and the arrangement edges they induce. Similarly,
the `Arrangement_with_history_2<GeometryTraits,Dcel>` class-template
extends the `Arrangement_2<GeometryTraits,Dcel>` class template. The
`GeometryTraits` template parameter, of either class templates, must
be substituted with a model of the `ArrangementTraits_2` concept; see
be substituted by a model of the `ArrangementTraits_2` concept; see
Section \ref aos_ssec-insert_gen. It should define the \link
ArrangementTraits_2::Curve_2 `Curve_2`\endlink type and support its
subdivision into \link ArrangementBasicTraits_2::X_monotone_curve_2
`X_monotone_curve_2`\endlink objects, among the others. The `Dcel`
parameter must be substituted with a model of the `ArrangementDcel`
parameter must be substituted by a model of the `ArrangementDcel`
concept. You can use either the default \dcel class or an extended
\dcel class (see Section \ref arr_ssecex_dcel) based on your needs. An
arrangement that support the cross-mapping mentioned above is referred
@ -6483,7 +6489,7 @@ iterators is \link Arrangement_with_history_2::Curve_2
Overlaying two arrangement-with-history objects is possible only if
their types are instances of the
`Arrangement_with_history_2<Traits,Dcel>` class template, where the
respective `Traits` parameters are substituted with two traits classes
respective `Traits` parameters are substituted by two traits classes
that are convertible to one another. In this case, the resulting
arrangement stores a consolidated container of input curves, and
automatically preserves the cross-mapping between the arrangement
@ -6663,15 +6669,15 @@ a file.
\subsection arr_ssecarr_io_aux_data Arrangements with Auxiliary Data
<!-- ------------------------------------------------------------------------- -->
\cgalAdvancedBegin
The inserter and extractor both ignore any auxiliary data stored with
the arrangement features. Thus, they are ideal for arrangements
instantiated using the `Arr_default_dcel` class.
However, as explained in Section \ref arr_ssecex_dcel, one can easily
extend the arrangement faces by using the `Arr_face_extended_dcel`
template, or extend all \dcel records by using the `Arr_extended_dcel`
template. In such cases, it might be crucial that the auxiliary data fields
are written to the file and read from there.
\cgalAdvancedBegin The inserter and extractor both ignore any
auxiliary data stored with the arrangement features. Thus, they are
ideal for arrangements instantiated using the default \dcel, which is
the instance `Arr_default_dcel<Traits>`. However, as explained in
Section \ref arr_ssecex_dcel, one can easily extend the arrangement
faces by using the `Arr_face_extended_dcel` template, extend all \dcel
records by using the `Arr_extended_dcel` template, or use the
`Arr_dcel` template. In such cases, it might be crucial that the
auxiliary data fields are written to the file and read from there.
The arrangement package includes the free functions
`write(arr, os, formatter)`, which writes the arrangement `arr`
@ -6764,8 +6770,8 @@ An arrangement data structure can be visualized by calling the \link PkgArrangem
\cgalExample{Arrangement_on_surface_2/draw_arr.cpp}
This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined.
Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`.
This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined.
Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`.
\cgalFigureBegin{aos_fig-draw_arr,draw_arr.png}
A snapshot of the window created by the program
@ -6968,7 +6974,7 @@ algorithm on a dual arrangement. It uses the functor template
information stored inside the faces. The functor implements a property
map that utilizes the `data()` and `set_data()` member functions of the
extended face to update or obtain the property. When the property map
is instantiated, the `Type` parameter must be substituted with the
is instantiated, the `Type` parameter must be substituted by the
same type that is used to extend the arrangement face; see Section
\ref arr_sssecex_dcel_face. The functor template is defined in the
header file `Extended_face_property_map.h` listed below.

View File

@ -0,0 +1,424 @@
namespace CGAL {
/*! \ingroup PkgArrangementOnSurface2Ref
*
* \anchor arr_refaos_obs
*
* `Aos_observer` serves as an abstract base class for all observer classes that
* are attached to an arrangement instance of type `Arrangement` and receive
* notifications from the arrangement. This base class handles the attachment
* of the observer to a given arrangement instance or to the detachment of the
* observer from this arrangement instance. It also gives a default empty
* implementation to all notification functions that are invoked by the
* arrangement to notify the observer on local or global changes it undergoes.
* The notification functions are all virtual functions, so they can be
* overridden by the concrete observer classes that inherit from `Aos_observer`.
*
* In order to implement a concrete arrangement observer-class, one simply needs
* to derive from `Aos_observer` and override the relevant notification
* functions. For example, if only face-split events are of interest, it is
* sufficient to override just `before_split_face()` (or just
* `after_split_face()`).
*/
template <typename Arrangement>
class Aos_observer {
public:
/// \name Types
/// @{
//! the type of the associated arrangement.
typedef unspecified_type Arrangement_2;
//! the point type.
typedef typename Arrangement_2::Point_2 Point_2;
//! the \f$x\f$-monotone curve type.
typedef typename Arrangement_2::X_monotone_curve_2 X_monotone_curve_2;
//! the type of a handle to an arrangement vertex.
typedef typename Arrangement_2::Vertex_handle Vertex_handle;
//! the type of a handle to an arrangement halfedge.
typedef typename Arrangement_2::Halfedge_handle Halfedge_handle;
//! the type of a handle to an arrangement face.
typedef typename Arrangement_2::Face_handle Face_handle;
/*! represents a connected component of the boundary (CCB), either an outer
* boundary or an inner boundary (the latter is also referred to as a hole).
*/
typedef typename Arrangement_2::Ccb_halfedge_circulator Ccb_halfedge_circulator;
/// @}
/// \name Creation
/// @{
/*! constructs an observer that is unattached to any arrangement instance. */
Aos_observer();
/*! constructs an observer and attaches it to the given arrangement `arr`. */
Aos_observer(Arrangement_2& arr);
/// @}
/// \name Modifiers
/// @{
/*! attaches the observer to the given arrangement `arr`. */
void attach(Arrangement_2& arr);
/*! detaches the observer from its arrangement. */
void detach();
/// @}
/// \name Notifications on Global Arrangement Operations
/// @{
/*! issued just before the attached arrangement is assigned with the contents of another
* arrangement.
* \param arr The other arrangement. Notice that the arrangement type is the type used to
* instantiate the observer, which is conveniently defined as
* `Arrangement_2::Base_aos`.
*/
virtual void before_assign(const typename Arrangement_2::Base_aos& arr);
/*! issued immediately after the attached arrangement has been assigned with
* the contents of another arrangement.
*/
virtual void after_assign();
/*! issued just before the attached arrangement is cleared. */
virtual void before_clear();
/*! issued immediately after the attached arrangement has been cleared, so it
* now consists only of a the unbounded face `uf`.
*/
virtual void after_clear(Face_handle uf);
/*! issued just before a global function starts to modify the attached
* arrangement. It is guaranteed that no queries (especially no point-location
* queries) are issued until the termination of the global function is
* indicated by `after_global_change()`.
*/
virtual void before_global_change();
/*!
issued immediately after a global function has stopped modifying the
attached arrangement.
*/
virtual void after_global_change();
/// @}
/// \name Notifications on Attachment or Detachment
/// @{
/*! issued just before the observer is attached to the arrangement instance
* `arr`.
* \param arr The arrangement that is about to attach the observer. Notice
* that the arrangement type is the type used to instantiate the
* observer, which is conveniently defined as
* `Arrangement_2::Base_aos`.
*/
virtual void before_attach(const typename Arrangement_2::Base_aos& arr);
/*! issued immediately after the observer has been attached to an arrangement
* instance.
*/
virtual void after_attach();
/*! issued just before the observer is detached from its arrangement instance.
*/
virtual void before_detach();
/*! issued immediately after the observer has been detached from its
* arrangement instance.
*/
virtual void after_detach();
/// @}
/// \name Notifications on Local Changes in the Arrangement
/// @{
/*! issued just before a new vertex that corresponds to the point `p` is
* created.
*/
virtual void before_create_vertex(const Point_2& p);
/*! issued immediately after a new vertex `v` has been created. Note that the
* vertex still has no incident edges and is not connected to any other vertex.
*/
virtual void after_create_vertex(Vertex_handle v);
/*! issued just before a new vertex at infinity is created, `cv` is the curve
* incident to the surface boundary, `ind` is the relevant curve-end, `ps_x`
* is the boundary condition of the vertex in \f$x\f$ and `ps_y` is the
* boundary condition of the vertex in \f$y\f$.
*/
virtual void before_create_boundary_vertex(const X_monotone_curve_2& cv,
Arr_curve_end ind,
Arr_parameter_space ps_x,
Arr_parameter_space ps_y);
/*! issued immediately after a new vertex `v` has been created. Note that the
* vertex still has no incident edges and is not connected to any other vertex.
*/
virtual void after_create_boundary_vertex(Vertex_handle v);
/*! issued just before a new edge that corresponds to the \f$x\f$-monotone
* curve `c` and connects the vertices `v1` and `v2` is created.
*/
virtual void before_create_edge(const X_monotone_curve_2& c,
Vertex_handle v1, Vertex_handle v2);
/*! issued immediately after a new edge `e` has been created. The halfedge
* that is sent to this function is always directed from `v1` to `v2` (see
* `before_create_edge()`).
*/
virtual void after_create_edge(Halfedge_handle e);
/*! issued just before a vertex `v` is modified to be associated with the point
* `p`.
*/
virtual void before_modify_vertex(Vertex_handle v, const Point_2& p);
/*! issued immediately after an existing vertex `v` has been modified. */
virtual void after_modify_vertex(Vertex_handle v);
/*! issued just before an edge `e` is modified to be associated with the
* \f$x\f$-monotone curve `c`.
*/
virtual void before_modify_edge(Halfedge_handle e,
const X_monotone_curve_2& c);
/*! issued immediately after an existing edge `e` has been modified. */
virtual void after_modify_edge(Halfedge_handle e);
/*! issued just before an edge `e` is split into two edges that should be
* associated with the \f$x\f$-monotone curves `c1` and `c2`. The vertex `v`
* corresponds to the split point, and will be used to separate the two
* resulting edges.
*/
virtual void before_split_edge(Halfedge_handle e, Vertex_handle v,
const X_monotone_curve_2& c1,
const X_monotone_curve_2& c2);
/*! issued immediately after an existing edge has been split into the two
* given edges `e1` and `e2`.
*/
virtual void after_split_edge(Halfedge_handle e1, Halfedge_handle e2);
/*! issued just before a fictitious edge `e` is split into two. The vertex at
* infinity `v` corresponds to the split point, and will be used to separate
* the two resulting edges.
*/
virtual void before_split_fictitious_edge(Halfedge_handle e, Vertex_handle v);
/*! issued immediately after an existing fictitious edge has been split into
* the two given fictitious edges `e1` and `e2`.
*/
virtual void after_split_fictitious_edge(Halfedge_handle e1,
Halfedge_handle e2);
/*! issued just before a face `f` is split into two, as a result of the
* insertion of the edge `e` into the arrangement.
*/
virtual void before_split_face(Face_handle f, Halfedge_handle e);
/*! issued immediately after the existing face `f1` has been split, such that
* a portion of it now forms a new face `f2`. The flag `is_hole` designates
* whether `f2` forms a hole (an inner CCB) inside `f1`.
*/
virtual void after_split_face(Face_handle f1, Face_handle f2, bool is_hole);
/*! issued just before outer CCB `h` inside a face `f` is split into two, as a
* result of the removal of the edge `e` from the arrangement.
*/
virtual void before_split_outer_ccb(Face_handle f, Ccb_halfedge_circulator h,
Halfedge_handle e);
/*! issued immediately after an outer CCB of the face `f` has been split,
* resulting in the two holes `h1` and `h2`.
*/
virtual void after_split_outer_ccb(Face_handle f,
Ccb_halfedge_circulator h1,
Ccb_halfedge_circulator h2);
/*! issued just before an inner CCB `h` inside a face `f` is split into two,
* as a result of the removal of the edge `e` from the arrangement.
*/
virtual void before_split_inner_ccb(Face_handle f, Ccb_halfedge_circulator h,
Halfedge_handle e);
/*! issued immediately after an inner CCB of the face `f` has been split,
* resulting in the two inner CCBs (holes) `h1` and `h2`.
*/
virtual void after_split_inner_ccb(Face_handle f,
Ccb_halfedge_circulator h1,
Ccb_halfedge_circulator h2);
/*! issued just before the edge `e` is inserted as a new outer CCB inside the
* face `f`.
*/
virtual void before_add_outer_ccb(Face_handle f, Halfedge_handle e);
/*! issued immediately after a new outer ccb `h` has been created. The outer
* ccb always consists of a single pair of twin halfedges.
*/
virtual void after_add_outer_ccb(Ccb_halfedge_circulator h);
/*! issued just before the edge `e` is inserted as a new inner CCB inside the
* face `f`.
*/
virtual void before_add_inner_ccb(Face_handle f, Halfedge_handle e);
/*! issued immediately after a new inner CCB `h` has been created. The inner
* CCB always consists of a single pair of twin halfedges.
*/
virtual void after_add_inner_ccb(Ccb_halfedge_circulator h);
/*! issued just before the vertex `v` is inserted as an isolated vertex inside
* the face `f`.
*/
virtual void before_add_isolated_vertex(Face_handle f, Vertex_handle v);
/*! issued immediately after the vertex `v` has been set as an isolated vertex.
*/
virtual void after_add_isolated_vertex(Vertex_handle v);
/*! issued just before the two edges `e1` and `e2` are merged to form a single
* edge that will be associated with the \f$x\f$-monotone curve `c`.
*/
virtual void before_merge_edge(Halfedge_handle e1, Halfedge_handle e2,
const X_monotone_curve_2& c);
/*! issued immediately after two edges have been merged to form the edge `e`.
*/
virtual void after_merge_edge(Halfedge_handle e);
/*! issued just before the two fictitious edges `e1` and `e2` are merged to
* form a single fictitious edge.
*/
virtual void before_merge_fictitious_edge(Halfedge_handle e1,
Halfedge_handle e2);
/*! issued immediately after two fictitious edges have been merged to form the
* fictitious edge `e`.
*/
virtual void after_merge_fictitious_edge(Halfedge_handle e);
/*! issued just before the two edges `f1` and `f2` are merged to form a single
* face, following the removal of the edge `e` from the arrangement.
*/
virtual void before_merge_face(Face_handle f1, Face_handle f2,
Halfedge_handle e);
/*! issued immediately after two faces have been merged to form the face `f`.
*/
virtual void after_merge_face(Face_handle f);
/*! issued just before two outer ccbs `h1` and `h2` inside the face `f` are
* merged to form a single connected component, following the insertion of the
* edge `e` into the arrangement.
*/
virtual void before_merge_outer_ccb(Face_handle f,
Ccb_halfedge_circulator h1,
Ccb_halfedge_circulator h2,
Halfedge_handle e);
/*! issued immediately after two outer cCBs have been merged to form a single
* outer CCB `h` inside the face `f`.
*/
virtual void after_merge_outer_ccb(Face_handle f, Ccb_halfedge_circulator h);
/*! issued just before two inner CCBs `h1` and `h2` inside the face `f` are
* merged to form a single connected component, following the insertion of the
* edge `e` into the arrangement.
*/
virtual void before_merge_inner_ccb(Face_handle f,
Ccb_halfedge_circulator h1,
Ccb_halfedge_circulator h2,
Halfedge_handle e);
/*! issued immediately after two inner CCBs have been merged to form a single
* inner CCB `h` inside the face `f`.
*/
virtual void after_merge_inner_ccb(Face_handle f, Ccb_halfedge_circulator h);
/*! issued just before the outer CCB `h` is moved from one face to another.
* This can happen if the face `to_f` containing the outer CCB has just been
* split from `from_f`.
*/
virtual void before_move_outer_ccb(Face_handle from_f, Face_handle to_f,
Ccb_halfedge_circulator h);
/*! issued immediately after the outer CCB `h` has been moved to a new face.
*/
virtual void after_move_outer_ccb(Ccb_halfedge_circulator h);
/*! issued just before the inner CCB `h` is moved from one face to another.
* This can happen if the face `to_f` containing the inner CCB has just been
* split from `from_f`.
*/
virtual void before_move_inner_ccb(Face_handle from_f, Face_handle to_f,
Ccb_halfedge_circulator h);
/*! issued immediately after the inner CCB `h` has been moved to a new face.
*/
virtual void after_move_inner_ccb(Ccb_halfedge_circulator h);
/*! issued just before the isolated vertex `v` is moved from one face to
* another. This can happen if the face `to_f` containing the isolated vertex
* has just been split from `from_f`.
*/
virtual void before_move_isolated_vertex(Face_handle from_f,
Face_handle to_f, Vertex_handle v);
/*! issued immediately after the isolated vertex `v` has been moved to a new
* face.
*/
virtual void after_move_isolated_vertex(Vertex_handle v);
/*! issued just before the vertex `v` is removed from the arrangement. */
virtual void before_remove_vertex(Vertex_handle v);
/*! issued immediately after a vertex has been removed (and deleted) from the
* arrangement.
*/
virtual void after_remove_vertex();
/*! issued just before the edge `e` is removed from the arrangement. */
virtual void before_remove_edge(Halfedge_handle e);
/*! issued immediately after an edge has been removed (and deleted) from the
* arrangement.
*/
virtual void after_remove_edge();
/*! issued just before the outer ccb `f` is removed from inside the face `f`.
*/
virtual void before_remove_outer_ccb(Face_handle f, Ccb_halfedge_circulator h);
/*! issued immediately after a outer CCB has been removed (and deleted) from
* inside the face `f`.
*/
virtual void after_remove_outer_ccb(Face_handle f);
/*! issued just before the inner CCB `f` is removed from inside the face `f`.
*/
virtual void before_remove_inner_ccb(Face_handle f,
Ccb_halfedge_circulator h);
/*! issued immediately after a inner CCB has been removed (and deleted) from
* inside the face `f`.
*/
virtual void after_remove_inner_ccb(Face_handle f);
/// @}
}; /* end Aos_observer */
} /* end namespace CGAL */

View File

@ -9,13 +9,13 @@ namespace CGAL {
*
* The `Arr_bounded_planar_topology_traits_2` template has two parameters:
* <UL>
* <LI>The `GeometryTraits_2` template-parameter should be instantiated with
* <LI>The `GeometryTraits_2` template-parameter should be substituted by
* a model of the `ArrangementBasicTraits_2` concept. The traits
* class defines the types of \f$x\f$-monotone curves and two-dimensional
* points, namely `ArrangementBasicTraits_2::X_monotone_curve_2` and
* `ArrangementBasicTraits_2::Point_2`,
* respectively, and supports basic geometric predicates on them.
* <LI>The `Dcel` template-parameter should be instantiated with
* <LI>The `Dcel` template-parameter should be substituted by
* a class that is a model of the `ArrangementDcel` concept. The
* value of this parameter is by default
* `Arr_default_dcel<Traits>`.

View File

@ -57,17 +57,17 @@ namespace CGAL {
* algebraic number of degree \f$d\f$ if there exist a polynomial \f$ p\f$ with
* <I>integer</I> coefficient of degree \f$d\f$ such that \f$p(\alpha) = 0\f$).
* We therefore require separate representations of the curve
* coefficients and the point coordinates. The `NtTraits` should be instantiated
* with a class that defines nested `Integer`, `Rational`, and `Algebraic` number
* coefficients and the point coordinates. The `NtTraits` should be substituted
* by a class that defines nested `Integer`, `Rational`, and `Algebraic` number
* types and supports various operations on them, yielding certified computation
* results (for example, it can convert rational numbers to algebraic numbers
* and can compute roots of polynomials with integer coefficients). The other
* template parameters, `RatKernel` and `AlgKernel` should be geometric kernels
* instantiated with the `NtTraits::Rational` and `NtTraits::Algebraic` number
* types, respectively. It is recommended instantiating the
* `CORE_algebraic_number_traits` class as the `NtTraits` parameter, with
* `Cartesian<NtTraits::Rational>` and `Cartesian<NtTraits::Algebraic>`
* instantiating the two kernel types, respectively. The number types in this
* types, respectively. It is recommended substituting the
* `CORE_algebraic_number_traits` class for the `NtTraits` parameter, and
* the `Cartesian<NtTraits::Rational>` and `Cartesian<NtTraits::Algebraic>`
* instances for two kernel types, respectively. The number types in this
* case are provided by the \core library, with its ability to exactly represent
* simple algebraic numbers.
*

View File

@ -0,0 +1,39 @@
namespace CGAL {
/*! \ingroup PkgArrangementOnSurface2DCEL
*
* The \dcel class used by the `Arrangement_2`,
* `Arr_bounded_planar_topology_traits_2`, `Arr_unb_planar_topology_traits_2`
* class templates and other templates. It is parameterized by a geometry
* traits type and optionaly by a vertex, halfedge, or face types. By default,
* the `Arr_dcel` class template uses the \link
* ArrangementBasicTraits_2::Point_2 `Point_2`\endlink and \link
* ArrangementBasicTraits_2::X_monotone_curve_2 `X_monotone_curve_2`\endlink
* types nested in the traits type to instantiate the vertex and base halfedge
* types, respectively. Thus, by default the \dcel only stores the topological
* incidence relations and the geometric data attached to vertices and
* edges. Any one of the vertex, halfedge, or face types can be
* overriden. Notice that if the vertex and halfedge types are overriden, the
* traits type is ignored.
*
* \cgalModels{ArrangementDcelWithRebind}
*
* \tparam Traits a geometry traits type, which is a model of the
* `ArrangementBasicTraits_2` concept.
* \tparam V the vertex type, which is a model of the `ArrangementDcelVertex`
* concept.
* \tparam H the halfedge type, which is a model of the
* `ArrangementDcelHalfedge` concept.
* \tparam F the face type, which is a model of the `ArrangementDcelFace`
* concept.
*
* \sa `Arr_dcel_base<V, H, F>`
*/
template <typename Traits,
typename V = Arr_vertex_base<typename Traits::Point_2>,
typename H = Arr_halfedge_base<typename Traits::X_monotone_curve_2>,
typename F = Arr_face_base>
class Arr_dcel : public Arr_dcel_base<V, H, F> {
};
} /* end namespace CGAL */

View File

@ -1,26 +1,25 @@
namespace CGAL {
/*!
\ingroup PkgArrangementOnSurface2DCEL
/*! \ingroup PkgArrangementOnSurface2DCEL
*
* The default \dcel class used by the `Arrangement_2`,
* `Arr_bounded_planar_topology_traits_2`, `Arr_unb_planar_topology_traits_2`
* class templates and other templates. It is parameterized by a geometry
* traits type. It uses the \link ArrangementBasicTraits_2::Point_2
* `Point_2`\endlink and \link ArrangementBasicTraits_2::X_monotone_curve_2
* `X_monotone_curve_2`\endlink types nested in the traits type to instantiate
* the vertex and base halfedge types, respectively. Thus, by default the \dcel
* only stores the topological incidence relations and the geometric data
* attached to vertices and edges.
*
* \cgalModels{ArrangementDcelWithRebind}
*
* \tparam Traits a geometry traits type, which is a model of the
* `ArrangementBasicTraits_2` concept.
*
* \sa `Arr_dcel<Traits, V, H, F>`
* \sa `Arr_dcel_base<V, H, F>`
*/
template <typename Traits> using Arr_default_dcel = Arr_dcel<Traits>;
The default \dcel class used by the `Arrangement_2` class-template
is parameterized by a traits class, which is a model of the
`ArrangementBasicTraits_2` concept. It simply uses the nested
`Traits::Point_2` and `Traits::X_monotone_curve_2` to instantiate
the base vertex and halfedge types, respectively. Thus, the default
\dcel records store no other information, except for the topological
incidence relations and the geometric data attached to vertices and edges.
\cgalModels{ArrangementDcelWithRebind}
\sa `Arr_dcel_base<V,H,F>`
*/
template< typename Traits >
class Arr_default_dcel :
public Arr_dcel_base< Arr_vertex_base<typename Traits_::Point_2>,
Arr_halfedge_base<typename Traits_::X_monotone_curve_2>,
Arr_face_base>
{
}; /* end Arr_default_dcel */
} /* end namespace CGAL */

Some files were not shown because too many files have changed in this diff Show More