OOFEM 3.0
Loading...
Searching...
No Matches
geometry.h
Go to the documentation of this file.
1/*
2 *
3 * ##### ##### ###### ###### ### ###
4 * ## ## ## ## ## ## ## ### ##
5 * ## ## ## ## #### #### ## # ##
6 * ## ## ## ## ## ## ## ##
7 * ## ## ## ## ## ## ## ##
8 * ##### ##### ## ###### ## ##
9 *
10 *
11 * OOFEM : Object Oriented Finite Element Code
12 *
13 * Copyright (C) 1993 - 2025 Borek Patzak
14 *
15 *
16 *
17 * Czech Technical University, Faculty of Civil Engineering,
18 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19 *
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License as published by the Free Software Foundation; either
23 * version 2.1 of the License, or (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
29 *
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 */
34
35#ifndef geometry_h
36#define geometry_h
37
38#include "oofemenv.h"
39#include "error.h"
40#include "floatarray.h"
41#include "inputrecord.h"
42#include "contextioresulttype.h"
43#include "contextmode.h"
44
45#include <list>
46#ifdef __BOOST_MODULE
47 #include <BoostInterface.h>
48#endif
49
51
52#define _IFT_Circle_Name "circle"
53#define _IFT_Circle_radius "radius"
54#define _IFT_Circle_center "center"
55
56#define _IFT_Line_Name "line"
57#define _IFT_Line_start "start"
58#define _IFT_Line_end "end"
59
60#define _IFT_PointSwarm_Name "pointswarm" // just temporary
61#define _IFT_PointSwarm_nodeID "nodeid"
62
63
64#define _IFT_PolygonLine_Name "polygonline"
65#define _IFT_PolygonLine_points "points"
66
68
69namespace oofem {
70
71class Element;
72class DynamicInputRecord;
73class oofegGraphicContext;
74class TipInfo;
75
81class OOFEM_EXPORT BasicGeometry //: public Geometry
82{
83protected:
85 std :: vector< FloatArray >mVertices;
86public:
89
91 BasicGeometry(const BasicGeometry & iBasicGeometry);
92
94 virtual ~BasicGeometry();
95
96 virtual BasicGeometry *Clone() = 0;
97
99 virtual double computeDistanceTo(const FloatArray &point) { return 0; }
100
101
102 // For debugging
103 virtual void printVTK(int iTStepIndex, int iIndex) {};
104
107 virtual void computeNormalSignDist(double &oDist, const FloatArray &iPoint) const = 0;
108 virtual void computeTangentialSignDist(double &oDist, const FloatArray &iPoint, double &oMinDistArcPos) const = 0;
109 virtual void computeLocalCoordinates(FloatArray &oLocCoord, const FloatArray &iPoint) const { OOFEM_ERROR("not implemented."); }
110 virtual void giveSubPolygon(std :: vector< FloatArray > &oPoints, const double &iXiStart, const double &iXiEnd) const { OOFEM_ERROR("?"); }
111 virtual void giveGlobalCoordinates(FloatArray &oGlobalCoord, const double &iArcPos) const {OOFEM_ERROR("Not implemented.")};
112
114 virtual void giveTangent(FloatArray &oTangent, const double &iArcPosition) const {printf("BasicGeometry::giveTangent() not implemented.\n");}
115
116
118 virtual bool intersects(Element *element) { return false; }
120 virtual int computeNumberOfIntersectionPoints(Element *element) { return 0; }
122 virtual void computeIntersectionPoints(Element *element, std :: vector< FloatArray > &oIntersectionPoints) { }
123
124 inline const FloatArray &giveVertex(int n) const { return mVertices [ n - 1 ]; }
125
126 void setVertices(const std::vector<FloatArray> &iVertices) {mVertices = iVertices;}
127
128 void removeDuplicatePoints(const double &iTolSquare);
129
130 void insertVertexFront(const FloatArray &iP) { mVertices.insert(mVertices.begin(), iP); }
131 void insertVertexBack(const FloatArray &iP) { mVertices.push_back(iP); }
132
133 void clear() {mVertices.clear();}
134
135 void translate(const FloatArray &iTrans);
136
138 virtual void initializeFrom(InputRecord &ir) { }
139 virtual void giveInputRecord(DynamicInputRecord &input) { OOFEM_ERROR("not implemented"); }
141 virtual const char *giveClassName() const { return NULL; }
142 std :: string errorInfo(const char *func) const { return std :: string(giveClassName()) + func; }
144 int giveNrVertices() const { return (int)mVertices.size(); }
145 virtual bool isOutside(BasicGeometry *bg) { return false; }
146 virtual bool isInside(Element *el) { return false; }
147 virtual bool isInside(const FloatArray &point) { return false; }
148 virtual void printYourself() { }
155 virtual void saveContext(DataStream &stream, ContextMode mode) { }
162 virtual void restoreContext(DataStream &stream, ContextMode mode) { }
163
164#ifdef __OOFEG
165 virtual void draw(oofegGraphicContext &gc) { }
166#endif
167
168
174 static double computeLineDistance(const FloatArray &iP1, const FloatArray &iP2, const FloatArray &iQ1, const FloatArray &iQ2);
175
179 virtual bool giveTips(TipInfo &oStartTipInfo, TipInfo &oEndTipInfo) const {return false;}
180
181 virtual void giveBoundingSphere(FloatArray &oCenter, double &oRadius) {OOFEM_ERROR("Not implemented.")};
182
183};
184
186{
187public:
189 virtual ~Line() { }
190 Line(const FloatArray &iPointA, const FloatArray &iPointB);
191
192 BasicGeometry *Clone() override { return new Line(*this); }
193
194 double computeDistanceTo(const FloatArray &point) override;
196
197 void computeNormalSignDist(double &oDist, const FloatArray &iPoint) const override { OOFEM_ERROR("not implemented"); }
198
199 double computeTangentialDistanceToEnd(const FloatArray &point);
200
201 void computeTangentialSignDist(double &oDist, const FloatArray &iPoint, double &oMinDistArcPos) const override;
202
203 void computeProjection(FloatArray &answer);
204 int computeNumberOfIntersectionPoints(Element *element) override;
205 void computeIntersectionPoints(Element *element, std :: vector< FloatArray > &oIntersectionPoints) override;
206 double computeInclinationAngle();
207 void computeTransformationMatrix(FloatMatrix &answer);
208 void transformIntoPolar(FloatArray *point, FloatArray &answer);
209 void initializeFrom(InputRecord &ir) override;
210 bool isPointInside(FloatArray *point);
211 bool intersects(Element *element) override;
212 bool isOutside(BasicGeometry *bg) override;
213
214 double giveLength() const { return distance( mVertices[0], mVertices[1] ); }
215};
216
218{
219public:
220 Triangle(const FloatArray & iP1, const FloatArray & iP2, const FloatArray & iP3);
221 virtual ~Triangle() { }
222
223 BasicGeometry *Clone() override { return new Triangle(*this); }
224
225 void computeNormalSignDist(double &oDist, const FloatArray &iPoint) const override
226 { OOFEM_ERROR("not implemented"); }
227 void computeTangentialSignDist(double &oDist, const FloatArray &iPoint, double &oMinDistArcPos) const override
228 { OOFEM_ERROR("not implemented"); }
229
230 double getArea();
231 void computeBarycentrCoor(FloatArray &answer) const;
232 double getRadiusOfCircumCircle();
233 void computeCenterOfCircumCircle(FloatArray &answer) const;
234 void printYourself() override;
235 int computeNumberOfIntersectionPoints(Element *element) override { return 0; }
236 bool isOrientedAnticlockwise();
237 void changeToAnticlockwise();
238
244 bool pointIsInTriangle(const FloatArray &iP) const;
245
249 static void refineTriangle(std::vector<Triangle> &oRefinedTri, const Triangle &iTri);
250};
251
253{
254protected:
255 double radius;
256 const double mTangSignDist;
257public:
259 virtual ~Circle() { }
260 Circle(FloatArray &center, double radius);
261
262 BasicGeometry *Clone() override { return new Circle(*this); }
263
264 void computeNormalSignDist(double &oDist, const FloatArray &iPoint) const override;
265
266 // Irrelevant for a closed interface: we can always consider ourselves to be "inside" a closed interface in
267 // tangential direction. Therefore, we may return any positive number.
268 void computeTangentialSignDist(double &oDist, const FloatArray &iPoint, double &oMinDistArcPos) const override
269 { oDist = mTangSignDist; }
270
271 void giveGlobalCoordinates(FloatArray &oGlobalCoord, const double &iArcPos) const override;
272
273 void giveTangent(FloatArray &oTangent, const double &iArcPosition) const override { }
274
275 void initializeFrom(InputRecord &ir) override;
276 const char *giveClassName() const override { return "Circle"; }
277 bool intersects(Element *element) override;
278 void computeIntersectionPoints(Element *element, std :: vector< FloatArray > &oIntersectionPoints) override;
279 void computeIntersectionPoints(Line *l, std :: vector< FloatArray > &oIntersectionPoints);
280 int computeNumberOfIntersectionPoints(Element *element) override;
281 bool isOutside(BasicGeometry *bg) override;
282 bool isInside(Element *element) override;
283 bool isInside(const FloatArray &point) override;
284 void printYourself() override;
285
286 double giveRadius() const {return radius;}
287
288 void giveBoundingSphere(FloatArray &oCenter, double &oRadius) override;
289};
290
292{
294public:
295 PolygonLine();
296 virtual ~PolygonLine() { }
297
298 BasicGeometry *Clone() override { return new PolygonLine(*this); }
299
300 void computeNormalSignDist(double &oDist, const FloatArray &iPoint) const override;
301 void computeTangentialSignDist(double &oDist, const FloatArray &iPoint, double &oMinDistArcPos) const override;
302
304 void computeLocalCoordinates(FloatArray &oLocCoord, const FloatArray &iPoint) const override;
305 double computeLength() const;
306
307 void giveSubPolygon(std :: vector< FloatArray > &oPoints, const double &iXiStart, const double &iXiEnd) const override;
308 void giveGlobalCoordinates(FloatArray &oGlobalCoord, const double &iArcPos) const override;
309 void giveNormal(FloatArray &oNormal, const double &iArcPosition) const;
310 void giveTangent(FloatArray &oTangent, const double &iArcPosition) const override;
311
312 void initializeFrom(InputRecord &ir) override;
313 void giveInputRecord(DynamicInputRecord &input) override;
314 const char *giveClassName() const override { return "PolygonLine"; }
315
316#ifdef __BOOST_MODULE
317 bool boundingBoxIntersects(Element *element);
318#endif
319
320 bool intersects(Element *element) override;
321 void computeIntersectionPoints(Element *element, std :: vector< FloatArray > &oIntersectionPoints) override;
322 void computeIntersectionPoints(Line *l, std :: vector< FloatArray > &oIntersectionPoints);
323 void computeIntersectionPoints(const PolygonLine &iPolygonLine, std :: vector< FloatArray > &oIntersectionPoints) const;
324 void computeIntersectionPoints(const FloatArray &iXStart, const FloatArray &iXEnd, std :: vector< FloatArray > &oIntersectionPoints) const;
325
326 int computeNumberOfIntersectionPoints(Element *element) override;
327 bool isOutside(BasicGeometry *bg) override;
328 bool isInside(Element *element) override;
329 bool isInside(const FloatArray &point) override;
330
331#ifdef __BOOST_MODULE
332 virtual void calcBoundingBox(bPoint2 &oLC, bPoint2 &oUC);
333#endif
334
335 void printYourself() override;
336
337 // For debugging
338 void printVTK(int iTStepIndex, int iLineIndex) override;
339
340#ifdef __BOOST_MODULE
341 // Upper and lower corner
342 bPoint2 LC, UC;
343#endif
344
345 bool giveTips(TipInfo &oStartTipInfo, TipInfo &oEndTipInfo) const override;
346
347 void giveBoundingSphere(FloatArray &oCenter, double &oRadius) override;
348
353 void cropPolygon(const double &iArcPosStart, const double &iArcPosEnd);
354
355};
356
357
359{
360protected:
361 std :: list< int >idList;
362public:
364 virtual ~PointSwarm() { }
365 PointSwarm(std :: list< int >pointsID);
366
367 BasicGeometry *Clone() override { return new PointSwarm(*this); }
368
369 void computeNormalSignDist(double &oDist, const FloatArray &iPoint) const override
370 { OOFEM_ERROR("not implemented"); }
371 void computeTangentialSignDist(double &oDist, const FloatArray &iPoint, double &oMinDistArcPos) const override
372 { OOFEM_ERROR("not implemented"); }
373
375 void initializeFrom(InputRecord &ir) override;
376#if 0
377 double computeDistanceTo(FloatArray &point) override;
378 const char *giveClassName() const override { return "Circle"; }
379 bool intersects(Element *element) override;
380 void computeIntersectionPoints(Element *element, std :: vector< FloatArray > *intersecPoints) override;
381 void computeIntersectionPoints(Line *l, std :: vector< FloatArray > *intersecPoints) override;
382 bool isOutside(BasicGeometry *bg) override;
383 bool isInside(Element *element) override;
384 bool isInside(const FloatArray &point) override;
385#endif
386};
387} // end namespace oofem
388#endif // geometry_h
virtual void giveSubPolygon(std ::vector< FloatArray > &oPoints, const double &iXiStart, const double &iXiEnd) const
Definition geometry.h:110
virtual void printYourself()
Definition geometry.h:148
virtual void saveContext(DataStream &stream, ContextMode mode)
Definition geometry.h:155
virtual bool isInside(Element *el)
Definition geometry.h:146
void insertVertexBack(const FloatArray &iP)
Definition geometry.h:131
virtual void giveGlobalCoordinates(FloatArray &oGlobalCoord, const double &iArcPos) const
Definition geometry.h:111
std::string errorInfo(const char *func) const
Definition geometry.h:142
virtual void draw(oofegGraphicContext &gc)
Definition geometry.h:165
virtual int computeNumberOfIntersectionPoints(Element *element)
Gives number of intersection points of Geometry entity with an element, Element reference will be lat...
Definition geometry.h:120
virtual void giveTangent(FloatArray &oTangent, const double &iArcPosition) const
Computes tangential direction at given local coordinate (arcPos).
Definition geometry.h:114
virtual const char * giveClassName() const
Gives class name.
Definition geometry.h:141
virtual bool intersects(Element *element)
Checks whether an element is interacted, Element reference will be later replaced by Geometry.
Definition geometry.h:118
virtual void giveInputRecord(DynamicInputRecord &input)
Definition geometry.h:139
virtual void initializeFrom(InputRecord &ir)
Initializes the Geometry from the InputRecord.
Definition geometry.h:138
virtual void computeLocalCoordinates(FloatArray &oLocCoord, const FloatArray &iPoint) const
Definition geometry.h:109
const FloatArray & giveVertex(int n) const
Definition geometry.h:124
virtual void restoreContext(DataStream &stream, ContextMode mode)
Definition geometry.h:162
void insertVertexFront(const FloatArray &iP)
Definition geometry.h:130
virtual bool giveTips(TipInfo &oStartTipInfo, TipInfo &oEndTipInfo) const
Definition geometry.h:179
virtual void printVTK(int iTStepIndex, int iIndex)
Definition geometry.h:103
int giveNrVertices() const
Returns number of Geometry vertices.
Definition geometry.h:144
BasicGeometry()
Constructor.
virtual void giveBoundingSphere(FloatArray &oCenter, double &oRadius)
Definition geometry.h:181
virtual void computeTangentialSignDist(double &oDist, const FloatArray &iPoint, double &oMinDistArcPos) const =0
std ::vector< FloatArray > mVertices
List of geometry vertices.
Definition geometry.h:85
virtual void computeNormalSignDist(double &oDist, const FloatArray &iPoint) const =0
virtual bool isOutside(BasicGeometry *bg)
Definition geometry.h:145
void setVertices(const std::vector< FloatArray > &iVertices)
Definition geometry.h:126
virtual double computeDistanceTo(const FloatArray &point)
Computes normal signed distance between this object and a point.
Definition geometry.h:99
virtual void computeIntersectionPoints(Element *element, std ::vector< FloatArray > &oIntersectionPoints)
Gives intersection points between this Geometry and Element.
Definition geometry.h:122
virtual bool isInside(const FloatArray &point)
Definition geometry.h:147
virtual BasicGeometry * Clone()=0
void giveTangent(FloatArray &oTangent, const double &iArcPosition) const override
Computes tangential direction at given local coordinate (arcPos).
Definition geometry.h:273
virtual ~Circle()
Definition geometry.h:259
const double mTangSignDist
Definition geometry.h:256
void computeTangentialSignDist(double &oDist, const FloatArray &iPoint, double &oMinDistArcPos) const override
Definition geometry.h:268
double giveRadius() const
Definition geometry.h:286
BasicGeometry * Clone() override
Definition geometry.h:262
const char * giveClassName() const override
Gives class name.
Definition geometry.h:276
double radius
Definition geometry.h:255
virtual ~Line()
Definition geometry.h:189
BasicGeometry * Clone() override
Definition geometry.h:192
void computeNormalSignDist(double &oDist, const FloatArray &iPoint) const override
Computes tangential distance to a point.
Definition geometry.h:197
double giveLength() const
Definition geometry.h:214
BasicGeometry * Clone() override
Definition geometry.h:367
void computeTangentialSignDist(double &oDist, const FloatArray &iPoint, double &oMinDistArcPos) const override
Definition geometry.h:371
void computeNormalSignDist(double &oDist, const FloatArray &iPoint) const override
Definition geometry.h:369
PointSwarm(std ::list< int >pointsID)
std ::list< int > idList
Definition geometry.h:361
virtual ~PointSwarm()
Definition geometry.h:364
virtual ~PolygonLine()
Definition geometry.h:296
const char * giveClassName() const override
Gives class name.
Definition geometry.h:314
BasicGeometry * Clone() override
Definition geometry.h:298
int computeNumberOfIntersectionPoints(Element *element) override
Gives number of intersection points of Geometry entity with an element, Element reference will be lat...
Definition geometry.h:235
void computeNormalSignDist(double &oDist, const FloatArray &iPoint) const override
Definition geometry.h:225
void computeTangentialSignDist(double &oDist, const FloatArray &iPoint, double &oMinDistArcPos) const override
Definition geometry.h:227
virtual ~Triangle()
Definition geometry.h:221
BasicGeometry * Clone() override
Definition geometry.h:223
Triangle(const FloatArray &iP1, const FloatArray &iP2, const FloatArray &iP3)
Definition geometry.C:403
#define OOFEM_ERROR(...)
Definition error.h:79
long ContextMode
Definition contextmode.h:43
double distance(const FloatArray &x, const FloatArray &y)
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
#define OOFEM_EXPORT
Definition oofemcfg.h:7

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011