OPAL (Object Oriented Parallel Accelerator Library) 2022.1
OPAL
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, ' ');
8 Vector_t origin = trafo_m.getOrigin();
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" << trafo_m(0, 2) << "\n"
19 << indent << indentbase << trafo_m(1, 0) << "\t" << trafo_m(1, 1) << "\t" << trafo_m(1, 2) << "\n"
20 << indent << indentbase << trafo_m(2, 0) << "\t" << trafo_m(2, 1) << "\t" << trafo_m(2, 2) << std::endl;
21 }
22 void Triangle::apply(std::vector<std::shared_ptr<Base> > &bfuncs) {
23 bfuncs.emplace_back(this->clone());
24 }
25
26 std::shared_ptr<Base> Triangle::clone() const {
27 std::shared_ptr<Triangle> tri(new Triangle(*this));
28 tri->trafo_m = trafo_m;
29 tri->bb_m = bb_m;
30
31 for (auto item: divisor_m) {
32 tri->divisor_m.emplace_back(item->clone());
33 }
34
35 return std::static_pointer_cast<Base>(tri);
36 }
37
38 void Triangle::writeGnuplot(std::ofstream &out) const {
39 unsigned int width = out.precision() + 8;
40
41 for (unsigned int i = 0; i < 4u; ++ i) {
42 Vector_t corner = trafo_m.transformFrom(nodes_m[i % 3u]);
43
44 out << std::setw(width) << corner[0]
45 << std::setw(width) << corner[1]
46 << std::endl;
47 }
48 out << std::endl;
49
50 for (auto item: divisor_m) {
51 item->writeGnuplot(out);
52 }
53
54 // bb_m.writeGnuplot(out);
55 }
56
58 std::vector<Vector_t> corners;
59 for (unsigned int i = 0; i < 3u; ++ i) {
60 corners.push_back(trafo_m.transformFrom(nodes_m[i]));
61 }
62
63 Vector_t llc = corners[0], urc = corners[0];
64 for (unsigned int i = 1u; i < 3u; ++ i) {
65 if (corners[i][0] < llc[0]) llc[0] = corners[i][0];
66 else if (corners[i][0] > urc[0]) urc[0] = corners[i][0];
67
68 if (corners[i][1] < llc[1]) llc[1] = corners[i][1];
69 else if (corners[i][1] > urc[1]) urc[1] = corners[i][1];
70 }
71
72 bb_m = BoundingBox2D(llc, urc);
73
74 for (auto item: divisor_m) {
75 item->computeBoundingBox();
76 }
77 }
78
79 double Triangle::crossProduct(const Vector_t &pt, unsigned int nodeNum) const {
80 nodeNum = nodeNum % 3u;
81 unsigned int nextNode = (nodeNum + 1) % 3u;
82 Vector_t nodeToPt = pt - nodes_m[nodeNum];
83 Vector_t nodeToNext = nodes_m[nextNode] - nodes_m[nodeNum];
84
85 return nodeToPt[0] * nodeToNext[1] - nodeToPt[1] * nodeToNext[0];
86
87 }
88
89 bool Triangle::isInside(const Vector_t &R) const {
91
92 bool test0 = (crossProduct(X, 0) <= 0.0);
93 bool test1 = (crossProduct(X, 1) <= 0.0);
94 bool test2 = (crossProduct(X, 2) <= 0.0);
95
96 if (!(test0 && test1 && test2)) return false;
97
98 for (auto item: divisor_m)
99 if (item->isInside(R)) return false;
100
101 return true;
102 }
103
105 if (crossProduct(nodes_m[0], 1) > 0.0) {
106 std::swap(nodes_m[1], nodes_m[2]);
107 }
108 }
109}
#define X(arg)
Definition: fftpack.cpp:112
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
constexpr double rad2deg
Definition: Units.h:146
std::vector< std::shared_ptr< Base > > divisor_m
Definition: MSLang.h:43
AffineTransformation trafo_m
Definition: MSLang.h:41
BoundingBox2D bb_m
Definition: MSLang.h:42
Vector_t transformTo(const Vector_t &v) const
Vector_t transformFrom(const Vector_t &v) const
virtual void computeBoundingBox()
Definition: Triangle.cpp:57
void orientNodesCCW()
Definition: Triangle.cpp:104
virtual std::shared_ptr< Base > clone() const
Definition: Triangle.cpp:26
virtual void print(int indentwidth)
Definition: Triangle.cpp:5
virtual void writeGnuplot(std::ofstream &out) const
Definition: Triangle.cpp:38
virtual bool isInside(const Vector_t &R) const
Definition: Triangle.cpp:89
virtual void apply(std::vector< std::shared_ptr< Base > > &bfuncs)
Definition: Triangle.cpp:22
double crossProduct(const Vector_t &pt, unsigned int nodeNum) const
Definition: Triangle.cpp:79
std::vector< Vector_t > nodes_m
Definition: Triangle.h:8