30 mNumberSides = numSides;
36 mRadius = std::fabs( radius );
37 mFirstVertex = mCenter.
project( mRadius, azimuth );
42 mRadius = apothemToRadius( std::fabs( radius ), numSides );
57 mNumberSides = numSides;
69 mRadius = apothemToRadius( center.
distance( pt1 ), numSides );
70 double azimuth = center.
azimuth( pt1 );
85 mNumberSides = numSides;
87 double azimuth = pt1.
azimuth( pt2 );
91 double angle = ( 180 - ( 360 / numSides ) ) / 2.0;
92 double hypothenuse = length / std::cos( angle * M_PI / 180 );
95 mCenter = pt1.
project( hypothenuse, azimuth + angle );
97 mRadius = std::fabs( hypothenuse );
103 return ( ( mCenter == rp.mCenter ) &&
104 ( mFirstVertex == rp.mFirstVertex ) &&
105 ( mNumberSides == rp.mNumberSides )
116 return ( ( mNumberSides < 3 ) ||
119 ( mCenter == mFirstVertex )
125 double azimuth = mFirstVertex.
isEmpty() ? 0 : mCenter.
azimuth( mFirstVertex );
128 mFirstVertex = center.
project( mRadius, azimuth );
133 mRadius = std::fabs( radius );
134 double azimuth = mFirstVertex.
isEmpty() ? 0 : mCenter.
azimuth( mFirstVertex );
136 mFirstVertex = mCenter.
project( mRadius, azimuth );
141 double azimuth = mCenter.
azimuth( mFirstVertex );
144 mCenter = mFirstVertex.
project( mRadius, azimuth );
151 mNumberSides = numSides;
163 double azimuth = mCenter.
azimuth( mFirstVertex );
168 while ( n <= mNumberSides )
170 pts.push_back( mCenter.
project( mRadius, azimuth ) );
171 azimuth += azimuth_add;
172 if ( ( azimuth_add > 0 ) && ( azimuth > 180.0 ) )
185 std::unique_ptr<QgsPolygon> polygon(
new QgsPolygon() );
188 return polygon.release();
193 return polygon.release();
201 return ext.release();
207 ext->setPoints( pts );
208 ext->addVertex( pts.at( 0 ) );
210 return ext.release();
215 if (
isEmpty() || ( mNumberSides != 3 ) )
223 return QgsTriangle( pts.at( 0 ), pts.at( 1 ), pts.at( 2 ) );
228 QVector<QgsTriangle> l_tri;
238 while ( n < mNumberSides - 1 )
240 l_tri.append(
QgsTriangle( pts.at( n ), pts.at( n + 1 ), mCenter ) );
243 l_tri.append(
QgsTriangle( pts.at( n ), pts.at( 0 ), mCenter ) );
264 rep = QStringLiteral(
"Empty" );
266 rep = QStringLiteral(
"RegularPolygon (Center: %1, First Vertex: %2, Radius: %3, Azimuth: %4)" )
267 .arg( mCenter.
asWkt( pointPrecision ), 0,
's' )
268 .arg( mFirstVertex.
asWkt( pointPrecision ), 0,
's' )
284 return ( mRadius * mRadius * mNumberSides * std::sin(
centralAngle() * M_PI / 180.0 ) ) / 2;
294 return length() * mNumberSides;
304 return mRadius * 2 * std::sin( M_PI / mNumberSides );
307 double QgsRegularPolygon::apothemToRadius(
const double apothem,
const unsigned int numSides )
const 309 return apothem / std::cos( M_PI / numSides );
314 return ( nbSides - 2 ) * 180 / nbSides;
319 return 360.0 / nbSides;
double radius() const
Returns the radius.
bool operator!=(const QgsRegularPolygon &rp) const
void setFirstVertex(const QgsPoint &firstVertex)
Sets the first vertex.
QgsPoint center() const
Returns the center point of the regular polygon.
double distance(double x, double y) const
Returns the Cartesian 2D distance between this point and a specified x, y coordinate.
double azimuth(const QgsPoint &other) const
Calculates Cartesian azimuth between this point and other one (clockwise in degree, starting from north)
QVector< QgsTriangle > triangulate() const
Returns a triangulation (vertices from sides to the center) of the regular polygon.
QString toString(int pointPrecision=17, int radiusPrecision=17, int anglePrecision=2) const
Returns a string representation of the regular polygon.
QgsCircle inscribedCircle() const
Returns the inscribed circle.
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
QgsCircle circumscribedCircle() const
Returns the circumscribed circle.
QgsPointSequence points() const
Returns a list including the vertices of the regular polygon.
bool isEmpty() const
A regular polygon is empty if radius equal to 0 or number of sides < 3.
double area() const
Returns the area.
static QgsPoint midpoint(const QgsPoint &pt1, const QgsPoint &pt2)
Returns a middle point between points pt1 and pt2.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
double perimeter() const
Returns the perimeter.
QString asWkt(int precision=17) const override
Returns a WKT representation of the geometry.
Regular Polygon geometry type.
ConstructionOption
A regular polygon can be constructed inscribed in a circle or circumscribed about a circle...
QgsRegularPolygon()=default
Constructor for QgsRegularPolygon.
void setNumberSides(unsigned int numberSides)
Sets the number of sides.
double length() const
Returns the length of a side.
QgsPoint project(double distance, double azimuth, double inclination=90.0) const
Returns a new point which correspond to this point projected by a specified distance with specified a...
Point geometry type, with support for z-dimension and m-values.
double interiorAngle() const
Returns the measure of the interior angles in degrees.
QVector< QgsPoint > QgsPointSequence
void setCenter(const QgsPoint ¢er)
Sets the center point.
bool isEmpty() const override
Returns true if the geometry is empty.
bool operator==(const QgsRegularPolygon &rp) const
Line string geometry type, with support for z-dimension and m-values.
QgsLineString * toLineString() const
Returns as a linestring.
double apothem() const
Returns the apothem of the regular polygon.
double centralAngle() const
Returns the measure of the central angle (the angle subtended at the center of the polygon by one of ...
void setRadius(double radius)
Sets the radius.
QgsPolygon * toPolygon() const
Returns as a polygon.
QgsPoint firstVertex() const
Returns the first vertex (corner) of the regular polygon.
QgsTriangle toTriangle() const
Returns as a triangle.