56BasicGeometry :: BasicGeometry()
63BasicGeometry :: ~BasicGeometry()
67void BasicGeometry :: removeDuplicatePoints(
const double &iTolSquare)
70 for (
size_t i =
mVertices.size()-1; i > 0; i--) {
80 for (
size_t i = 0; i <
mVertices.size(); i++ ) {
99 const double c1 = (1.0e-14)*LengthP*LengthP;
100 const double c2 = (1.0e-14)*LengthQ*LengthQ;
102 const size_t minIter = 2;
103 const size_t maxIter = 5;
104 const double absTol = 1.0e-12;
106 double xi = 0.0, eta = 0.0;
117 bool lockXi =
false, lockEta =
false;
119 for (
size_t iter = 0; iter < maxIter; iter++ ) {
156 if ( res < absTol && iter >= minIter ) {
169 K(0,1) = K(1,0) = 0.0;
173 K(0,1) = K(1,0) = 0.0;
234 double a = pointA.at(2) - pointB.at(2);
235 double b = pointB.at(1) - pointA.at(1);
236 double c = pointA.at(1) * pointB.at(2) - pointB.at(1) * pointA.at(2);
237 double l =
distance(pointA, pointB);
238 return ( a * point.
at(1) + b * point.
at(2) + c ) / l;
246double Line :: computeTangentialDistanceToEnd(
const FloatArray &point)
255void Line :: computeTangentialSignDist(
double &oDist,
const FloatArray &iPoint,
double &oMinArcDist)
const
264int Line :: computeNumberOfIntersectionPoints(
Element *element)
268 const double relTol = 1.0e-3;
274 for (
int edgeIndex = 1; edgeIndex <= numEdges; edgeIndex++ ) {
277 const int nsLoc = bNodes.
at(1);
278 const int neLoc = bNodes.at( bNodes.giveSize() );
285 const double dist = BasicGeometry :: computeLineDistance(xS, xE,
mVertices[0],
mVertices[1]);
295void Line :: computeIntersectionPoints(
Element *element, std :: vector< FloatArray > &oIntersectionPoints)
300 if ( i < element->giveNumberOfDofManagers() ) {
310 if ( lsn1 * lsn2 <= 0 && lst1 <= 0 && lst2 <= 0 ) {
311 double r = lsn1 / ( lsn1 - lsn2 );
312 if ( i <= element->giveNumberOfDofManagers() ) {
314 for (
int j = 1; j <= answer.
giveSize(); j++ ) {
319 oIntersectionPoints.push_back(answer);
325double Line :: computeInclinationAngle()
329 double y = pointB.
at(2) - pointA.
at(2);
330 double x = pointB.
at(1) - pointA.
at(1);
338 answer.
at(1, 1) = cos(alpha);
339 answer.
at(1, 2) = sin(alpha);
340 answer.
at(2, 1) = -sin(alpha);
341 answer.
at(2, 2) = cos(alpha);
354 answer.
at(2) = atan2( xp.
at(2), xp.
at(1) );
366 double maxX, minX, maxY, minY;
383 if ( point->
at(1) >= minX && point->
at(1) <= maxX &&
384 point->
at(2) >= minY && point->
at(2) <= maxY ) {
400 return ( count != 0 );
410double Triangle :: getArea()
417double Triangle :: getRadiusOfCircumCircle()
424void Triangle :: computeBarycentrCoor(
FloatArray &answer)
const
436 answer.
at(1) = aPow * ( -aPow + bPow + cPow );
437 answer.
at(2) = bPow * ( aPow - bPow + cPow );
438 answer.
at(3) = cPow * ( aPow + bPow - cPow );
441void Triangle :: computeCenterOfCircumCircle(
FloatArray &answer)
const
445 double sum = bar.
at(1) + bar.
at(2) + bar.
at(3);
448 for (
int i = 1; i <= answer.
giveSize(); i++ ) {
453void Triangle :: printYourself()
455 printf(
"Triangle: ");
456 for (
size_t i = 0; i <
mVertices.size(); i++ ) {
463bool Triangle :: isOrientedAnticlockwise()
466 for (
int i = 1; i <= 3; i++ ) {
467 for (
int j = 1; j <= 2; j++ ) {
480void Triangle :: changeToAnticlockwise()
485bool Triangle :: pointIsInTriangle(
const FloatArray &iP)
const
489 const double tol2 = 1.0e-18;
546 a1 =
Vec2(-t1[1], t1[0]);
547 a2 =
Vec2(-t2[1], t2[0]);
548 a3 =
Vec2(-t3[1], t3[0]);
554 N.beVectorProductOf(p1p2, p1p3);
556 if(
N.computeSquaredNorm() < tol2) {
628void Triangle :: refineTriangle(std::vector<Triangle> &oRefinedTri,
const Triangle &iTri)
646 oRefinedTri.push_back(
Triangle(p1, q1, q3) );
647 oRefinedTri.push_back(
Triangle(q1, q2, q3) );
648 oRefinedTri.push_back(
Triangle(q1, p2, q2) );
649 oRefinedTri.push_back(
Triangle(q3, q2, p3) );
660void Circle :: computeNormalSignDist(
double &oDist,
const FloatArray &iPoint)
const
665void Circle :: giveGlobalCoordinates(
FloatArray &oGlobalCoord,
const double &iArcPos)
const
667 double angle = 2.0*
M_PI*iArcPos;
687 if ( dist > this->
radius ) {
705 if ( dist < this->
radius ) {
726void Circle :: computeIntersectionPoints(
Element *element, std :: vector< FloatArray > &oIntersectionPoints)
730 std :: vector< FloatArray >oneLineIntersects;
739 for (
int j = 1; j <= int ( oneLineIntersects.size() ); j++ ) {
740 oIntersectionPoints.push_back(oneLineIntersects [ j - 1 ]);
746void Circle :: computeIntersectionPoints(
Line *l, std :: vector< FloatArray > &oIntersectionPoints)
754 double distX = x2 - x1;
755 double distY = y2 - y1;
756 double a = 0., b = 0., A, B, C;
757 if ( distX != 0.0 ) {
761 B = 2 * ( ( -1 ) * c1 + b * a - a * c2 );
762 C = c1 * c1 + b * b - 2 * c2 * b + c2 * c2 -
radius *
radius;
766 C = x1 * x1 - 2 * x1 * c1 + c1 * c1 + c2 * c2 -
radius *
radius;
769 double D = B * B - 4 * A * C;
773 }
else if ( D == 0 ) {
779 for (
int i = 1; i <= sz; i++ ) {
785 fn = ( -1 ) * sqrt(D);
788 if ( distX != 0.0 ) {
789 point.
at(1) = ( ( -1 ) * B + fn ) / ( 2 * A );
790 point.
at(2) = a * point.
at(1) + b;
793 point.
at(2) = ( ( -1 ) * B + fn ) / ( 2 * A );
797 oIntersectionPoints.push_back(point);
803Circle :: computeNumberOfIntersectionPoints(
Element *element)
805 std :: vector< FloatArray >intersecPoints;
808 return (
int) intersecPoints.size();
827void Circle :: printYourself()
829 printf(
"Circle: radius = %e, center = ", this->
radius);
834void Circle :: giveBoundingSphere(
FloatArray &oCenter,
double &oRadius)
853void PolygonLine :: computeNormalSignDist(
double &oDist,
const FloatArray &iPoint)
const
857 oDist = std :: numeric_limits< double > :: max();
864 for (
int segId = 1; segId <= numSeg; segId++ ) {
881 double s =
dot(u, t);
888 auto q = ( 1.0 - xi ) * crackP1 + xi * crackP2;
897 }
else if ( segId == numSeg ) {
907 double s =
dot(u, t);
914 auto q = ( 1.0 - xi ) * crackP1 + xi * crackP2;
924 double arcPos = -1.0, dummy;
928 if ( dist2 < oDist*oDist ) {
942void PolygonLine :: computeTangentialSignDist(
double &oDist,
const FloatArray &iPoint,
double &oMinArcDist)
const
949 double xi = 0.0, xiUnbounded = 0.0;
963 point.
distance(crackP1, crackP2, xi, xiUnbounded);
965 if( xiUnbounded < 0.0 ) {
966 oDist = xiUnbounded *
distance(crackP1, crackP2);
971 if( xiUnbounded > 1.0 ) {
972 oDist = -(xiUnbounded-1.0) *
distance(crackP1, crackP2);
978 double distToStart = xi*L;
980 oDist = std::min(distToStart, (L - distToStart) );
981 oMinArcDist = distToStart/L;
985 bool isBeforeStart =
false, isAfterEnd =
false;
986 double distBeforeStart = 0.0, distAfterEnd = 0.0;
994 const double distSeg_start = point.
distance(crackP1_start, crackP2_start, xi, xiUnbounded);
996 if( xiUnbounded < 0.0 ) {
997 isBeforeStart =
true;
998 distBeforeStart = xiUnbounded *
distance(crackP1_start, crackP2_start);
1001 double arcPosPassed =
distance(crackP1_start, crackP2_start);
1002 double distToStart = xi *
distance(crackP1_start, crackP2_start);
1004 double minGeomDist = distSeg_start;
1011 for (
int segId = 2; segId <= numSeg-1; segId++ ) {
1017 const double distSeg = point.
distance(crackP1, crackP2, xi, xiUnbounded);
1019 if(distSeg < minGeomDist) {
1020 isBeforeStart =
false;
1021 minGeomDist = distSeg;
1022 distToStart = arcPosPassed + xi *
distance(crackP1, crackP2);
1025 arcPosPassed +=
distance(crackP1, crackP2);
1037 const double distSeg_end = point.
distance(crackP1_end, crackP2_end, xi, xiUnbounded);
1040 if( xiUnbounded > 1.0 ) {
1041 arcPosPassed += xiUnbounded *
distance(crackP1_end, crackP2_end);
1044 arcPosPassed += xi *
distance(crackP1_end, crackP2_end);
1048 if ( distSeg_end < minGeomDist ) {
1049 isBeforeStart =
false;
1051 if( xiUnbounded > 1.0 ) {
1053 distAfterEnd = -(xiUnbounded-1.0) *
distance(crackP1_end, crackP2_end);
1056 distToStart = arcPosPassed;
1062 if ( isBeforeStart ) {
1063 oDist = distBeforeStart;
1069 oDist = distAfterEnd;
1076 oDist = std::min(distToStart, (L - distToStart) );
1077 oMinArcDist = distToStart/L;
1083double PolygonLine :: computeLength()
const
1093 if ( numSeg == 0 ) {
1097 for (
size_t i = 0; i < numSeg; i++ ) {
1104void PolygonLine :: giveSubPolygon(std :: vector< FloatArray > &oPoints,
const double &iXiStart,
const double &iXiEnd)
const
1107 double xSegStart = 0.0, xSegEnd = 0.0;
1108 double xiSegStart = 0.0, xiSegEnd = 0.0;
1110 const double xiTol = 1.0e-9;
1111 if ( iXiStart < xiTol ) {
1116 for (
size_t i = 0; i < numSeg; i++ ) {
1119 xiSegStart = xSegStart / L;
1120 xiSegEnd = xSegEnd / L;
1122 if ( iXiStart > xiSegStart-xiTol && iXiStart < xiSegEnd+xiTol ) {
1125 double elXi = ( iXiStart - xiSegStart ) / ( xiSegEnd - xiSegStart );
1128 oPoints.push_back(p);
1132 if ( iXiEnd > xiSegStart && iXiEnd < xiSegEnd ) {
1135 double elXi = ( iXiEnd - xiSegStart ) / ( xiSegEnd - xiSegStart );
1138 oPoints.push_back(p);
1141 if ( xiSegEnd > iXiStart && xiSegEnd < iXiEnd + xiTol ) {
1146 xSegStart = xSegEnd;
1150void PolygonLine :: giveGlobalCoordinates(
FloatArray &oGlobalCoord,
const double &iArcPos)
const
1153 double xSegStart = 0.0, xSegEnd = 0.0;
1154 double xiSegStart = 0.0, xiSegEnd = 0.0;
1156 const double xiTol = 1.0e-9;
1157 if ( iArcPos < xiTol ) {
1162 for (
size_t i = 0; i < numSeg; i++ ) {
1165 xiSegStart = xSegStart / L;
1166 xiSegEnd = xSegEnd / L;
1168 if ( iArcPos > xiSegStart-xiTol && iArcPos < xiSegEnd+xiTol ) {
1171 double elXi = ( iArcPos - xiSegStart ) / ( xiSegEnd - xiSegStart );
1181void PolygonLine :: giveNormal(
FloatArray &oNormal,
const double &iArcPosition)
const
1184 double xSegStart = 0.0, xSegEnd = 0.0;
1185 double xiSegStart = 0.0, xiSegEnd = 0.0;
1187 const double xiTol = 1.0e-9;
1189 for (
size_t i = 0; i < numSeg; i++ ) {
1192 xiSegStart = xSegStart / L;
1193 xiSegEnd = xSegEnd / L;
1195 if ( iArcPosition > xiSegStart-xiTol && iArcPosition < xiSegEnd+xiTol ) {
1216void PolygonLine :: giveTangent(
FloatArray &oTangent,
const double &iArcPosition)
const
1219 double xSegStart = 0.0, xSegEnd = 0.0;
1220 double xiSegStart = 0.0, xiSegEnd = 0.0;
1222 const double xiTol = 1.0e-9;
1224 for (
size_t i = 0; i < numSeg; i++ ) {
1227 xiSegStart = xSegStart / L;
1228 xiSegEnd = xSegEnd / L;
1230 if ( iArcPosition > xiSegStart-xiTol && iArcPosition < xiSegEnd+xiTol ) {
1236 oTangent =
Vec2(p2(0) - p1(0), p2(1) - p1(1));
1253 int numPoints = points.
giveSize() / 2;
1255 for (
int i = 1; i <= numPoints; i++ ) {
1256 mVertices.push_back(
Vec2(points.
at(2 * ( i - 1 ) + 1), points.
at( 2 * ( i ) )));
1259#ifdef __BOOST_MODULE
1261 calcBoundingBox(LC, UC);
1271 points.
resize(nVert * 2);
1273 for (
int i = 0; i < nVert; i++ ) {
1281#ifdef __BOOST_MODULE
1282bool PolygonLine :: boundingBoxIntersects(
Element *element)
1293 for (
int i = 2; i <= numNodes; i++ ) {
1306 if ( !bOverlap(eLC, eUC, LC, UC) ) {
1319 printf(
"Warning: entering PolygonLine :: intersects(Element *element).\n");
1321#ifdef __BOOST_MODULE
1322 if ( !boundingBoxIntersects(element) ) {
1326 double distTol = 1.0e-9;
1333 for (
int segId = 1; segId <= numSeg; segId++ ) {
1337 bPoint2 crackP2( this->
giveVertex ( segId + 1 )->at(1), this->
giveVertex ( segId + 1 )->at(2) );
1338 bSeg2 crackSeg(crackP1, crackP2);
1346 bSeg2 edge1(x1, x2);
1347 bSeg2 edge2(x2, x3);
1348 bSeg2 edge3(x3, x1);
1350 double d1 = bDist(crackSeg, edge1);
1351 if ( d1 < distTol ) {
1355 double d2 = bDist(crackSeg, edge2);
1356 if ( d2 < distTol ) {
1360 double d3 = bDist(crackSeg, edge3);
1361 if ( d3 < distTol ) {
1388#ifdef __BOOST_MODULE
1389void PolygonLine :: calcBoundingBox(bPoint2 &oLC, bPoint2 &oUC)
1391 oLC.x( vertices->at(1)->at(1) );
1392 oLC.y( vertices->at(1)->at(2) );
1394 oUC.x( vertices->at(1)->at(1) );
1395 oUC.y( vertices->at(1)->at(2) );
1397 int numPoints = vertices->giveSize();
1398 for (
int i = 2; i <= numPoints; i++ ) {
1399 oLC.x(
min( oLC.x(), vertices->at(i)->at(1) ) );
1400 oLC.y(
min( oLC.y(), vertices->at(i)->at(2) ) );
1402 oUC.x(
max( oUC.x(), vertices->at(i)->at(1) ) );
1403 oUC.y(
max( oUC.y(), vertices->at(i)->at(2) ) );
1409void PolygonLine :: computeIntersectionPoints(
Element *element, std :: vector< FloatArray > &oIntersectionPoints)
1413 std :: vector< FloatArray > oneLineIntersects;
1422 for (
auto &interSect: oneLineIntersects ) {
1428 double distTol = 1.0e-9;
1430 bool alreadyFound =
false;
1432 for (
auto &pInterSect: oIntersectionPoints ) {
1434 if (
distance(pInterSect, interSect) < distTol ) {
1435 alreadyFound =
true;
1440 if ( !alreadyFound ) {
1441 oIntersectionPoints.push_back(interSect);
1449 printf(
"Warning: entering PolygonLine :: computeIntersectionPoints(Element *element, std::vector< FloatArray > &oIntersectionPoints).\n");
1450#ifdef __BOOST_MODULE
1452 if ( !boundingBoxIntersects(element) ) {
1458 std :: vector< FloatArray >oneLineIntersects;
1468 for (
FloatArray &interSect: oneLineIntersects ) {
1474 double distTol = 1.0e-9;
1476 bool alreadyFound =
false;
1478 bPoint2 pNew( interSect.at(1), interSect.at(2) );
1480 for (
FloatArray &pInterSect: oIntersectionPoints ) {
1481 bPoint2 pOld( pInterSect.at(1), pInterSect.at(2) );
1483 if ( bDist(pOld, pNew) < distTol ) {
1484 alreadyFound =
true;
1489 if ( !alreadyFound ) {
1490 oIntersectionPoints.push_back(interSect);
1499void PolygonLine :: computeIntersectionPoints(
Line *l, std :: vector< FloatArray > &oIntersectionPoints)
1501 printf(
"Warning: entering PolygonLine :: computeIntersectionPoints(Line *l, std::vector< FloatArray > &oIntersectionPoints).\n");
1503#ifdef __BOOST_MODULE
1512 bSeg2 lineSeg(lineP1, lineP2);
1515 double distTol = 1.0e-9;
1517 bool foundOverlap =
false;
1521 for (
int segId = 1; segId <= numSeg; segId++ ) {
1524 bPoint2 crackP2( this->
giveVertex ( segId + 1 )->at(1), this->
giveVertex ( segId + 1 )->at(2) );
1525 bSeg2 crackSeg(crackP1, crackP2);
1527 bPoint2 intersectionPoint(0.0, 0.0);
1528 double d = bDist(crackSeg, lineSeg, & intersectionPoint);
1529 if ( d < distTol ) {
1530 if ( !foundOverlap ) {
1531 foundOverlap =
true;
1532 oIntersectionPoints.emplace_back({intersectionPoint.x(), intersectionPoint.y()});
1540void PolygonLine :: computeIntersectionPoints(
const PolygonLine &iPolygonLine, std :: vector< FloatArray > &oIntersectionPoints)
const
1543 for(
int segIndex = 1; segIndex <= numSeg; segIndex++) {
1552void PolygonLine :: computeIntersectionPoints(
const FloatArray &iXStart,
const FloatArray &iXEnd, std :: vector< FloatArray > &oIntersectionPoints)
const
1554 const double detTol = 1.0e-15;
1557 for(
int segIndex = 1; segIndex <= numSeg; segIndex++) {
1562 const FloatArray t1 = {xEnd(0) - xStart(0), xEnd(1) - xStart(1)};
1563 const FloatArray t2 = {iXEnd(0) - iXStart(0), iXEnd(1) - iXStart(1)};
1565 double xi1 = 0.0, xi2 = 0.0;
1568 for(
int iter = 0; iter < maxIter; iter++) {
1569 FloatArray temp = {iXStart(0) + xi2*t2(0) - xStart(0) - xi1*t1(0), iXStart(1) + xi2*t2(1) - xStart(1) - xi1*t1(1)};
1599 if(xi1 >= 0.0 && xi1 <= 1.0 && xi2 >= 0.0 && xi2 <= 1.0) {
1602 oIntersectionPoints.push_back(pos);
1610PolygonLine :: computeNumberOfIntersectionPoints(
Element *element)
1612 std :: vector< FloatArray >intersecPoints;
1614 return (
int) intersecPoints.size();
1622void PolygonLine :: printYourself()
1624 printf(
"PolygonLine:\n");
1633void PolygonLine :: printVTK(
int iTStepIndex,
int iLineIndex)
1638 std :: string vtkFileName;
1639 vtkFileName.append(
"crack");
1640 char lineIdNumberString [ 100 ];
1641 sprintf(lineIdNumberString,
"%d", iLineIndex);
1642 vtkFileName.append(lineIdNumberString);
1644 vtkFileName.append(
"Step");
1645 char stepString [ 100 ];
1647 sprintf(stepString,
"%d", iTStepIndex);
1648 vtkFileName.append(stepString);
1650 vtkFileName.append(
".vtk");
1656 std :: ofstream file;
1657 file.open( vtkFileName.data() );
1660 file <<
"# vtk DataFile Version 2.0\n";
1661 file <<
"Geometry of a PolygonLine\n";
1664 file <<
"DATASET UNSTRUCTURED_GRID\n";
1668 file <<
"POINTS " << numPoints <<
"double\n";
1670 for (
int i = 1; i <= numPoints; i++ ) {
1676 int numSeg = numPoints - 1;
1677 file <<
"CELLS " << numSeg <<
" " << numSeg * 3 <<
"\n";
1679 int numPointsPerSeg = 2;
1680 for (
int i = 0; i < numSeg; i++ ) {
1681 file << numPointsPerSeg <<
" " << i <<
" " << i + 1 <<
"\n";
1686 file <<
"CELL_TYPES " << numSeg <<
"\n";
1687 int vtkCellType = 3;
1688 for (
int i = 0; i < numSeg; i++ ) {
1689 file << vtkCellType <<
"\n";
1720 oStartTipInfo = info1;
1742 oEndTipInfo = info2;
1750void PolygonLine :: giveBoundingSphere(
FloatArray &oCenter,
double &oRadius)
1759 for (
int i = 1; i <= nVert; i++ ) {
1763 oCenter.
times( 1.0 /
double( nVert ) );
1765 for (
int i = 1; i <= nVert; i++ ) {
1772void PolygonLine :: cropPolygon(
const double &iArcPosStart,
const double &iArcPosEnd)
1774 std::vector<FloatArray> points;
1778 const double tol2 = 1.0e-18;
1789 for (
int i = 1; i <=
idList.giveSize(); i++ ) {
1790 this->idList.push_back(
idList.at(i) );
#define REGISTER_Geometry(class)
void insertVertexBack(const FloatArray &iP)
const FloatArray & giveVertex(int n) const
int giveNrVertices() const
Returns number of Geometry vertices.
BasicGeometry()
Constructor.
std ::vector< FloatArray > mVertices
List of geometry vertices.
void setVertices(const std::vector< FloatArray > &iVertices)
void removeDuplicatePoints(const double &iTolSquare)
const double mTangSignDist
void computeIntersectionPoints(Element *element, std ::vector< FloatArray > &oIntersectionPoints) override
Gives intersection points between this Geometry and Element.
bool intersects(Element *element) override
Checks whether an element is interacted, Element reference will be later replaced by Geometry.
bool isInside(Element *element) override
double giveCoordinate(int i) const
const FloatArray & giveCoordinates() const
Node * giveNode(int i) const
virtual FEInterpolation * giveInterpolation() const
virtual int giveNumberOfBoundarySides()
Returns number of boundaries (entities of element_dimension-1: points, edges, surfaces).
virtual int giveNumberOfNodes() const
virtual int giveNumberOfDofManagers() const
DofManager * giveDofManager(int i) const
virtual Element_Geometry_Type giveGeometryType() const =0
virtual IntArray boundaryGiveNodes(int boundary, const Element_Geometry_Type) const =0
virtual int giveNumberOfEdges(const Element_Geometry_Type) const
double computeNorm() const
double distance(const FloatArray &x) const
double computeSquaredNorm() const
double dotProduct(const FloatArray &x) const
Index giveSize() const
Returns the size of receiver.
void resizeWithValues(Index s, std::size_t allocChunk=0)
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
double distance_square(const FloatArray &iP1, const FloatArray &iP2, double &oXi, double &oXiUnbounded) const
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
double normalize_giveNorm()
void beScaled(double s, const FloatArray &b)
void beVectorProductOf(const FloatArray &v1, const FloatArray &v2)
void add(const FloatArray &src)
void resize(Index rows, Index cols)
bool beInverseOf(const FloatMatrix &src)
double giveDeterminant() const
double at(std::size_t i, std::size_t j) const
int computeNumberOfIntersectionPoints(Element *element) override
Gives number of intersection points of Geometry entity with an element, Element reference will be lat...
bool isPointInside(FloatArray *point)
double computeInclinationAngle()
double computeDistanceTo(const FloatArray &point) override
Computes normal signed distance between this object and a point.
void computeTransformationMatrix(FloatMatrix &answer)
double giveLength() const
void computeProjection(FloatArray &answer)
double computeTangentialDistanceToEnd(const FloatArray &point)
void giveSubPolygon(std ::vector< FloatArray > &oPoints, const double &iXiStart, const double &iXiEnd) const override
void computeIntersectionPoints(Element *element, std ::vector< FloatArray > &oIntersectionPoints) override
Gives intersection points between this Geometry and Element.
void computeTangentialSignDist(double &oDist, const FloatArray &iPoint, double &oMinDistArcPos) const override
double computeLength() const
void computeBarycentrCoor(FloatArray &answer) const
Triangle(const FloatArray &iP1, const FloatArray &iP2, const FloatArray &iP3)
static double giveCharacteristicElementLength()
#define _IFT_Circle_radius
#define _IFT_PointSwarm_nodeID
#define _IFT_Circle_center
#define _IFT_PolygonLine_points
static FloatArray Vec2(const double &a, const double &b)
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
double sum(const FloatArray &x)
double dot(const FloatArray &x, const FloatArray &y)
double sgn(double i)
Returns the signum of given value (if value is < 0 returns -1, otherwise returns 1).
double distance(const FloatArray &x, const FloatArray &y)
double distance_square(const FloatArray &x, const FloatArray &y)