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 ) ||
117 ( mCenter == mFirstVertex )
123 double azimuth = mCenter.
azimuth( mFirstVertex );
126 mFirstVertex = center.
project( mRadius, azimuth );
131 mRadius = std::fabs( radius );
132 double azimuth = mCenter.
azimuth( mFirstVertex );
134 mFirstVertex = mCenter.
project( mRadius, azimuth );
139 double azimuth = mCenter.
azimuth( mFirstVertex );
142 mCenter = mFirstVertex.
project( mRadius, azimuth );
149 mNumberSides = numSides;
161 double azimuth = mCenter.
azimuth( mFirstVertex );
166 while ( n <= mNumberSides )
168 pts.push_back( mCenter.
project( mRadius, azimuth ) );
169 azimuth += azimuth_add;
170 if ( ( azimuth_add > 0 ) && ( azimuth > 180.0 ) )
183 std::unique_ptr<QgsPolygon> polygon(
new QgsPolygon() );
186 return polygon.release();
191 return polygon.release();
199 return ext.release();
205 ext->setPoints( pts );
206 ext->addVertex( pts.at( 0 ) );
208 return ext.release();
213 if (
isEmpty() || ( mNumberSides != 3 ) )
221 return QgsTriangle( pts.at( 0 ), pts.at( 1 ), pts.at( 2 ) );
226 QVector<QgsTriangle> l_tri;
236 while ( n < mNumberSides - 1 )
238 l_tri.append(
QgsTriangle( pts.at( n ), pts.at( n + 1 ), mCenter ) );
241 l_tri.append(
QgsTriangle( pts.at( n ), pts.at( 0 ), mCenter ) );
262 rep = QStringLiteral(
"Empty" );
264 rep = QStringLiteral(
"RegularPolygon (Center: %1, First Vertex: %2, Radius: %3, Azimuth: %4)" )
265 .arg( mCenter.
asWkt( pointPrecision ), 0,
's' )
266 .arg( mFirstVertex.
asWkt( pointPrecision ), 0,
's' )
282 return ( mRadius * mRadius * mNumberSides * std::sin(
centralAngle() * M_PI / 180.0 ) ) / 2;
292 return length() * mNumberSides;
302 return mRadius * 2 * std::sin( M_PI / mNumberSides );
305 double QgsRegularPolygon::apothemToRadius(
const double apothem,
const unsigned int numSides )
const 307 return apothem / std::cos( M_PI / numSides );
312 return ( nbSides - 2 ) * 180 / nbSides;
317 return 360.0 / nbSides;
void setFirstVertex(const QgsPoint &firstVertex)
Sets the first vertex.
double centralAngle() const
Returns the measure of the central angle (the angle subtended at the center of the polygon by one of ...
QgsPointSequence points() const
Returns a list including the vertices of the regular polygon.
QString toString(int pointPrecision=17, int radiusPrecision=17, int anglePrecision=2) const
Returns a string representation of the regular polygon.
QgsLineString * toLineString() const
Returns as a linestring.
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)
double radius() const
Returns the radius.
QgsPoint firstVertex() const
Returns the first vertex (corner) of the regular polygon.
double azimuth(const QgsPoint &other) const
Calculates 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.
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.
QString asWkt(int precision=17) const override
Returns a WKT representation of the geometry.
Regular Polygon geometry type.
double length() const
Returns the length of a side.
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 interiorAngle() const
Returns the measure of the interior angles in degrees.
This document describes what qgis_wms supports does not support use feature geometry circle
Point geometry type, with support for z-dimension and m-values.
bool operator==(const QgsRegularPolygon &rp) const
QgsTriangle toTriangle() const
Returns as a triangle.
QgsCircle circumscribedCircle() const
Returns the circumscribed circle.
QgsPoint center() const
Returns the center point of the regular polygon.
double distance(double x, double y) const
Returns the distance between this point and a specified x, y coordinate.
QVector< QgsPoint > QgsPointSequence
void setCenter(const QgsPoint ¢er)
Sets the center point.
double area() const
Returns the area.
QgsPolygon * toPolygon() const
Returns as a polygon.
Line string geometry type, with support for z-dimension and m-values.
QgsCircle inscribedCircle() const
Returns the inscribed circle.
bool operator!=(const QgsRegularPolygon &rp) const
void setRadius(double radius)
Sets the radius.
double apothem() const
Returns the apothem of the regular polygon.
double perimeter() const
Returns the perimeter.
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...
bool isEmpty() const
A regular polygon is empty if radius equal to 0 or number of sides < 3.