OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
Triangle.cpp
Go to the documentation of this file.
2#include "Physics/Units.h"
3
4namespace mslang {
5 void Triangle::print(int indentwidth) {
6 std::string indent(indentwidth, ' ');
7 std::string indentbase(4, ' ');
9 double angle = trafo_m.getAngle() * Units::rad2deg;
10
11 std::cout << indent << "triangle, \n";
12
13 for (unsigned int i = 0; i < 3u; ++i) {
14 std::cout << indent << indentbase << "node " << i << ": " << nodes_m[i] << "\n";
15 }
16 std::cout << indent << indentbase << "origin: " << origin[0] << ", " << origin[1] << ",\n"
17 << indent << indentbase << "angle: " << angle << "\n"
18 << indent << indentbase << trafo_m(0, 0) << "\t" << trafo_m(0, 1) << "\t"
19 << trafo_m(0, 2) << "\n"
20 << indent << indentbase << trafo_m(1, 0) << "\t" << trafo_m(1, 1) << "\t"
21 << trafo_m(1, 2) << "\n"
22 << indent << indentbase << trafo_m(2, 0) << "\t" << trafo_m(2, 1) << "\t"
23 << trafo_m(2, 2) << std::endl;
24 }
25 void Triangle::apply(std::vector<std::shared_ptr<Base>>& bfuncs) {
26 bfuncs.emplace_back(this->clone());
27 }
28
29 std::shared_ptr<Base> Triangle::clone() const {
30 std::shared_ptr<Triangle> tri(new Triangle(*this));
31 tri->trafo_m = trafo_m;
32 tri->bb_m = bb_m;
33
34 for (auto item : divisor_m) {
35 tri->divisor_m.emplace_back(item->clone());
36 }
37
38 return std::static_pointer_cast<Base>(tri);
39 }
40
41 void Triangle::writeGnuplot(std::ofstream& out) const {
42 unsigned int width = out.precision() + 8;
43
44 for (unsigned int i = 0; i < 4u; ++i) {
46
47 out << std::setw(width) << corner[0] << std::setw(width) << corner[1] << std::endl;
48 }
49 out << std::endl;
50
51 for (auto item : divisor_m) {
52 item->writeGnuplot(out);
53 }
54
55 // bb_m.writeGnuplot(out);
56 }
57
59 std::vector<Vector_t<double, 3>> corners;
60 for (unsigned int i = 0; i < 3u; ++i) {
61 corners.push_back(trafo_m.transformFrom(nodes_m[i]));
62 }
63
64 Vector_t<double, 3> llc = corners[0], urc = corners[0];
65 for (unsigned int i = 1u; i < 3u; ++i) {
66 if (corners[i][0] < llc[0])
67 llc[0] = corners[i][0];
68 else if (corners[i][0] > urc[0])
69 urc[0] = corners[i][0];
70
71 if (corners[i][1] < llc[1])
72 llc[1] = corners[i][1];
73 else if (corners[i][1] > urc[1])
74 urc[1] = corners[i][1];
75 }
76
77 bb_m = BoundingBox2D(llc, urc);
78
79 for (auto item : divisor_m) {
80 item->computeBoundingBox();
81 }
82 }
83
84 double Triangle::crossProduct(const Vector_t<double, 3>& pt, unsigned int nodeNum) const {
85 nodeNum = nodeNum % 3u;
86 unsigned int nextNode = (nodeNum + 1) % 3u;
87 Vector_t<double, 3> nodeToPt = pt - nodes_m[nodeNum];
88 Vector_t<double, 3> nodeToNext = nodes_m[nextNode] - nodes_m[nodeNum];
89
90 return nodeToPt[0] * nodeToNext[1] - nodeToPt[1] * nodeToNext[0];
91 }
92
95
96 bool test0 = (crossProduct(X, 0) <= 0.0);
97 bool test1 = (crossProduct(X, 1) <= 0.0);
98 bool test2 = (crossProduct(X, 2) <= 0.0);
99
100 if (!(test0 && test1 && test2)) return false;
101
102 for (auto item : divisor_m)
103 if (item->isInside(R)) return false;
104
105 return true;
106 }
107
109 if (crossProduct(nodes_m[0], 1) > 0.0) {
110 std::swap(nodes_m[1], nodes_m[2]);
111 }
112 }
113} // namespace mslang
ippl::Vector< T, Dim > Vector_t
constexpr double rad2deg
Definition Units.h:146
Vector_t< double, 3 > transformFrom(const Vector_t< double, 3 > &v) const
Vector_t< double, 3 > getOrigin() const
Vector_t< double, 3 > transformTo(const Vector_t< double, 3 > &v) const
std::vector< std::shared_ptr< Base > > divisor_m
Definition MSLang.h:40
AffineTransformation trafo_m
Definition MSLang.h:38
BoundingBox2D bb_m
Definition MSLang.h:39
std::vector< Vector_t< double, 3 > > nodes_m
Definition Triangle.h:8
virtual void computeBoundingBox()
Definition Triangle.cpp:58
void orientNodesCCW()
Definition Triangle.cpp:108
virtual std::shared_ptr< Base > clone() const
Definition Triangle.cpp:29
virtual bool isInside(const Vector_t< double, 3 > &R) const
Definition Triangle.cpp:93
virtual void print(int indentwidth)
Definition Triangle.cpp:5
virtual void writeGnuplot(std::ofstream &out) const
Definition Triangle.cpp:41
double crossProduct(const Vector_t< double, 3 > &pt, unsigned int nodeNum) const
Definition Triangle.cpp:84
virtual void apply(std::vector< std::shared_ptr< Base > > &bfuncs)
Definition Triangle.cpp:25