/******************************************************************************* * CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps * * version 0.1 * * Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg * * * * This library is free software; you can redistribute it and/or modify it * * under the terms of the GNU Lesser General Public License as published by the * * Free Software Foundation; either version 2.1 of the License, or (at your * * option) any later version. * * * * This library is distributed in the hope that it will be useful, but WITHOUT * * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * * for more details. * * * * You should have received a copy of the GNU Lesser General Public License * * along with this library; if not, write to the Free Software Foundation, * * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * * * Web site: http://cgogn.unistra.fr/ * * Contact information: cgogn@unistra.fr * * * *******************************************************************************/ #ifndef __DECIMATION_BASIC_H_ #define __DECIMATION_BASIC_H_ namespace CGoGN { namespace Algo { namespace Decimation { template bool edgeCanCollapse(typename PFP::MAP& map, Dart d, AttributeHandler& valences) { Dart dd = map.phi2(d); Dart dp = map.phi_1(d); Dart ddp = map.phi_1(dd); // Check valency conditions unsigned int val_vd = valences[d]; unsigned int val_vdd = valences[dd]; unsigned int val_vd1 = valences[dp]; unsigned int val_vdd1 = valences[ddp]; if(val_vd + val_vdd < 8 || val_vd + val_vdd > 11 || val_vd1 < 5 || val_vdd1 < 5) return false; // Check vertex sharing condition unsigned int vu1[32]; // pas de vector mais un tableau (find a la main, mais pas d'allocation par reserve) val_vd -= 3; // evite le -3 dans la boucle val_vdd -= 3; Dart vit1 = map.phi2_1(map.phi2_1(d)); for (unsigned int i = 0; i< val_vd; ++i) { unsigned int ve = map.getEmbedding(map.phi2(vit1),VERTEX); vu1[i] = ve; vit1 = map.phi2_1(vit1); } val_vd--; // pour le parcours avec while >=0 Dart vit2 = map.phi2_1(map.phi2_1(dd)); for (unsigned int i = 0; i< val_vdd; ++i) { unsigned int ve = map.getEmbedding(map.phi2(vit2),VERTEX); int j = val_vd; while ( j>=0) { if (vu1[j] == ve) return false; --j; } vit2 = map.phi2_1(vit2); } return true; } template bool edgeCanCollapse(typename PFP::MAP& map, Dart d) { Dart dd = map.phi2(d); Dart dp = map.phi_1(d); Dart ddp = map.phi_1(dd); // Check valency conditions int val_vd = 0 ; Dart tmp = d ; do { ++val_vd ; tmp = map.phi2_1(tmp) ; } while(tmp != d) ; int val_vdd = 0 ; tmp = dd ; do { ++val_vdd ; tmp = map.phi2_1(tmp) ; } while(tmp != dd) ; int val_vdp = 0 ; tmp = dp ; do { ++val_vdp ; tmp = map.phi2_1(tmp) ; } while(tmp != dp) ; int val_vddp = 0 ; tmp = ddp ; do { ++val_vddp ; tmp = map.phi2_1(tmp) ; } while(tmp != ddp) ; if(val_vd + val_vdd < 8 || val_vd + val_vdd > 11 || val_vdp < 5 || val_vddp < 5) return false; // Check vertex sharing condition unsigned int vu1[32]; // pas de vector mais un tableau (find a la main, mais pas d'allocation par reserve) val_vd -= 3; // evite le -3 dans la boucle val_vdd -= 3; Dart vit1 = map.phi2_1(map.phi2_1(d)); for (int i = 0; i < val_vd; ++i) { unsigned int ve = map.getEmbedding(map.phi2(vit1),VERTEX); vu1[i] = ve; vit1 = map.phi2_1(vit1); } val_vd--; // pour le parcours avec while >=0 Dart vit2 = map.phi2_1(map.phi2_1(dd)); for (int i = 0; i < val_vdd; ++i) { unsigned int ve = map.getEmbedding(map.phi2(vit2),VERTEX); int j = val_vd; while (j >= 0) { if (vu1[j] == ve) return false; --j; } vit2 = map.phi2_1(vit2); } return true; } } // namespace Decimation } // namespace Algo } // namespace CGoGN #endif