30 mNumberSides = numSides;
36 mRadius = std::fabs(
radius );
37 mFirstVertex = mCenter.
project( mRadius, azimuth );
42 mRadius = apothemToRadius( std::fabs(
radius ), numSides );
57 mNumberSides = numSides;
85 mNumberSides = numSides;
87 const double azimuth = pt1.
azimuth( pt2 );
91 const double angle = ( 180 - ( 360 / numSides ) ) / 2.0;
92 const double hypothenuse =
length / std::cos(
angle * M_PI / 180 );
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 const double azimuth = mFirstVertex.
isEmpty() ? 0 : mCenter.
azimuth( mFirstVertex );
133 mRadius = std::fabs(
radius );
134 const double azimuth = mFirstVertex.
isEmpty() ? 0 : mCenter.
azimuth( mFirstVertex );
136 mFirstVertex = mCenter.
project( mRadius, azimuth );
141 const 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;
static QgsPoint midpoint(const QgsPoint &pt1, const QgsPoint &pt2) SIP_HOLDGIL
Returns a middle point between points pt1 and pt2.
Line string geometry type, with support for z-dimension and m-values.
Point geometry type, with support for z-dimension and m-values.
double distance(double x, double y) const SIP_HOLDGIL
Returns the Cartesian 2D distance between this point and a specified x, y coordinate.
bool isEmpty() const override SIP_HOLDGIL
Returns true if the geometry is empty.
QgsPoint project(double distance, double azimuth, double inclination=90.0) const SIP_HOLDGIL
Returns a new point which corresponds to this point projected by a specified distance with specified ...
QString asWkt(int precision=17) const override
Returns a WKT representation of the geometry.
double azimuth(const QgsPoint &other) const SIP_HOLDGIL
Calculates Cartesian azimuth between this point and other one (clockwise in degree,...
Regular Polygon geometry type.
QgsPointSequence points() const
Returns a list including the vertices of the regular polygon.
double radius() const SIP_HOLDGIL
Returns the radius.
QString toString(int pointPrecision=17, int radiusPrecision=17, int anglePrecision=2) const
Returns a string representation of the regular polygon.
QgsPoint firstVertex() const SIP_HOLDGIL
Returns the first vertex (corner) of the regular polygon.
double length() const SIP_HOLDGIL
Returns the length of a side.
void setCenter(const QgsPoint ¢er) SIP_HOLDGIL
Sets the center point.
QgsLineString * toLineString() const
Returns as a linestring.
double interiorAngle() const SIP_HOLDGIL
Returns the measure of the interior angles in degrees.
bool isEmpty() const SIP_HOLDGIL
A regular polygon is empty if radius equal to 0 or number of sides < 3.
ConstructionOption
A regular polygon can be constructed inscribed in a circle or circumscribed about a circle.
@ CircumscribedCircle
Circumscribed about a circle (the radius is the distance from the center to the midpoints of the side...
@ InscribedCircle
Inscribed in a circle (the radius is the distance between the center and vertices)
double perimeter() const SIP_HOLDGIL
Returns the perimeter.
QgsCircle circumscribedCircle() const SIP_HOLDGIL
Returns the circumscribed circle.
bool operator==(const QgsRegularPolygon &rp) const SIP_HOLDGIL
QgsPoint center() const SIP_HOLDGIL
Returns the center point of the regular polygon.
QgsTriangle toTriangle() const
Returns as a triangle.
void setNumberSides(unsigned int numberSides) SIP_HOLDGIL
Sets the number of sides.
QgsCircle inscribedCircle() const SIP_HOLDGIL
Returns the inscribed circle.
QgsPolygon * toPolygon() const
Returns as a polygon.
void setRadius(double radius) SIP_HOLDGIL
Sets the radius.
void setFirstVertex(const QgsPoint &firstVertex) SIP_HOLDGIL
Sets the first vertex.
double apothem() const SIP_HOLDGIL
Returns the apothem of the regular polygon.
QgsRegularPolygon() SIP_HOLDGIL=default
Constructor for QgsRegularPolygon.
double centralAngle() const SIP_HOLDGIL
Returns the measure of the central angle (the angle subtended at the center of the polygon by one of ...
QVector< QgsTriangle > triangulate() const
Returns a triangulation (vertices from sides to the center) of the regular polygon.
bool operator!=(const QgsRegularPolygon &rp) const SIP_HOLDGIL
double area() const SIP_HOLDGIL
Returns the area.
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)
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
QVector< QgsPoint > QgsPointSequence