OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
Triangle.cpp
Go to the documentation of this file.
2 #include "Physics/Physics.h"
3 
4 namespace 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() * Physics::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 = BoundingBox(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 }
Definition: rbendmap.h:8
BoundingBox bb_m
Definition: MSLang.h:42
double crossProduct(const Vector_t &pt, unsigned int nodeNum) const
Definition: Triangle.cpp:79
std::vector< std::shared_ptr< Base > > divisor_m
Definition: MSLang.h:43
constexpr double rad2deg
The conversion factor from radians to degrees.
Definition: Physics.h:46
Vector_t transformFrom(const Vector_t &v) const
virtual bool isInside(const Vector_t &R) const
Definition: Triangle.cpp:89
Vector_t transformTo(const Vector_t &v) const
virtual std::shared_ptr< Base > clone() const
Definition: Triangle.cpp:26
std::vector< Vector_t > nodes_m
Definition: Triangle.h:8
AffineTransformation trafo_m
Definition: MSLang.h:41
virtual void computeBoundingBox()
Definition: Triangle.cpp:57
virtual void writeGnuplot(std::ofstream &out) const
Definition: Triangle.cpp:38
void orientNodesCCW()
Definition: Triangle.cpp:104
virtual void print(int indentwidth)
Definition: Triangle.cpp:5
virtual void apply(std::vector< std::shared_ptr< Base > > &bfuncs)
Definition: Triangle.cpp:22
Inform & endl(Inform &inf)
Definition: Inform.cpp:42