MCPcopy Create free account
hub / github.com/PyMesh/PyMesh / compute_from_mesh

Method compute_from_mesh

src/Attributes/FaceAreaAttribute.cpp:13–123  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

11using namespace PyMesh;
12
13void FaceAreaAttribute::compute_from_mesh(Mesh& mesh) {
14 const size_t dim = mesh.get_dim();
15 const size_t num_faces = mesh.get_num_faces();
16 const size_t num_vertex_per_face = mesh.get_vertex_per_face();
17
18 VectorF& areas = m_values;
19 areas = VectorF::Zero(num_faces);
20 const auto& vertices = mesh.get_vertices();
21 const auto& faces = mesh.get_faces();
22
23 auto compute_2D_triangle_area = [&vertices,&faces](size_t i) {
24 const auto& face = faces.segment<3>(i*3);
25 const auto& v0 = vertices.segment<2>(face[0]*2);
26 const auto& v1 = vertices.segment<2>(face[1]*2);
27 const auto& v2 = vertices.segment<2>(face[2]*2);
28
29 return (v0[0]*v1[1] + v1[0]*v2[1] + v2[0]*v0[1]
30 -v0[1]*v1[0] - v1[1]*v2[0] - v2[1]*v0[0]) * 0.5;
31 };
32 auto compute_3D_triangle_area = [&vertices,&faces](size_t i) {
33 const auto& face = faces.segment<3>(i*3);
34 const auto& v0 = vertices.segment<3>(face[0]*3);
35 const auto& v1 = vertices.segment<3>(face[1]*3);
36 const auto& v2 = vertices.segment<3>(face[2]*3);
37
38 const auto a = (v1-v0).norm();
39 const auto b = (v2-v1).norm();
40 const auto c = (v0-v2).norm();
41 return 0.25 * sqrt(std::max(0.0, (a+b+c) * (-a+b+c) * (a-b+c) * (a+b-c)));
42 };
43 auto compute_2D_quad_area = [&vertices, &faces](size_t i) {
44 const auto& face = faces.segment<4>(i*4);
45 const auto& v0 = vertices.segment<2>(face[0]*2);
46 const auto& v1 = vertices.segment<2>(face[1]*2);
47 const auto& v2 = vertices.segment<2>(face[2]*2);
48 const auto& v3 = vertices.segment<2>(face[3]*2);
49 const Vector2F c = (v0 + v1 + v2 + v3) * 0.25;
50
51 return (c[0]*v1[1] + v1[0]*v2[1] + v2[0]*c[1]
52 -c[1]*v1[0] - v1[1]*v2[0] - v2[1]*c[0] +
53 c[0]*v2[1] + v2[0]*v3[1] + v3[0]*c[1]
54 -c[1]*v2[0] - v2[1]*v3[0] - v3[1]*c[0] +
55 c[0]*v3[1] + v3[0]*v0[1] + v0[0]*c[1]
56 -c[1]*v3[0] - v3[1]*v0[0] - v0[1]*c[0] +
57 c[0]*v0[1] + v0[0]*v1[1] + v1[0]*c[1]
58 -c[1]*v0[0] - v0[1]*v1[0] - v1[1]*c[0]) * 0.5;
59 };
60 auto compute_3D_quad_area = [&vertices, &faces](size_t i) {
61 const auto& face = faces.segment<4>(i*4);
62 const auto& v0 = vertices.segment<3>(face[0]*3);
63 const auto& v1 = vertices.segment<3>(face[1]*3);
64 const auto& v2 = vertices.segment<3>(face[2]*3);
65 const auto& v3 = vertices.segment<3>(face[3]*3);
66 const Vector3F c = (v0 + v1 + v2 + v3) * 0.25;
67
68 return (((v2 - c).cross(v1 - c)).norm() +
69 ((v3 - c).cross(v2 - c)).norm() +
70 ((v0 - c).cross(v3 - c)).norm() +

Callers 1

add_attributeMethod · 0.45

Calls 11

compute_2D_triangle_areaFunction · 0.85
RuntimeErrorClass · 0.85
NotImplementedErrorClass · 0.85
normMethod · 0.80
get_dimMethod · 0.45
get_num_facesMethod · 0.45
get_vertex_per_faceMethod · 0.45
get_verticesMethod · 0.45
get_facesMethod · 0.45
beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected