NormVecDecorator class

Decorator class which adds the functionality of estimating normals at the data points.

Base classes

class TriDecorator
Decorator class for Triangulations (s.

Public types

enum PointState { Normal, BreakLine, EndPoint }
Enumeration for the state of a point. Normal means, that the point is not on a BreakLine, BreakLine means that the point is on a breakline (but not an end point of it) and EndPoint means, that it is an endpoint of a breakline.

Public functions

auto addPoint(const QgsPoint& point) -> int override
Adds a point to the triangulation.
auto calcNormal(double x, double y, Vector3D* result) -> bool override
Calculates the normal at a point on the surface and assigns it to 'result'. Returns true in case of success and false in case of failure.
auto calcNormalForPoint(double x, double y, int point, Vector3D* result) -> bool
Calculates the normal of a triangle-point for the point with coordinates x and y. This is needed, if a point is on a break line and there is no unique normal stored in 'mNormVec'. Returns false, it something went wrong and true otherwise.
auto calcPoint(double x, double y, QgsPoint& result) -> bool override
Calculates x-, y and z-value of the point on the surface and assigns it to 'result'.
void eliminateHorizontalTriangles() override
Eliminates the horizontal triangles by swapping or by insertion of new points. If alreadyestimated is true, a re-estimation of the normals will be done.
auto estimateFirstDerivative(int pointno) -> bool
Estimates the first derivative a point. Return true in case of success and false otherwise.
auto estimateFirstDerivatives(QgsFeedback* feedback = nullptr) -> bool
This method adds the functionality of estimating normals at the data points. Return true in the case of success and false otherwise.
auto getNormal(int n) const -> Vector3D*
Returns a pointer to the normal vector for the point with the number n.
auto getState(int pointno) const -> PointState
Returns the state of the point with the number 'pointno'.
auto getTriangle(double x, double y, QgsPoint& p1, Vector3D* v1, QgsPoint& p2, Vector3D* v2, QgsPoint& p3, Vector3D* v3) -> bool
Finds out, in which triangle a point with coordinates x and y is and assigns the triangle points to p1, p2, p3 and the estimated normals to v1, v2, v3. The vectors are normally taken from 'mNormVec', except if p1, p2 or p3 is a point on a breakline. In this case, the normal is calculated on-the-fly. Returns false, if something went wrong and true otherwise.
auto getTriangle(double x, double y, QgsPoint& p1, int& ptn1, Vector3D* v1, PointState* state1, QgsPoint& p2, int& ptn2, Vector3D* v2, PointState* state2, QgsPoint& p3, int& ptn3, Vector3D* v3, PointState* state3) -> bool
This function behaves similar to the one above. Additionally, the numbers of the points are returned (ptn1, ptn2, ptn3) as well as the PointStates of the triangle points (state1, state2, state3)
auto saveTriangulation(QgsFeatureSink* sink, QgsFeedback* feedback = nullptr) const -> bool override
Saves the triangulation features to a feature sink.
void setTriangleInterpolator(TriangleInterpolator* inter) override
Sets an interpolator.
auto swapEdge(double x, double y) -> bool override
Swaps the edge which is closest to the point with x and y coordinates (if this is possible) and forces recalculation of the concerned normals (if alreadyestimated is true)

Protected functions

void setState(int pointno, PointState s)
Sets the state (BreakLine, Normal, EndPoint) of a point.

Protected variables

bool alreadyestimated
Is true, if the normals already have been estimated.
TriangleInterpolator* mInterpolator
Association with an interpolator object.
QVector<Vector3D*>* mNormVec
Vector that stores the normals for the points. If 'estimateFirstDerivatives()' was called and there is a null pointer, this means, that the triangle point is on a breakline.
QVector<PointState>* mPointState
Vector who stores, it a point is not on a breakline, if it is a normal point of the breakline or if it is an endpoint of a breakline.

Function documentation

int NormVecDecorator::addPoint(const QgsPoint& point) override

Adds a point to the triangulation.

The point should have a z-value matching the value to interpolate.

bool NormVecDecorator::calcPoint(double x, double y, QgsPoint& result) override

Calculates x-, y and z-value of the point on the surface and assigns it to 'result'.

Returns true in case of success and flase in case of failure

bool NormVecDecorator::saveTriangulation(QgsFeatureSink* sink, QgsFeedback* feedback = nullptr) const override

Saves the triangulation features to a feature sink.

Returns true in case of success

The sink must be setup to accept LineString features, with fields matching those returned by triangulationFields().