1 /* 2 * Copyright (c) 2012-2014, Bruno Levy 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * * Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * * Neither the name of the ALICE Project-Team nor the names of its 14 * contributors may be used to endorse or promote products derived from this 15 * software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 * POSSIBILITY OF SUCH DAMAGE. 28 * 29 * If you modify this software, you should include a notice giving the 30 * name of the person performing the modification, the date of modification, 31 * and the reason for such modification. 32 * 33 * Contact: Bruno Levy 34 * 35 * Bruno.Levy@inria.fr 36 * http://www.loria.fr/~levy 37 * 38 * ALICE Project 39 * LORIA, INRIA Lorraine, 40 * Campus Scientifique, BP 239 41 * 54506 VANDOEUVRE LES NANCY CEDEX 42 * FRANCE 43 * 44 */ 45 46 #ifndef GEOGRAM_POINTS_COLOCATE 47 #define GEOGRAM_POINTS_COLOCATE 48 49 #include <geogram/basic/common.h> 50 #include <geogram/basic/geometry.h> 51 #include <vector> 52 53 /** 54 * \file geogram/points/colocate.h 55 * \brief Functions to merge points with identical or similar locations 56 */ 57 58 namespace GEO { 59 60 namespace Geom { 61 62 /** 63 * \brief Finds sets of identical points in a point set. 64 * \param[in] points the point array 65 * \param[in] dim dimension of the points 66 * \param[in] nb_points number of points 67 * \param[out] old2new an array of size nb_points. 68 * \param[in] tolerance threshold for colocating points. 69 * \param[in] stride number of doubles between two consecutive 70 * points (set to dim if unspecified). 71 * \param[in] nn_algo factory name for nearest neighbor search. 72 * \return the number of unique points 73 */ 74 index_t GEOGRAM_API colocate( 75 const double* points, 76 coord_index_t dim, 77 index_t nb_points, 78 vector<index_t>& old2new, 79 double tolerance = 0.0, 80 index_t stride = 0, 81 const std::string& nn_algo = "default" 82 ); 83 84 /** 85 * \brief Finds sets of identical points in a point set. 86 * \details This version uses a lexicographic sort. It does not 87 * have a 'tolerance' parameter (only points with exactly 88 * the same coordinates can be colocated). 89 * \param[in] points the point array 90 * \param[in] dim dimension of the points 91 * \param[in] nb_points number of points 92 * \param[out] old2new an array of size nb_points. 93 * \param[in] stride number of doubles between two consecutive 94 * points (set to dim if unspecified). 95 * \return the number of unique points 96 */ 97 index_t GEOGRAM_API colocate_by_lexico_sort( 98 const double* points, 99 coord_index_t dim, 100 index_t nb_points, 101 vector<index_t>& old2new, 102 index_t stride 103 ); 104 } 105 } 106 107 #endif 108 109