File: icosahedron.cpp

package info (click to toggle)
bornagain 1.18.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 118,800 kB
  • sloc: cpp: 469,684; python: 38,920; xml: 805; awk: 630; sh: 286; ansic: 37; makefile: 25
file content (81 lines) | stat: -rw-r--r-- 3,151 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// ************************************************************************** //
//
//  BornAgain: simulate and fit scattering at grazing incidence
//
//! @file      GUI/ba3d/model/geometry/icosahedron.cpp
//! @brief     Implements utility functions in ba3d namespace
//!
//! @homepage  http://www.bornagainproject.org
//! @license   GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
// ************************************************************************** //

#include "Base/Utils/Assert.h"
#include "GUI/ba3d/model/geometry.h"
#include <QQuaternion>
#include <qmath.h>

namespace RealSpace
{

Geometry::Mesh Geometry::meshIcosahedron()
{
    Vertices vs_(12); // 12 vertices of the icosahedron retrieved from Icosahedron.cpp

    const float E = 1.0; // edge

    vs_[0] = Vector3D(-0.57735026918962573f * E, 0.0f * E, 0.0f);
    vs_[1] = Vector3D(0.28867513459481281f * E, 0.5f * E, 0.0f);
    vs_[2] = Vector3D(0.28867513459481281f * E, -0.5f * E, 0.0f);
    vs_[3] = Vector3D(0.93417235896271578f * E, 0.0f * E, 0.57735026918962562f * E);
    vs_[4] =
        Vector3D(-0.46708617948135783f * E, 0.80901699437494756f * E, 0.57735026918962562f * E);
    vs_[5] =
        Vector3D(-0.46708617948135783f * E, -0.80901699437494756f * E, 0.57735026918962562f * E);
    vs_[6] = Vector3D(-0.93417235896271578f * E, 0.0f * E, 0.93417235896271589f * E);
    vs_[7] = Vector3D(0.46708617948135783f * E, 0.80901699437494756f * E, 0.93417235896271589f * E);
    vs_[8] =
        Vector3D(0.46708617948135783f * E, -0.80901699437494756f * E, 0.93417235896271589f * E);
    vs_[9] = Vector3D(0.57735026918962573f * E, 0.0f * E, 1.5115226281523415f * E);
    vs_[10] = Vector3D(-0.28867513459481281f * E, 0.5f * E, 1.5115226281523415f * E);
    vs_[11] = Vector3D(-0.28867513459481281f * E, -0.5f * E, 1.5115226281523415f * E);

    ASSERT(12 == vs_.count());

    Vertices vs;
    vs.reserve(60);

    // lower half of the icosahedron (clockwise ordering of vertices)
    vs.addTriangle(vs_[0], vs_[1], vs_[2]);
    vs.addTriangle(vs_[0], vs_[4], vs_[1]);
    vs.addTriangle(vs_[1], vs_[3], vs_[2]);
    vs.addTriangle(vs_[2], vs_[5], vs_[0]);

    vs.addTriangle(vs_[0], vs_[6], vs_[4]);
    vs.addTriangle(vs_[4], vs_[7], vs_[1]);
    vs.addTriangle(vs_[1], vs_[7], vs_[3]);
    vs.addTriangle(vs_[3], vs_[8], vs_[2]);
    vs.addTriangle(vs_[8], vs_[5], vs_[2]);
    vs.addTriangle(vs_[5], vs_[6], vs_[0]);

    // upper half of the icosahedron (couter clockwise ordering of vertices)
    vs.addTriangle(vs_[11], vs_[6], vs_[5]);
    vs.addTriangle(vs_[8], vs_[11], vs_[5]);
    vs.addTriangle(vs_[9], vs_[8], vs_[3]);
    vs.addTriangle(vs_[9], vs_[3], vs_[7]);
    vs.addTriangle(vs_[10], vs_[7], vs_[4]);
    vs.addTriangle(vs_[6], vs_[10], vs_[4]);

    vs.addTriangle(vs_[10], vs_[6], vs_[11]);
    vs.addTriangle(vs_[9], vs_[11], vs_[8]);
    vs.addTriangle(vs_[9], vs_[7], vs_[10]);
    vs.addTriangle(vs_[9], vs_[10], vs_[11]);

    ASSERT(60 == vs.count());

    return makeMesh(vs);
}

} // namespace RealSpace