// Definitions for the cut flags used from the findCut methods enumclass CutFlagValue
{
NONE = 0x0000,
LINE = 0x0001,
START1 = 0x0002,
START2 = 0x0004,
END1 = 0x0008,
END2 = 0x0010,
ALL = LINE|START1|START2|END1|END2, DEFAULT = LINE|START2|END2,
}; namespace o3tl
{ template<> struct typed_flags<CutFlagValue> : is_typed_flags<CutFlagValue, 0x1f> {};
}
namespace basegfx
{ class B2DPolygon; class B2DRange;
}
namespace basegfx::utils
{ // B2DPolygon tools
// open/close with point add/remove and control point corrections
BASEGFX_DLLPUBLIC void openWithGeometryChange(B2DPolygon& rCandidate);
BASEGFX_DLLPUBLIC void closeWithGeometryChange(B2DPolygon& rCandidate);
// Get successor and predecessor indices. Returning the same index means there // is none. Same for successor.
BASEGFX_DLLPUBLIC sal_uInt32 getIndexOfPredecessor(sal_uInt32 nIndex, const B2DPolygon& rCandidate);
BASEGFX_DLLPUBLIC sal_uInt32 getIndexOfSuccessor(sal_uInt32 nIndex, const B2DPolygon& rCandidate);
// Get orientation of Polygon
BASEGFX_DLLPUBLIC B2VectorOrientation getOrientation(const B2DPolygon& rCandidate);
// isInside tests for B2dPoint and other B2dPolygon. On border is not inside as long as // not true is given in bWithBorder flag.
BASEGFX_DLLPUBLIC bool isInside(const B2DPolygon& rCandidate, const B2DPoint& rPoint, bool bWithBorder = false);
BASEGFX_DLLPUBLIC bool isInside(const B2DPolygon& rCandidate, const B2DPolygon& rPolygon, bool bWithBorder = false);
// get signed area of polygon
BASEGFX_DLLPUBLIC double getSignedArea(const B2DPolygon& rCandidate);
// get area of polygon
BASEGFX_DLLPUBLIC double getArea(const B2DPolygon& rCandidate);
/** get length of polygon edge from point nIndex to nIndex + 1 */
BASEGFX_DLLPUBLIC double getEdgeLength(const B2DPolygon& rCandidate, sal_uInt32 nIndex);
/** get length of polygon */
BASEGFX_DLLPUBLIC double getLength(const B2DPolygon& rCandidate);
// get position on polygon for absolute given distance. If // length is given, it is assumed the correct polygon length, if 0.0 it is calculated // using getLength(...)
BASEGFX_DLLPUBLIC B2DPoint getPositionAbsolute(const B2DPolygon& rCandidate, double fDistance, double fLength = 0.0);
// get position on polygon for relative given distance in range [0.0 .. 1.0]. If // length is given, it is assumed the correct polygon length, if 0.0 it is calculated // using getLength(...)
BASEGFX_DLLPUBLIC B2DPoint getPositionRelative(const B2DPolygon& rCandidate, double fDistance, double fLength = 0.0);
// get a snippet from given polygon for absolute distances. The polygon is assumed // to be opened (not closed). fFrom and fTo need to be in range [0.0 .. fLength], where // fTo >= fFrom. If length is given, it is assumed the correct polygon length, // if 0.0 it is calculated using getLength(...)
BASEGFX_DLLPUBLIC B2DPolygon getSnippetAbsolute(const B2DPolygon& rCandidate, double fFrom, double fTo, double fLength = 0.0);
// Continuity check for point with given index
BASEGFX_DLLPUBLIC B2VectorContinuity getContinuityInPoint(const B2DPolygon& rCandidate, sal_uInt32 nIndex);
// Subdivide all contained curves. Use distanceBound value if given.
BASEGFX_DLLPUBLIC B2DPolygon adaptiveSubdivideByDistance(const B2DPolygon& rCandidate, double fDistanceBound, int nRecurseLimit = 30);
// Subdivide all contained curves. Use angleBound value if given.
BASEGFX_DLLPUBLIC B2DPolygon adaptiveSubdivideByAngle(const B2DPolygon& rCandidate, double fAngleBound = 0.0);
// This version works with two points and vectors to define the // edges for the cut test.
BASEGFX_DLLPUBLIC CutFlagValue findCut( const B2DPoint& rEdge1Start, const B2DVector& rEdge1Delta, const B2DPoint& rEdge2Start, const B2DVector& rEdge2Delta,
CutFlagValue aCutFlags = CutFlagValue::DEFAULT, double* pCut1 = nullptr, double* pCut2 = nullptr);
// test if point is on the given edge in range ]0.0..1.0[ without // the start/end points. If so, return true and put the parameter // value in pCut (if provided)
BASEGFX_DLLPUBLIC bool isPointOnEdge( const B2DPoint& rPoint, const B2DPoint& rEdgeStart, const B2DVector& rEdgeDelta, double* pCut = nullptr);
// test if point is inside epsilon-range around an edge defined // by the two given points. Can be used for HitTesting. The epsilon-range // is defined to be the rectangle centered to the given edge, using height // 2 x fDistance, and the circle around both points with radius fDistance.
BASEGFX_DLLPUBLIC bool isInEpsilonRange(const B2DPoint& rEdgeStart, const B2DPoint& rEdgeEnd, const B2DPoint& rTestPosition, double fDistance);
// test if point is inside epsilon-range around the given Polygon. Can be used // for HitTesting. The epsilon-range is defined to be the rectangle centered // to the given edge, using height 2 x fDistance, and the circle around both points // with radius fDistance.
BASEGFX_DLLPUBLIC bool isInEpsilonRange(const B2DPolygon& rCandidate, const B2DPoint& rTestPosition, double fDistance);
/** Create a unit ellipse polygon with the given angles, from start to end
*/
BASEGFX_DLLPUBLIC B2DPolygon createPolygonFromEllipseSegment( const B2DPoint& rCenter, double fRadiusX, double fRadiusY, double fStart, double fEnd );
// create 3d polygon from given 2d polygon. The given fZCoordinate is used to expand the // third coordinate.
BASEGFX_DLLPUBLIC B3DPolygon createB3DPolygonFromB2DPolygon(const B2DPolygon& rCandidate, double fZCoordinate = 0.0);
// create 2d tools::PolyPolygon from given 3d PolyPolygon. All coordinates are transformed using the given // matrix and the resulting x,y is used to form the new polygon.
BASEGFX_DLLPUBLIC B2DPolygon createB2DPolygonFromB3DPolygon(const B3DPolygon& rCandidate, const B3DHomMatrix& rMat);
// calculate the smallest distance to given edge and return. The relative position on the edge is returned in Cut. // That position is in the range [0.0 .. 1.0] and the returned distance is adapted accordingly to the start or end // point of the edge
BASEGFX_DLLPUBLIC double getSmallestDistancePointToEdge(const B2DPoint& rPointA, const B2DPoint& rPointB, const B2DPoint& rTestPoint, double& rCut);
// for each contained edge calculate the smallest distance. Return the index to the smallest // edge in rEdgeIndex. The relative position on the edge is returned in rCut. // If nothing was found (e.g. empty input plygon), DBL_MAX is returned.
BASEGFX_DLLPUBLIC double getSmallestDistancePointToPolygon(const B2DPolygon& rCandidate, const B2DPoint& rTestPoint, sal_uInt32& rEdgeIndex, double& rCut);
// distort single point. rOriginal describes the original range, where the given points describe the distorted corresponding points.
BASEGFX_DLLPUBLIC B2DPoint distort(const B2DPoint& rCandidate, const B2DRange& rOriginal, const B2DPoint& rTopLeft, const B2DPoint& rTopRight, const B2DPoint& rBottomLeft, const B2DPoint& rBottomRight);
// distort polygon. rOriginal describes the original range, where the given points describe the distorted corresponding points.
BASEGFX_DLLPUBLIC B2DPolygon distort(const B2DPolygon& rCandidate, const B2DRange& rOriginal, const B2DPoint& rTopLeft, const B2DPoint& rTopRight, const B2DPoint& rBottomLeft, const B2DPoint& rBottomRight);
// expand all segments (which are not yet) to curve segments. This is done with setting the control // vectors on the 1/3 resp. 2/3 distances on each segment.
BASEGFX_DLLPUBLIC B2DPolygon expandToCurve(const B2DPolygon& rCandidate);
// expand given segment to curve segment. This is done with setting the control // vectors on the 1/3 resp. 2/3 distances. The return value describes if a change took place.
BASEGFX_DLLPUBLIC bool expandToCurveInPoint(B2DPolygon& rCandidate, sal_uInt32 nIndex);
// set continuity for given index. If not a curve, nothing will change. Non-curve points are not changed, too. // The return value describes if a change took place.
BASEGFX_DLLPUBLIC bool setContinuityInPoint(B2DPolygon& rCandidate, sal_uInt32 nIndex, B2VectorContinuity eContinuity);
// test if polygon contains neutral points. A neutral point is one whose orientation is neutral // e.g. positioned on the edge of its predecessor and successor
BASEGFX_DLLPUBLIC bool hasNeutralPoints(const B2DPolygon& rCandidate);
// remove neutral points. A neutral point is one whose orientation is neutral // e.g. positioned on the edge of its predecessor and successor
BASEGFX_DLLPUBLIC B2DPolygon removeNeutralPoints(const B2DPolygon& rCandidate);
// tests if polygon is convex
BASEGFX_DLLPUBLIC bool isConvex(const B2DPolygon& rCandidate);
// calculates the orientation at edge nIndex
BASEGFX_DLLPUBLIC B2VectorOrientation getOrientationForIndex(const B2DPolygon& rCandidate, sal_uInt32 nIndex);
// calculates if given point is on given line, taking care of the numerical epsilon
BASEGFX_DLLPUBLIC bool isPointOnLine(const B2DPoint& rStart, const B2DPoint& rEnd, const B2DPoint& rCandidate, bool bWithPoints);
// calculates if given point is on given polygon, taking care of the numerical epsilon. Uses // isPointOnLine internally
BASEGFX_DLLPUBLIC bool isPointOnPolygon(const B2DPolygon& rCandidate, const B2DPoint& rPoint, bool bWithPoints = true);
// test if candidate is inside triangle
BASEGFX_DLLPUBLIC bool isPointInTriangle(const B2DPoint& rA, const B2DPoint& rB, const B2DPoint& rC, const B2DPoint& rCandidate, bool bWithBorder);
// test if candidateA and candidateB are on the same side of the given line bool arePointsOnSameSideOfLine(const B2DPoint& rStart, const B2DPoint& rEnd, const B2DPoint& rCandidateA, const B2DPoint& rCandidateB, bool bWithLine);
// add triangles for given rCandidate to rTarget. For each triangle, 3 points will be added to rCandidate. // All triangles will go from the start point of rCandidate to two consecutive points, building (rCandidate.count() - 2) // triangles. void addTriangleFan( const B2DPolygon& rCandidate,
triangulator::B2DTriangleVector& rTarget);
// grow for polygon. Move all geometry in each point in the direction of the normal in that point // with the given amount. Value may be negative.
BASEGFX_DLLPUBLIC B2DPolygon growInNormalDirection(const B2DPolygon& rCandidate, double fValue);
// force all sub-polygons to a point count of nSegments
BASEGFX_DLLPUBLIC B2DPolygon reSegmentPolygon(const B2DPolygon& rCandidate, sal_uInt32 nSegments);
// create polygon state at t from 0.0 to 1.0 between the two polygons. Both polygons must have the same // organisation, e.g. same amount of points
BASEGFX_DLLPUBLIC B2DPolygon interpolate(const B2DPolygon& rOld1, const B2DPolygon& rOld2, double t);
// #i76891# Try to remove existing curve segments if they are simply edges
BASEGFX_DLLPUBLIC B2DPolygon simplifyCurveSegments(const B2DPolygon& rCandidate);
// makes the given indexed point the new polygon start point. To do that, the points in the // polygon will be rotated. This is only valid for closed polygons, for non-closed ones // an assertion will be triggered
BASEGFX_DLLPUBLIC B2DPolygon makeStartPoint(const B2DPolygon& rCandidate, sal_uInt32 nIndexOfNewStatPoint);
/** create edges of given length along given B2DPolygon
/** Create Waveline along given polygon TheimplementationisbasedoncreateEdgesOfGivenLengthandcreatesacurve segmentwiththegivendimensionsforeachcreatedlinesegment.Thepolygon istreatedasifopened(closedstatewillbeignored)andonlyforwhole edgesacurvesegmentwillbecreated(noresthandling)
/// get the tangent with which the given point is entered seen from the previous /// polygon path data. Take into account all stuff like closed state, zero-length edges and others.
BASEGFX_DLLPUBLIC B2DVector getTangentEnteringPoint(const B2DPolygon& rCandidate, sal_uInt32 nIndex);
/// get the tangent with which the given point is left seen from the following /// polygon path data. Take into account all stuff like closed state, zero-length edges and others.
BASEGFX_DLLPUBLIC B2DVector getTangentLeavingPoint(const B2DPolygon& rCandidate, sal_uInt32 nIndex);
/** Reduces the number of points using the Ramer-Douglas-Peucker (RDP) algorithm. If the input polygonhascontrolpointsorlessthanthreepoints,theinputpolygonisreturned unchanged.Otherwise,asimplifiedpolygonisreturned.Iftheinputpolygonisclosed, thecallerisexpectedtoensurethatthefirstandlastpointsofthepolygonare identical.Thepolygonistreatedasopeninthiscase.Closingtheresultpolygonisnot performedhere,butlefttothecaller.
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.