32  : 
QgsEllipse( center, radius, radius, azimuth )
 
 
   51  const double yDelta_a = pt2.
y() - pt1.
y();
 
   52  const double xDelta_a = pt2.
x() - pt1.
x();
 
   53  const double yDelta_b = pt3.
y() - pt2.
y();
 
   54  const double xDelta_b = pt3.
x() - pt2.
x();
 
   56  if ( ( std::fabs( xDelta_a ) <= epsilon ) && ( std::fabs( yDelta_b ) <= epsilon ) )
 
   61  if ( std::fabs( yDelta_a ) <= epsilon )
 
   65  else if ( std::fabs( yDelta_b ) <= epsilon )
 
   69  else if ( std::fabs( xDelta_a ) <= epsilon )
 
   73  else if ( std::fabs( xDelta_b ) <= epsilon )
 
   85  if ( !isPerpendicular( pt1, pt2, pt3, epsilon ) )
 
   91  else if ( !isPerpendicular( pt1, pt3, pt2, epsilon ) )
 
   97  else if ( !isPerpendicular( pt2, pt1, pt3, epsilon ) )
 
  103  else if ( !isPerpendicular( pt2, pt3, pt1, epsilon ) )
 
  109  else if ( !isPerpendicular( pt3, pt2, pt1, epsilon ) )
 
  115  else if ( !isPerpendicular( pt3, pt1, pt2, epsilon ) )
 
  128  const double yDelta_a = p2.
y() - p1.
y();
 
  129  const double xDelta_a = p2.
x() - p1.
x();
 
  130  const double yDelta_b = p3.
y() - p2.
y();
 
  131  const double xDelta_b = p3.
x() - p2.
x();
 
  138  const double aSlope = yDelta_a / xDelta_a;
 
  139  const double bSlope = yDelta_b / xDelta_b;
 
  144  if ( ( std::fabs( xDelta_a ) <= epsilon ) && ( std::fabs( yDelta_b ) <= epsilon ) )
 
  153  if ( std::fabs( aSlope - bSlope ) <= epsilon )
 
  159    ( aSlope * bSlope * ( p1.
y() - p3.
y() ) + bSlope * ( p1.
x() + p2.
x() ) - aSlope * ( p2.
x() + p3.
x() ) ) / ( 2.0 * ( bSlope - aSlope ) )
 
  162    -1.0 * ( 
center.
x() - ( p1.
x() + p2.
x() ) / 2.0 ) / aSlope + ( p1.
y() + p2.
y() ) / 2.0
 
 
  191  QVector<QgsCircle> circles;
 
  193  QgsPoint ptInter_par1line1, ptInter_par2line1;
 
  194  double angle1, angle2;
 
  196  QgsGeometryUtilsBase::angleBisector( pt1_par1.
x(), pt1_par1.
y(), pt2_par1.
x(), pt2_par1.
y(), pt1_line1.
x(), pt1_line1.
y(), pt2_line1.
x(), pt2_line1.
y(), x, y, angle1 );
 
  197  ptInter_par1line1.
setX( x );
 
  198  ptInter_par1line1.
setY( y );
 
  200  QgsGeometryUtilsBase::angleBisector( pt1_par2.
x(), pt1_par2.
y(), pt2_par2.
x(), pt2_par2.
y(), pt1_line1.
x(), pt1_line1.
y(), pt2_line1.
x(), pt2_line1.
y(), x, y, angle2 );
 
  201  ptInter_par2line1.
setX( x );
 
  202  ptInter_par2line1.
setY( y );
 
  212        circles.append( 
QgsCircle( center, radius ) );
 
  217      circles.append( 
QgsCircle( center, radius ) );
 
  228        circles.append( 
QgsCircle( center, radius ) );
 
  233      circles.append( 
QgsCircle( center, radius ) );
 
  238  if ( isInter && !circles.contains( 
QgsCircle( center, radius ) ) )
 
  244        circles.append( 
QgsCircle( center, radius ) );
 
  249      circles.append( 
QgsCircle( center, radius ) );
 
  253  if ( isInter && !circles.contains( 
QgsCircle( center, radius ) ) )
 
  259        circles.append( 
QgsCircle( center, radius ) );
 
  264      circles.append( 
QgsCircle( center, radius ) );
 
  274  bool isIntersect_tg1tg2 = 
false;
 
  275  bool isIntersect_tg1tg3 = 
false;
 
  276  bool isIntersect_tg2tg3 = 
false;
 
  281  QVector<QgsCircle> circles;
 
  282  if ( !isIntersect_tg1tg2 && !isIntersect_tg2tg3 ) 
 
  285  if ( !isIntersect_tg1tg2 )
 
  286    return from2ParallelsLine( pt1_tg1, pt2_tg1, pt1_tg2, pt2_tg2, pt1_tg3, pt2_tg3, pos, epsilon );
 
  287  else if ( !isIntersect_tg1tg3 )
 
  288    return from2ParallelsLine( pt1_tg1, pt2_tg1, pt1_tg3, pt2_tg3, pt1_tg2, pt2_tg2, pos, epsilon );
 
  289  else if ( !isIntersect_tg2tg3 )
 
  290    return from2ParallelsLine( pt1_tg2, pt2_tg2, pt1_tg3, pt2_tg3, pt1_tg1, pt1_tg1, pos, epsilon );
 
  307  circles.append( 
QgsTriangle( p1, p2, p3 ).inscribedCircle() );
 
 
  313  const QVector<QgsCircle> circles = 
from3TangentsMulti( pt1_tg1, pt2_tg1, pt1_tg2, pt2_tg2, pt1_tg3, pt2_tg3, epsilon, pos );
 
  314  if ( circles.length() != 1 )
 
  316  return circles.at( 0 );
 
 
  321  const double l1 = pt2.
distance( pt3 );
 
  322  const double l2 = pt3.
distance( pt1 );
 
  323  const double l3 = pt1.
distance( pt2 );
 
  325  if ( ( l1 * l1 ) - ( l2 * l2 + l3 * l3 ) >= epsilon )
 
  326    return QgsCircle().from2Points( pt2, pt3 );
 
  327  else if ( ( l2 * l2 ) - ( l1 * l1 + l3 * l3 ) >= epsilon )
 
  328    return QgsCircle().from2Points( pt3, pt1 );
 
  329  else if ( ( l3 * l3 ) - ( l1 * l1 + l2 * l2 ) >= epsilon )
 
  330    return QgsCircle().from2Points( pt1, pt2 );
 
  332    return QgsCircle().from3Points( pt1, pt2, pt3, epsilon );
 
 
  373  const double delta_x = std::fabs( pt1.
x() - pt2.
x() );
 
  374  const double delta_y = std::fabs( pt1.
x() - pt2.
y() );
 
 
  410  QVector<QgsPoint> quad;
 
 
  421  auto circString = std::make_unique<QgsCircularString>();
 
  423  QVector<QgsPoint> quad;
 
  432  quad.append( quad.at( 0 ) );
 
  433  for ( QVector<QgsPoint>::const_iterator it = quad.constBegin(); it != quad.constEnd(); ++it )
 
  437  circString->setPoints( 
points );
 
  439  return circString.release();
 
 
  456    rep = QStringLiteral( 
"Empty" );
 
  458    rep = QStringLiteral( 
"Circle (Center: %1, Radius: %2, Azimuth: %3)" )
 
 
  470  const QDomElement gml = circularString->asGml2( doc, 
precision, ns, axisOrder );
 
 
  479  QDomElement elemCircle = doc.createElementNS( ns, QStringLiteral( 
"Circle" ) );
 
 
  495  if ( parameter <= 0.0 )
 
  500  if ( minSegments < 3 )
 
  508      return calculateSegmentsStandard( 
radius, parameter, minSegments );
 
  510      return calculateSegmentsAdaptive( 
radius, parameter, minSegments );
 
  512      return calculateSegmentsByAreaError( 
radius, parameter, minSegments );
 
  514      return calculateSegmentsByConstant( 
radius, parameter, minSegments );
 
  516      return calculateSegmentsStandard( 
radius, parameter, minSegments );
 
 
SegmentCalculationMethod
brief Method used to calculate the number of segments for circle approximation
 
@ AreaError
Calculation based on area error.
 
@ Adaptive
Adaptive calculation based on radius size.
 
@ ConstantDensity
Simple calculation with constant segment density.
 
@ Standard
Standard sagitta-based calculation.
 
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
 
AxisOrder
Axis order for GML generation.
 
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
 
static QgsCircle from2Points(const QgsPoint &pt1, const QgsPoint &pt2)
Constructs a circle by 2 points on the circle.
 
int intersections(const QgsCircle &other, QgsPoint &intersection1, QgsPoint &intersection2, bool useZ=false) const
Calculates the intersections points between this circle and an other circle.
 
double radius() const
Returns the radius of the circle.
 
QDomElement asGml3(QDomDocument &doc, int precision=17, const QString &ns="gml", QgsAbstractGeometry::AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY) const
Returns a GML3 representation of the geometry.
 
int innerTangents(const QgsCircle &other, QgsPointXY &line1P1, QgsPointXY &line1P2, QgsPointXY &line2P1, QgsPointXY &line2P2) const
Calculates the inner tangent points between this circle and an other circle.
 
void setSemiMinorAxis(double semiMinorAxis) override
Inherited method.
 
int outerTangents(const QgsCircle &other, QgsPointXY &line1P1, QgsPointXY &line1P2, QgsPointXY &line2P1, QgsPointXY &line2P2) const
Calculates the outer tangent points between this circle and an other circle.
 
void setSemiMajorAxis(double semiMajorAxis) override
Inherited method.
 
QString toString(int pointPrecision=17, int radiusPrecision=17, int azimuthPrecision=2) const override
returns a string representation of the ellipse.
 
static QgsCircle from3Tangents(const QgsPoint &pt1_tg1, const QgsPoint &pt2_tg1, const QgsPoint &pt1_tg2, const QgsPoint &pt2_tg2, const QgsPoint &pt1_tg3, const QgsPoint &pt2_tg3, double epsilon=1E-8, const QgsPoint &pos=QgsPoint())
Constructs a circle by 3 tangents on the circle (aka inscribed circle of a triangle).
 
QgsRectangle boundingBox() const override
Returns the minimal bounding box for the ellipse.
 
bool contains(const QgsPoint &point, double epsilon=1E-8) const
Returns true if the circle contains the point.
 
static QVector< QgsCircle > from3TangentsMulti(const QgsPoint &pt1_tg1, const QgsPoint &pt2_tg1, const QgsPoint &pt1_tg2, const QgsPoint &pt2_tg2, const QgsPoint &pt1_tg3, const QgsPoint &pt2_tg3, double epsilon=1E-8, const QgsPoint &pos=QgsPoint())
Returns an array of circle constructed by 3 tangents on the circle (aka inscribed circle of a triangl...
 
static QgsCircle fromExtent(const QgsPoint &pt1, const QgsPoint &pt2)
Constructs a circle by an extent (aka bounding box / QgsRectangle).
 
double area() const override
The area of the ellipse.
 
static QgsCircle fromCenterDiameter(const QgsPoint ¢er, double diameter, double azimuth=0)
Constructs a circle by a center point and a diameter.
 
static int calculateSegments(double radius, double parameter, int minSegments, Qgis::SegmentCalculationMethod method)
Calculates the number of segments needed to approximate a circle.
 
static QgsCircle fromCenterPoint(const QgsPoint ¢er, const QgsPoint &pt1)
Constructs a circle by a center point and another point.
 
QDomElement asGml2(QDomDocument &doc, int precision=17, const QString &ns="gml", QgsAbstractGeometry::AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY) const
Returns a GML2 representation of the geometry.
 
QgsCircularString * toCircularString(bool oriented=false) const
Returns a circular string from the circle.
 
double perimeter() const override
The circumference of the ellipse using first approximation of Ramanujan.
 
bool tangentToPoint(const QgsPointXY &p, QgsPointXY &pt1, QgsPointXY &pt2) const
Calculates the tangent points between this circle and the point p.
 
static QgsCircle from3Points(const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double epsilon=1E-8)
Constructs a circle by 3 points on the circle.
 
QVector< QgsPoint > northQuadrant() const
The four quadrants of the ellipse.
 
static QgsCircle minimalCircleFrom3Points(const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double epsilon=1E-8)
Constructs the smallest circle from 3 points.
 
Circular string geometry type.
 
QgsPoint center() const
Returns the center point.
 
double semiMajorAxis() const
Returns the semi-major axis.
 
virtual QgsPointSequence points(unsigned int segments=36) const
Returns a list of points with segmentation from segments.
 
double azimuth() const
Returns the azimuth.
 
virtual QVector< QgsPoint > quadrant() const
The four quadrants of the ellipse.
 
virtual bool isEmpty() const
An ellipse is empty if axes are equal to 0.
 
double semiMinorAxis() const
Returns the semi-minor axis.
 
static double lineAngle(double x1, double y1, double x2, double y2)
Calculates the direction of line joining two points in radians, clockwise from the north direction.
 
static bool angleBisector(double aX, double aY, double bX, double bY, double cX, double cY, double dX, double dY, double &pointX, double &pointY, double &angle)
Returns the point (pointX, pointY) forming the bisector from segment (aX aY) (bX bY) and segment (bX,...
 
static int circleCircleIntersections(const QgsPointXY ¢er1, double radius1, const QgsPointXY ¢er2, double radius2, QgsPointXY &intersection1, QgsPointXY &intersection2)
Calculates the intersections points between the circle with center center1 and radius radius1 and the...
 
static int leftOfLine(const QgsPoint &point, const QgsPoint &p1, const QgsPoint &p2)
Returns a value < 0 if the point point is left of the line from p1 -> p2.
 
static bool segmentIntersection(const QgsPoint &p1, const QgsPoint &p2, const QgsPoint &q1, const QgsPoint &q2, QgsPoint &intersectionPoint, bool &isIntersection, double tolerance=1e-8, bool acceptImproperIntersection=false)
Compute the intersection between two segments.
 
static QgsLineString perpendicularSegment(const QgsPoint &p, const QgsPoint &s1, const QgsPoint &s2)
Create a perpendicular line segment from p to segment [s1, s2].
 
static QgsPoint midpoint(const QgsPoint &pt1, const QgsPoint &pt2)
Returns a middle point between points pt1 and pt2.
 
static bool tangentPointAndCircle(const QgsPointXY ¢er, double radius, const QgsPointXY &p, QgsPointXY &pt1, QgsPointXY &pt2)
Calculates the tangent points between the circle with the specified center and radius and the point p...
 
static int circleCircleOuterTangents(const QgsPointXY ¢er1, double radius1, const QgsPointXY ¢er2, double radius2, QgsPointXY &line1P1, QgsPointXY &line1P2, QgsPointXY &line2P1, QgsPointXY &line2P2)
Calculates the outer tangent points for two circles, centered at center1 and center2 and with radii o...
 
static bool transferFirstZOrMValueToPoint(Iterator verticesBegin, Iterator verticesEnd, QgsPoint &point)
A Z or M dimension is added to point if one of the points in the list points contains Z or M value.
 
static QDomElement pointsToGML3(const QgsPointSequence &points, QDomDocument &doc, int precision, const QString &ns, bool is3D, QgsAbstractGeometry::AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY)
Returns a gml::posList DOM element.
 
static int circleCircleInnerTangents(const QgsPointXY ¢er1, double radius1, const QgsPointXY ¢er2, double radius2, QgsPointXY &line1P1, QgsPointXY &line1P2, QgsPointXY &line2P1, QgsPointXY &line2P2)
Calculates the inner tangent points for two circles, centered at center1 and center2 and with radii o...
 
double length() const override
Returns the planar, 2-dimensional length of the geometry.
 
Point geometry type, with support for z-dimension and m-values.
 
void setY(double y)
Sets the point's y-coordinate.
 
bool addZValue(double zValue=0) override
Adds a z-dimension to the geometry, initialized to a preset value.
 
QString asWkt(int precision=17) const override
Returns a WKT representation of the geometry.
 
void setX(double x)
Sets the point's x-coordinate.
 
bool convertTo(Qgis::WkbType type) override
Converts the geometry to a specified type.
 
bool isEmpty() const override
Returns true if the geometry is empty.
 
double distance(double x, double y) const
Returns the Cartesian 2D distance between this point and a specified x, y coordinate.
 
QgsPoint project(double distance, double azimuth, double inclination=90.0) const
Returns a new point which corresponds to this point projected by a specified distance with specified ...
 
A rectangle specified with double values.
 
static Qgis::WkbType dropZ(Qgis::WkbType type)
Drops the z dimension (if present) for a WKB type and returns the new type.
 
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
QVector< QgsPoint > QgsPointSequence