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