68 virtual bool isInterior(Vector3d pos) {
return false; }
69 virtual std::pair<Vector3d, Vector3d> getBoundingBox() {
70 Vector3d bMax = facets_[0].vertex1();
71 Vector3d bMin = facets_[0].vertex1();
73 for (
auto& t : facets_) {
74 for (
int i = 0; i < 3; i++) {
75 bMax[i] = max(bMax[i], t.vertex1()[i]);
76 bMin[i] = min(bMin[i], t.vertex1()[i]);
77 bMax[i] = max(bMax[i], t.vertex2()[i]);
78 bMin[i] = min(bMin[i], t.vertex2()[i]);
79 bMax[i] = max(bMax[i], t.vertex3()[i]);
80 bMin[i] = min(bMin[i], t.vertex3()[i]);
83 return make_pair(bMax, bMin);
85 virtual bool hasAnalyticalSolution() {
return false; }
86 virtual HydroProp* getHydroProp(RealType viscosity) {
88 props->setCenterOfResistance(V3Zero);
89 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
90 "Mesh was asked to return an analytic HydroProps.\n");
91 painCave.severity = OPENMD_ERROR;
96 virtual Vector3d getOrigin() {
return Vector3d(0.0); }
97 virtual bool isComposite() {
return false; }
98 virtual bool isSpherical() {
return false; }
99 virtual bool isMesh() {
return true; }
101 void add(
Triangle t) { facets_.push_back(t); }
103 void add(
const Vector3d& vertex1,
const Vector3d& vertex2,
104 const Vector3d& vertex3) {
105 Triangle t(vertex1, vertex2, vertex3);
106 facets_.push_back(t);
109 void addQuadrilateral(
const Vector3d& p1,
const Vector3d& p2,
110 const Vector3d& p3,
const Vector3d& p4) {
115 void clear() { facets_.clear(); }
117 size_t size() {
return facets_.size(); }
119 Mesh& scale(
const Vector3d& s) {
121 x = ((s.
x() != 0) ? s.
x() : 1);
122 y = ((s.
y() != 0) ? s.
y() : 1);
123 z = ((s.
z() != 0) ? s.
z() : 1);
124 Vector3d _s(x, y, z);
127 for (
auto& t : facets_) {
128 v1.
Vmul(t.vertex1(), _s);
129 v2.
Vmul(t.vertex2(), _s);
130 v3.
Vmul(t.vertex3(), _s);
136 Mesh& translate(
const Vector3d& trans) {
138 for (
auto& t : facets_) {
139 v1 = t.vertex1() + trans;
140 v2 = t.vertex2() + trans;
141 v3 = t.vertex3() + trans;
148 for (
auto& t : facets_) {
154 void stlWrite(
const std::string& filename,
const std::string& name =
"") {
155 std::ofstream file(filename);
158 <<
" " << name << std::endl;
159 for (
auto& t : facets_) {
162 <<
" " << t.getUnitNormal() << std::endl;
164 <<
"outer loop" << std::endl;
168 <<
" " << t.vertex1() << std::endl;
172 <<
" " << t.vertex2() << std::endl;
176 <<
" " << t.vertex3() << std::endl;
178 <<
"endloop" << std::endl;
180 <<
"endfacet" << std::endl;
183 <<
" " << name << std::endl;
188 Mesh& operator+=(
const Mesh& m) {
189 facets_.insert(facets_.end(), (m.facets_).begin(), (m.facets_).end());
193 inline void add(
const Mesh& m1,
const Mesh& m2) {
194 this->facets_.insert(this->facets_.end(), (m1.facets_).begin(),
196 this->facets_.insert(this->facets_.end(), (m2.facets_).begin(),
200 std::vector<Triangle> getFacets() {
return facets_; }
203 std::vector<Triangle> facets_;
void Vmul(const Vector< Real, Dim > &v1, const Vector< Real, Dim > &v2)
Sets the elements of this vector to the multiplication of elements of two other vectors.