829{
830
832 for(
unsigned i=0; i<
m_faces.size(); ++i)
833 {
835 for(unsigned j=0; j<3; ++j)
836 {
837 unsigned vertex_id = f.adjacent_vertices()[j]->id();
840 }
841 }
842
844 {
846 unsigned num_adjacent_faces =
count[i];
847
849 num_adjacent_faces);
850 }
851
853 for(
unsigned i=0; i<
m_faces.size(); ++i)
854 {
856 for(unsigned j=0; j<3; ++j)
857 {
859 v->adjacent_faces()[
count[v->id()]++] = &f;
860 }
861 }
862
863
864
865 std::vector<HalfEdge> half_edges(
m_faces.size()*3);
866 unsigned k = 0;
867 for(
unsigned i=0; i<
m_faces.size(); ++i)
868 {
870 for(unsigned j=0; j<3; ++j)
871 {
872 half_edges[k].face_id = i;
873 unsigned vertex_id_1 = f.adjacent_vertices()[j]->id();
874 unsigned vertex_id_2 = f.adjacent_vertices()[(j+1) % 3]->id();
875 half_edges[k].vertex_0 = std::min(vertex_id_1, vertex_id_2);
876 half_edges[k].vertex_1 = std::max(vertex_id_1, vertex_id_2);
877
878 k++;
879 }
880 }
881 std::sort(half_edges.begin(), half_edges.end());
882
883 unsigned number_of_edges = 1;
884 for(unsigned i=1; i<half_edges.size(); ++i)
885 {
886 if(half_edges[i] != half_edges[i-1])
887 {
888 ++number_of_edges;
889 }
890 else
891 {
892 if(i<half_edges.size()-1)
893 {
894 assert(half_edges[i] != half_edges[i+1]);
895 }
896 }
897 }
898
899
900 m_edges.resize(number_of_edges);
901 unsigned edge_id = 0;
902 for(unsigned i=0; i<half_edges.size();)
903 {
905 e.id() = edge_id++;
906
908
909 e.adjacent_vertices()[0] = &
m_vertices[half_edges[i].vertex_0];
910 e.adjacent_vertices()[1] = &
m_vertices[half_edges[i].vertex_1];
911
912 e.length() = e.adjacent_vertices()[0]->distance(e.adjacent_vertices()[1]);
913 assert(e.length() > 1e-100);
914
915 if(i != half_edges.size()-1 && half_edges[i] == half_edges[i+1])
916 {
918 e.adjacent_faces()[0] = &
m_faces[half_edges[i].face_id];
919 e.adjacent_faces()[1] = &
m_faces[half_edges[i+1].face_id];
920 i += 2;
921 }
922 else
923 {
925 e.adjacent_faces()[0] = &
m_faces[half_edges[i].face_id];
926 i += 1;
927 }
928 }
929
930
932 for(
unsigned i=0; i<
m_edges.size(); ++i)
933 {
935 assert(e.adjacent_vertices().size()==2);
936 count[e.adjacent_vertices()[0]->id()]++;
937 count[e.adjacent_vertices()[1]->id()]++;
938 }
940 {
943 }
945 for(
unsigned i=0; i<
m_edges.size(); ++i)
946 {
948 for(unsigned j=0; j<2; ++j)
949 {
951 v->adjacent_edges()[
count[v->id()]++] = &e;
952 }
953 }
954
955
956 for(
unsigned i=0; i<
m_faces.size(); ++i)
957 {
959 }
960
963 for(
unsigned i=0; i<
m_edges.size(); ++i)
964 {
966 for(
unsigned j=0; j<e.adjacent_faces().
size(); ++j)
967 {
969 assert(
count[f->id()]<3);
970 f->adjacent_edges()[
count[f->id()]++] = &e;
971 }
972 }
973
974
975 for(
unsigned i=0; i<
m_faces.size(); ++i)
976 {
980 for(unsigned j=0; j<3; ++j)
981 {
982 for(unsigned k=0; k<3; ++k)
983 {
985 abc[k] = f.opposite_edge(v)->length();
986 }
987
989 assert(angle>1e-5);
990
991 f.corner_angles()[j] =
angle;
993 }
995 }
996
997
998 std::vector<double> total_vertex_angle(
m_vertices.size());
999 for(
unsigned i=0; i<
m_faces.size(); ++i)
1000 {
1002 for(unsigned j=0; j<3; ++j)
1003 {
1005 total_vertex_angle[v->id()] += f.corner_angles()[j];
1006 }
1007 }
1008
1010 {
1012 v.saddle_or_boundary() = (total_vertex_angle[v.id()] > 2.0*
igl::PI - 1e-5);
1013 }
1014
1015 for(
unsigned i=0; i<
m_edges.size(); ++i)
1016 {
1018 if(e.is_boundary())
1019 {
1020 e.adjacent_vertices()[0]->saddle_or_boundary() = true;
1021 e.adjacent_vertices()[1]->saddle_or_boundary() = true;
1022 }
1023 }
1024
1026}
face_pointer_vector & adjacent_faces()
Definition exact_geodesic.cpp:348
vertex_pointer_vector & adjacent_vertices()
Definition exact_geodesic.cpp:346
std::vector< Vertex > m_vertices
Definition exact_geodesic.cpp:722
bool verify()
Definition exact_geodesic.cpp:1028
std::vector< Edge > m_edges
Definition exact_geodesic.cpp:723
void_pointer allocate_pointers(unsigned n)
Definition exact_geodesic.cpp:717
std::vector< Face > m_faces
Definition exact_geodesic.cpp:724
double angle(const Eigen::MatrixBase< Derived > &v1, const Eigen::MatrixBase< Derived2 > &v2)
Definition Point.hpp:112
constexpr auto size(const C &c) -> decltype(c.size())
Definition span.hpp:183
double angle_from_edges(double const a, double const b, double const c)
Definition exact_geodesic.cpp:53
Face * face_pointer
Definition exact_geodesic.cpp:282
Vertex * vertex_pointer
Definition exact_geodesic.cpp:280
IGL_INLINE void count(const Eigen::SparseMatrix< XType > &X, const int dim, Eigen::SparseVector< SType > &S)
Definition count.cpp:12
const double PI
Definition PI.h:16
IGL_INLINE void sum(const Eigen::SparseMatrix< T > &X, const int dim, Eigen::SparseVector< T > &S)
Definition sum.cpp:12