QgsCircle QgsCircle::fromExtent( const QgsPoint &pt1, const QgsPoint &pt2 ) { double delta_x = qAbs( pt1.x() - pt2.x() ); double delta_y = qAbs( pt1.x() - pt2.y() ); if ( !qgsDoubleNear( delta_x, delta_y ) ) { return QgsCircle(); } return QgsCircle( QgsGeometryUtils::midpoint( pt1, pt2 ), delta_x / 2.0, 0 ); }
void QgsMapToolCircle3Points::cadCanvasMoveEvent( QgsMapMouseEvent *e ) { QgsPoint point = mapPoint( *e ); if ( mTempRubberBand ) { switch ( mPoints.size() ) { case 1: { std::unique_ptr<QgsLineString> line( new QgsLineString() ); line->addVertex( mPoints.at( 0 ) ); line->addVertex( point ); mTempRubberBand->setGeometry( line.release() ); } break; case 2: { mCircle = QgsCircle().from3Points( mPoints.at( 0 ), mPoints.at( 1 ), point ); mTempRubberBand->setGeometry( mCircle.toCircularString( true ) ); } break; default: break; } } }
QgsCircle QgsCircle::from2Points( const QgsPoint &pt1, const QgsPoint &pt2 ) { QgsPoint center = QgsGeometryUtils::midpoint( pt1, pt2 ); double azimuth = QgsGeometryUtils::lineAngle( pt1.x(), pt1.y(), pt2.x(), pt2.y() ) * 180.0 / M_PI; double radius = pt1.distance( pt2 ); return QgsCircle( center, radius, azimuth ); }
void QgsMapToolCircleCenterPoint::cadCanvasMoveEvent( QgsMapMouseEvent *e ) { QgsPoint point = mapPoint( *e ); mSnapIndicator->setMatch( e->mapPointMatch() ); if ( mTempRubberBand ) { mCircle = QgsCircle().fromCenterPoint( mPoints.at( 0 ), point ); mTempRubberBand->setGeometry( mCircle.toCircularString( true ) ); } }
void QgsMapToolAddCircle::clean() { if ( mTempRubberBand ) { delete mTempRubberBand; mTempRubberBand = nullptr; } mPoints.clear(); if ( mParentTool ) { mParentTool->deleteTempRubberBand(); } mCircle = QgsCircle(); QgsVectorLayer *vLayer = static_cast<QgsVectorLayer *>( QgisApp::instance()->activeLayer() ); if ( vLayer ) mLayerType = vLayer->geometryType(); }
QgsCircle QgsRegularPolygon::circumscribedCircle() const { // TODO: inclined circle return QgsCircle( mCenter, mRadius ); }
QgsCircle QgsRegularPolygon::inscribedCircle() const { // TODO: inclined circle return QgsCircle( mCenter, apothem() ); }
QgsCircle QgsCircle::from3Points( const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double epsilon ) { QgsPoint p1, p2, p3; if ( !isPerpendicular( pt1, pt2, pt3, epsilon ) ) { p1 = pt1; p2 = pt2; p3 = pt3; } else if ( !isPerpendicular( pt1, pt3, pt2, epsilon ) ) { p1 = pt1; p2 = pt3; p3 = pt2; } else if ( !isPerpendicular( pt2, pt1, pt3, epsilon ) ) { p1 = pt2; p2 = pt1; p3 = pt3; } else if ( !isPerpendicular( pt2, pt3, pt1, epsilon ) ) { p1 = pt2; p2 = pt3; p3 = pt1; } else if ( !isPerpendicular( pt3, pt2, pt1, epsilon ) ) { p1 = pt3; p2 = pt2; p3 = pt1; } else if ( !isPerpendicular( pt3, pt1, pt2, epsilon ) ) { p1 = pt3; p2 = pt1; p3 = pt2; } else { return QgsCircle(); } QgsPoint center = QgsPoint(); double radius = -0.0; // Paul Bourke's algorithm double yDelta_a = p2.y() - p1.y(); double xDelta_a = p2.x() - p1.x(); double yDelta_b = p3.y() - p2.y(); double xDelta_b = p3.x() - p2.x(); if ( qgsDoubleNear( xDelta_a, 0.0, epsilon ) || qgsDoubleNear( xDelta_b, 0.0, epsilon ) ) { return QgsCircle(); } double aSlope = yDelta_a / xDelta_a; double bSlope = yDelta_b / xDelta_b; if ( ( qAbs( xDelta_a ) <= epsilon ) && ( qAbs( yDelta_b ) <= epsilon ) ) { center.setX( 0.5 * ( p2.x() + p3.x() ) ); center.setY( 0.5 * ( p1.y() + p2.y() ) ); radius = center.distance( pt1 ); return QgsCircle( center, radius ); } if ( qAbs( aSlope - bSlope ) <= epsilon ) { return QgsCircle(); } center.setX( ( aSlope * bSlope * ( p1.y() - p3.y() ) + bSlope * ( p1.x() + p2.x() ) - aSlope * ( p2.x() + p3.x() ) ) / ( 2.0 * ( bSlope - aSlope ) ) ); center.setY( -1.0 * ( center.x() - ( p1.x() + p2.x() ) / 2.0 ) / aSlope + ( p1.y() + p2.y() ) / 2.0 ); radius = center.distance( p1 ); return QgsCircle( center, radius ); }
QgsCircle QgsCircle::fromCenterPoint( const QgsPoint ¢er, const QgsPoint &pt1 ) { double azimuth = QgsGeometryUtils::lineAngle( center.x(), center.y(), pt1.x(), pt1.y() ) * 180.0 / M_PI; return QgsCircle( center, center.distance( pt1 ), azimuth ); }
QgsCircle QgsCircle::fromCenterDiameter( const QgsPoint ¢er, double diameter, double azimuth ) { return QgsCircle( center, diameter / 2.0, azimuth ); }
QgsCircle QgsTriangle::inscribedCircle() const { return QgsCircle( inscribedCenter(), inscribedRadius() ); }
QgsCircle QgsTriangle::circumscribedCircle() const { return QgsCircle( circumscribedCenter(), circumscribedRadius() ); }