MeVisLab Toolbox Reference
CSOGeometry.h
Go to the documentation of this file.
1/*************************************************************************************
2**
3** Copyright 2007, MeVis Medical Solutions AG
4**
5** The user may use this file in accordance with the license agreement provided with
6** the Software or, alternatively, in accordance with the terms contained in a
7** written agreement between the user and MeVis Medical Solutions AG.
8**
9** For further information use the contact form at https://www.mevislab.de/contact
10**
11**************************************************************************************/
12
13
17
18#pragma once
19
20
21#include "MLCSOIncludes.h"
25
26
27#include <mlRotation.h>
28
29ML_START_NAMESPACE
30
31
33
34class CSO;
35class CSOList;
36ML_REFCOUNTED_PTR(CSOList)
37
38
39
40
43namespace CSOGeometry
44{
46 const double maxPointDiff = 10e-6;
47
54
62 MLCSO_EXPORT bool computeIsInPlane(const CSO* cso, Vector3& planeNormal, double angleEpsilon=1e-3, double collinearEpsilon=1e-3);
64 MLCSO_EXPORT bool computeIsInPlane(const std::vector< Vector3 >& points, Vector3& planeNormal, double angleEpsilon = 1e-3, double collinearEpsilon = 1e-3);
66 MLCSO_EXPORT Vector3 computeNewellsNormal(const std::vector< Vector3 >& points);
71 MLCSO_EXPORT bool arePointsCollinear(const std::vector<Vector3>& points, double epsilon);
73 MLCSO_EXPORT bool areCollinear(const Vector3& vec1, const Vector3& vec2, double epsilon=1e-3);
75 MLCSO_EXPORT bool canFormPlane(const Vector3& vec1, const Vector3& vec2, double epsilon = 1e-3);
78 MLCSO_EXPORT bool isSelfIntersecting(const std::vector<Vector3>& positions, std::vector<Vector3>& intersectPoints, bool isClosed);
80 MLCSO_EXPORT bool isSelfIntersecting(const std::vector<Vector3>& positions, bool isClosed);
81
85 MLCSO_EXPORT bool isSelfIntersecting(const CSO* cso, std::vector<Vector3>& intersectPositions);
86
88 MLCSO_EXPORT double computeSegmentSegmentDistance(const Vector3& start0, const Vector3& end0, const Vector3& start1, const Vector3& end1, Vector3& intersectionPoint, bool& isParallel);
90 MLCSO_EXPORT double computeSegmentSegmentDistance(const Vector3& start0, const Vector3& end0, const Vector3& start1, const Vector3& end1, Vector3& intersectionPoint);
91
94 MLCSO_EXPORT int intersect2DSegments(const Vector2& start0, const Vector2& end0, const Vector2& start1, const Vector2& end1, Vector2& intersection0, Vector2& intersection1);
96 bool isInSegment(const Vector2& point, const Vector2& segmentStart, const Vector2& segmentEnd);
98 MLdouble perp(const Vector2& v0, const Vector2& v1);
99
101 MLCSO_EXPORT bool areInSamePlane(const CSO* cso0, const CSO* cso1, MLdouble angleEpsilon = 10e-5, MLdouble minPlaneDistanceInMM = 10e-5);
102
104 MLCSO_EXPORT bool areOverlapping(const CSO* cso0, const CSO* cso1, MLdouble epsilon = 10e-5, MLdouble minPlaneDistanceInMM = 10e-5);
105
108 MLCSO_EXPORT void rotateAndProject(Rotation& rot, Vector3& voxelPos, bool shouldProject=true);
109
111 MLCSO_EXPORT void rotateAroundAxis(const Vector3& axis, const Vector3& centerPoint, Vector3& pointToRotate, double angleInRadian);
112
118
120 MLCSO_EXPORT void level(std::vector<Vector3>& positions);
121
123 MLCSO_EXPORT void levelToPlane(CSO& cso, const Vector3& normal, const Vector3& planeAnchorPoint);
124
127 MLCSO_EXPORT std::vector<Vector2> projectTo2D(const std::vector<Vector3>& points, const Vector3& normal, const Vector3& planeAnchorPoint);
128
130 MLCSO_EXPORT std::vector<Vector3> backprojectTo3D(const std::vector<Vector2>& points, const Vector3& normal, const Vector3& planeAnchorPoint);
131
137
139 MLCSO_EXPORT void translate(CSO* cso, const Vector3& translation);
140
144 MLCSO_EXPORT bool isPointInsidePolygon(const std::vector<Vector3>& polygonPoints, const Vector3& point);
145
147 MLCSO_EXPORT void appendUniquePosition(std::vector<Vector3>&positions, Vector3 pos);
148
152 MLCSO_EXPORT Vector3 getCenterOfGravity(CSO* cso, bool considerSeedPointsExtra=false);
154 MLCSO_EXPORT Vector3 getCenterOfGravity(const std::vector<Vector3>& positions);
155
157 MLCSO_EXPORT double distanceToLine (const Vector3& point, const Vector3& linePoint1, const Vector3& linePoint2);
158
160 MLCSO_EXPORT double squaredDistanceToLineSegment(const Vector3& point, const Vector3& linePoint1, const Vector3& linePoint2);
162 MLCSO_EXPORT double squaredDistanceToLineSegment(const Vector3& point, const Vector3& linePoint1, const Vector3& linePoint2, Vector3& resultPoint);
163
165 MLCSO_EXPORT double squaredDistanceToLineSegment(const Vector2& point, const Vector2& linePoint1, const Vector2& linePoint2);
166
168 MLCSO_EXPORT void computeClosestSeedPoint(CSO* cso, const Vector3& referencePoint, unsigned int &resultSeedPointIndex);
170 // \param resultPathPointIndex returns the index of the closest path point of the CSO.
171 MLCSO_EXPORT void computeClosestPathPoint(CSO* cso, const Vector3& referencePoint, unsigned int &resultPathPointListIndex, unsigned int &resultPathPointIndex, Vector3 &resultPosition);
173 // \param resultPathPointIndex returns the index of the start point of the closest line segment.
174 MLCSO_EXPORT void computeClosestPoint(CSO* cso, const Vector3& referencePoint, unsigned int &resultPathPointListIndex, unsigned int &resultPathPointIndex, Vector3 &resultPosition);
176 MLCSO_EXPORT void computeClosestPoint(const std::vector<Vector3>& pointList, const Vector3& referencePoint, unsigned int& resultPointIndex, Vector3& resultPosition);
178 MLCSO_EXPORT double computeDistance(CSO* cso, const Vector3& referencePoint);
180 MLCSO_EXPORT double computeLength(const CSOPathPointIterator& startIter, const CSOPathPointIterator& endIter);
181
183 MLCSO_EXPORT double computeDiameter(const CSO* cso);
185 MLCSO_EXPORT double computeDiameter(const std::vector<Vector3>& positions);
186
189 MLCSO_EXPORT void thinOutCSO(CSO* cso, float quality=0.5f, ReductionMode reductionMode=REDUCTION_MODE_ANGLE_AND_LENGTH, unsigned int minPoints=5, float maxAngleLimit=1.0);
192 MLCSO_EXPORT void thinOutPointList(std::vector<Vector3>& positionList, float quality=0.5f, ReductionMode reductionMode=REDUCTION_MODE_ANGLE_AND_LENGTH, unsigned int minPoints=5, float maxAngleLimit=1.0);
193
195 MLCSO_EXPORT bool csoIsEnclosedByCSO(CSO* toTestInnerCSO, CSO* toTestOuterCSO);
200 MLCSO_EXPORT size_t getLevelOfEmbedding(const CSOListPtr& csoList, std::vector<size_t>& result);
203 MLCSO_EXPORT size_t getLevelOfEmbedding(const std::vector<CSO*>& csos, std::vector<size_t>& result, std::vector<std::vector<size_t> >& enclosedCSOIndices);
207 MLCSO_EXPORT void groupByLevelOfEmbedding(const std::vector<CSO*>& csos, std::vector<std::vector<CSO*> >& groupedCSOs);
208
210 MLCSO_EXPORT double computeSumOfAreas(const CSOListPtr& csoList);
213 MLCSO_EXPORT double computeVolume(const CSOListPtr& csoList, double sliceThickness);
214
221 MLCSO_EXPORT bool isApproximatelyParallel(const CSO* cso, const Vector3& normal, double epsilon=0.1);
222
225 MLCSO_EXPORT void orthogonalizePreserveLength(const Vector3& reference, Vector3& toAdjust);
226
228 template<class T>
229 inline bool isSamePosition(const T& pos1, const T& pos2)
230 {
231 static_assert(std::is_same_v<T, Vector3> || std::is_same_v<T, Vector4>, "Need Vector3 or Vector4 type");
232 return ((fabs(pos1[0] - pos2[0]) < maxPointDiff) &&
233 (fabs(pos1[1] - pos2[1]) < maxPointDiff) &&
234 (fabs(pos1[2] - pos2[2]) < maxPointDiff));
235 }
236
238
240 const unsigned int INVALID_INDEX = static_cast<unsigned int>(-1);
241
243
252
254
256 {
264
265 public:
271
272 private:
273 CSOPlaneGuard& operator=(const CSOPlaneGuard&) { return *this; }
274 CSO& _cso;
275 bool _shouldPreservePlane;
276 Vector3 _planeNormal;
277 Vector3 _planeAnchorPoint;
278 };
279}
280
282
283ML_END_NAMESPACE
#define MLCSO_EXPORT
Defines export symbols for classes, so they can be used in other DLLs.
Definition MLCSOSystem.h:23
@ T
CSOHeapObject: base class for objects to be used with the heap.
MLCSO_EXPORT void disable()
Disables the plane guard, so that level method is not called.
MLCSO_EXPORT CSOPlaneGuard(CSO &cso)
Small helper class that can be used to keep a CSO in its original plane.
The CSO represents a contour segmentation object.
Definition CSO.h:44
Class to handle Rotations (internally, the rotation is stored as a unit quaternion)
Definition mlRotation.h:38
#define ML_REFCOUNTED_PTR(CLASSNAME)
Macro that defines convenience Ptr/ConstPtr typedefs to be used instead of intrusive_ptr templates.
double MLdouble
Definition mlTypeDefs.h:216
long double fabs(__int64 i)
MLCSO_EXPORT void translate(CSO *cso, const Vector3 &translation)
Translates a CSO with all its seed- and path points by the specified translation vector.
MLCSO_EXPORT double computeVolume(const CSOListPtr &csoList, double sliceThickness)
Returns the sum of areas of all CSOs in csoList, multiplied by the specified sliceThickness,...
MLCSO_EXPORT bool areInSamePlane(const CSO *cso0, const CSO *cso1, MLdouble angleEpsilon=10e-5, MLdouble minPlaneDistanceInMM=10e-5)
Returns whether the two specified CSOs lie in the same plane.
@ REDUCTION_MODE_ANGLE_AND_LENGTH
Definition CSOGeometry.h:52
MLCSO_EXPORT bool isSelfIntersecting(const std::vector< Vector3 > &positions, std::vector< Vector3 > &intersectPoints, bool isClosed)
Returns whether the specified list of points interpreted as a contour intersects itself.
MLCSO_EXPORT void appendUniquePosition(std::vector< Vector3 > &positions, Vector3 pos)
Appends a new point to the specified vector without double insertions.
MLCSO_EXPORT void levelToPlane(CSO &cso, const Vector3 &normal, const Vector3 &planeAnchorPoint)
Projects all seed points and all path points to the plane that is defined by the specified normal and...
MLCSO_EXPORT void computeClosestSeedPoint(CSO *cso, const Vector3 &referencePoint, unsigned int &resultSeedPointIndex)
Returns the closest point on a CSO to the specified reference point.
MLCSO_EXPORT double computeSumOfAreas(const CSOListPtr &csoList)
Returns the sum of areas of all CSOs in csoList. Area is counted negative if level of embedding is od...
bool isInSegment(const Vector2 &point, const Vector2 &segmentStart, const Vector2 &segmentEnd)
Helper function for intersect2DSegments.
MLCSO_EXPORT size_t getLevelOfEmbedding(const CSOListPtr &csoList, std::vector< size_t > &result)
Writes the level of embedding of the CSOs in the specified CSOList into the specified vector of integ...
MLdouble perp(const Vector2 &v0, const Vector2 &v1)
Helper function for intersect2DSegments.
MLCSO_EXPORT void rotateAndProject(Rotation &rot, Vector3 &voxelPos, bool shouldProject=true)
Transforms and projects a voxelPos according to a rotation.
MLCSO_EXPORT void computeClosestPoint(CSO *cso, const Vector3 &referencePoint, unsigned int &resultPathPointListIndex, unsigned int &resultPathPointIndex, Vector3 &resultPosition)
Returns the closest point on a CSO to the specified reference point. Interpolates the closest point o...
MLCSO_EXPORT void groupByLevelOfEmbedding(const std::vector< CSO * > &csos, std::vector< std::vector< CSO * > > &groupedCSOs)
Arranges the specified CSOs into a vector of vectors so that CSOs embedded into each other are groupe...
MLCSO_EXPORT bool isPointInsidePolygon(const std::vector< Vector3 > &polygonPoints, const Vector3 &point)
Returns whether a point is inside the polygon defined by the specified list of positions.
const unsigned int INVALID_INDEX
A symbolic value that indicates an invalid index (-1).
MLCSO_EXPORT void thinOutCSO(CSO *cso, float quality=0.5f, ReductionMode reductionMode=REDUCTION_MODE_ANGLE_AND_LENGTH, unsigned int minPoints=5, float maxAngleLimit=1.0)
Thins out the specified CSO by removing all positions that do not contribute to the overall geometry ...
MLCSO_EXPORT double distanceToLine(const Vector3 &point, const Vector3 &linePoint1, const Vector3 &linePoint2)
Computes distance of point to (infinite) line specified by two other points.
MLCSO_EXPORT double computeDiameter(const CSO *cso)
Computes the maximum distance between any two path points in the specified CSO.
MLCSO_EXPORT bool canFormPlane(const Vector3 &vec1, const Vector3 &vec2, double epsilon=1e-3)
Returns whether both given vectors can form a plane, i.e., are not collinear or any of the vector is ...
MLCSO_EXPORT void computeClosestPathPoint(CSO *cso, const Vector3 &referencePoint, unsigned int &resultPathPointListIndex, unsigned int &resultPathPointIndex, Vector3 &resultPosition)
Returns the closest path point of a CSO to the specified reference point without interpolation.
MLCSO_EXPORT double computeDistance(CSO *cso, const Vector3 &referencePoint)
Returns the distance of the specified point to the specified CSO.
MLCSO_EXPORT double squaredDistanceToLineSegment(const Vector3 &point, const Vector3 &linePoint1, const Vector3 &linePoint2)
Computes the squared distance of point to line segment specified by two other points.
MLCSO_EXPORT double getLargestDistanceBetweenAllPathPoints(CSO &cso, Vector3 &point0, Vector3 &point1)
Returns the largest distance between any of the path points of the CSO.
MLCSO_EXPORT void level(CSO *cso)
Determines the normal and the center of gravity of the specified CSO.
const double maxPointDiff
Maximum distance of two points in each axis to be considered equal.
Definition CSOGeometry.h:46
MLCSO_EXPORT std::vector< Vector3 > backprojectTo3D(const std::vector< Vector2 > &points, const Vector3 &normal, const Vector3 &planeAnchorPoint)
Back-projects the 2D points to 3D by rotating from (0,0,1) to the normal vector and adding planeAncho...
MLCSO_EXPORT void orthogonalizePreserveLength(const Vector3 &reference, Vector3 &toAdjust)
Makes the specified vector toAdjust perpendicular to the specified reference vector while preserving ...
MLCSO_EXPORT void thinOutPointList(std::vector< Vector3 > &positionList, float quality=0.5f, ReductionMode reductionMode=REDUCTION_MODE_ANGLE_AND_LENGTH, unsigned int minPoints=5, float maxAngleLimit=1.0)
Thins out the specified list of positions by removing all positions that do not contribute to the ove...
MLCSO_EXPORT bool areOverlapping(const CSO *cso0, const CSO *cso1, MLdouble epsilon=10e-5, MLdouble minPlaneDistanceInMM=10e-5)
Returns whether any path point of cso0 is within cso1 or vice versa.
bool isSamePosition(const T &pos1, const T &pos2)
Returns whether the two positions are considered equal as points of a CSO.
MLCSO_EXPORT bool computeIsInPlane(const CSO *cso, Vector3 &planeNormal, double angleEpsilon=1e-3, double collinearEpsilon=1e-3)
Returns whether all path points lie in one plane, and fills the plane normal.
MLCSO_EXPORT double computeLength(const CSOPathPointIterator &startIter, const CSOPathPointIterator &endIter)
Computes the length of a CSO between two PathPointIterators.
MLCSO_EXPORT bool csoIsEnclosedByCSO(CSO *toTestInnerCSO, CSO *toTestOuterCSO)
Returns whether the first specified CSO lies fully within the second specified CSO without crossing.
MLCSO_EXPORT int intersect2DSegments(const Vector2 &start0, const Vector2 &end0, const Vector2 &start1, const Vector2 &end1, Vector2 &intersection0, Vector2 &intersection1)
Computes whether the two specified 2D segments intersect; if they intersect, the intersection point i...
MLCSO_EXPORT Vector3 getCenterOfGravity(CSO *cso, bool considerSeedPointsExtra=false)
Returns the center of gravity of a specified CSO.
MLCSO_EXPORT bool isApproximatelyParallel(const CSO *cso, const Vector3 &normal, double epsilon=0.1)
Returns whether the specified CSO is approximately parallel to a plane specified by the normal vector...
MLCSO_EXPORT bool arePointsCollinear(const std::vector< Vector3 > &points, double epsilon)
Returns whether all points are collinear.
MLCSO_EXPORT Vector3 computeNewellsNormal(const std::vector< Vector3 > &points)
Returns a normal for the specified list of points using Newell's method.
MLCSO_EXPORT void rotateAroundAxis(const Vector3 &axis, const Vector3 &centerPoint, Vector3 &pointToRotate, double angleInRadian)
Rotates the specified pointToRotate around the axis originating from centerPoint by angleInRadian.
MLCSO_EXPORT std::vector< Vector2 > projectTo2D(const std::vector< Vector3 > &points, const Vector3 &normal, const Vector3 &planeAnchorPoint)
Projects the 3D points to 2D by subtracting planeAnchorPoint, rotating from the normal vector to (0,...