radial_normals_orientation_3() does a radial orientation of the normals of a point set. Normals are oriented towards exterior of the point set.
This very simple and very fast method is intended to convex objects.
- use std::vector when buffer can be reserved in advance and cannot be too large,
- else use std::deque
I expect gains in terms of speed and memory fragmentation.
Examples:
- MFC demo can now load bimba_range_images.off (range images of the Bimba con Nastrino scan, 3.8 millions points).
- Poisson reconstruction is 10 seconds shorter on Chinese_dragon_Minolta_point_set_225kpts_with_jet_normals.xyz.
Fixed potential crash (if application is launched twice) by calling tempnam() to name TAUCS out-of-core files.
Windows specific: fixed crash with TAUCS on large linear systems:
- increased stack size
- added Win32_exception_handler protection to catch stack overflows
- Added Peak_memory_sizer::count_free_memory_blocks() to track memory fragmentation.
- Added back call to Poisson_implicit_function::constrain_one_vertex_on_convex_hull().
Note that Vector_3 is the concept of a normal vector (always) oriented.
- Point_with_normal_3 is now templated by the normal type.
Types currently available are:
-> Vector_3 (the default)
-> Orientable_normal_3 (used by Point_set_3 for point cloud processing)
-> Lightweight_vector_3 = a normal whose vector is allocated only if not zero (used by Poisson 3D triangulation).
We have now 2 corresponding concepts:
-> PointWithNormal_3 = a point + a normal (always) oriented.
-> PointWithOrientableNormal_3 = a point + a normal oriented or not.
The purpose is to save memory space and to better document the requirements of algorithms processing normals.
- Added warnings about remove_outliers_wrt_avg_knn_sq_distance_3(), remove_outliers_wrt_camera_cone_angle_3(), merge_epsilon_nearest_points_3(), random_simplification_points_3() and smooth_jet_fitting_3() which are not compatible with containers sorted wrt points position.
Enforced CGAL_NDEBUG rule:
- code under include/CGAL/ and src/ must not use NDEBUG and assert(), but CGAL_NDEBUG and CGAL assertion macros.
- code under demo/, examples/ and test/ must use NDEBUG and assert().
Added _HAS_ITERATOR_DEBUGGING=0 to .vcproj makefiles to speed up VC++ 2005 debugger.
Removed CGAL_SURFACE_RECONSTRUCTION_CHECK_EXPENSIVE from .vcproj makefiles (unused).
Integrated point set simplification by clustering.
Implemented random point set simplification.
Implemented variant mutating the point set for point set simplification and outliers removal algorithms.
MFC demo:
Point set simplification and outliers removal algorithms select now the points to delete, instead of deleting them directly. This gives a chance to adjust the parameters before deletion.
2 new menu items related: "Delete selection" and "Reset selection".
Normals orientation algorithms select now flipped normals.
Fixed bug in merge_epsilon_nearest_points_3().
Things like "CGAL_assertion(denominator != 0)" produced assertion failures for no gain.
So now, the assertion is triggered only if the condition is certain, using CGAL::certainly().
That is, change the following in all assertion files :
((EX)?(static_cast<void>(0)): ::CGAL::assertion_fail( # EX , __FILE__, __LINE__))
to :
(CGAL::certainly(EX)?(static_cast<void>(0)): ::CGAL::assertion_fail( # EX , __FILE__, __LINE__))
- The Surface_mesher distance parameter is set to 0.005 for APSS (0.002 for Poisson). Both values are editable in the Options dialog.
- Removed the "APPS projection error" field in the Options dialog (unused).
- APSS kd-tree contains Point_with_normal_3 points instead of Gyroviz_point_3 objects (faster copy constructor).
- The number of neighbors is 7 by default (was 10).
- APSS caches the previous nearest neighbor to speed up the isValid() method (test if close to surface).
- If point is far from surface, APSS computes only the nearest neighbor (used to compute twice K nearest neighbors).
- added Implicit_fct_delaunay_triangulation_3::input_points_bounding_box() (resp. sphere)
- these methods are called by Poisson_implicit_function::bounding_box() (resp. sphere), which are now accurate
- no need anymore to divide by 2 the bounding sphere radius (which cashed the Surface Mesher)