Skip to content

Commit

Permalink
Fix order of lenghts and use law of cosines for angles. Fix #46370
Browse files Browse the repository at this point in the history
  • Loading branch information
lbartoletti committed Dec 5, 2021
1 parent dd0cd13 commit 23b8287
Showing 1 changed file with 24 additions and 22 deletions.
46 changes: 24 additions & 22 deletions src/core/geometry/qgstriangle.cpp
Expand Up @@ -373,9 +373,9 @@ QVector<double> QgsTriangle::lengths() const
if ( isEmpty() )
return lengths;

lengths.append( vertexAt( 0 ).distance( vertexAt( 1 ) ) );
lengths.append( vertexAt( 1 ).distance( vertexAt( 2 ) ) );
lengths.append( vertexAt( 2 ).distance( vertexAt( 0 ) ) );
lengths.append( vertexAt( 1 ).distance( vertexAt( 2 ) ) ); // a = |BC|
lengths.append( vertexAt( 0 ).distance( vertexAt( 2 ) ) ); // b = |AC|
lengths.append( vertexAt( 0 ).distance( vertexAt( 1 ) ) ); // c = |AB|

return lengths;
}
Expand All @@ -385,22 +385,24 @@ QVector<double> QgsTriangle::angles() const
QVector<double> angles;
if ( isEmpty() )
return angles;
double ax, ay, bx, by, cx, cy;

ax = vertexAt( 0 ).x();
ay = vertexAt( 0 ).y();
bx = vertexAt( 1 ).x();
by = vertexAt( 1 ).y();
cx = vertexAt( 2 ).x();
cy = vertexAt( 2 ).y();
QVector<double> l = lengths();

const double a1 = std::fmod( QgsGeometryUtils::angleBetweenThreePoints( cx, cy, ax, ay, bx, by ), M_PI );
const double a2 = std::fmod( QgsGeometryUtils::angleBetweenThreePoints( ax, ay, bx, by, cx, cy ), M_PI );
const double a3 = std::fmod( QgsGeometryUtils::angleBetweenThreePoints( bx, by, cx, cy, ax, ay ), M_PI );
const double a = l[0];
const double b = l[1];
const double c = l[2];

angles.append( ( a1 > M_PI_2 ? a1 - M_PI_2 : a1 ) );
angles.append( ( a2 > M_PI_2 ? a2 - M_PI_2 : a2 ) );
angles.append( ( a3 > M_PI_2 ? a3 - M_PI_2 : a3 ) );
const double a2 = a * a;
const double b2 = b * b;
const double c2 = c * c;

const double alpha = acos( ( b2 + c2 - a2 ) / ( 2 * b * c ) );
const double beta = acos( ( a2 + c2 - b2 ) / ( 2 * a * c ) );
const double gamma = M_PI - alpha - beta; // acos((a2 + b2 - c2)/(2*a*b)); but ensure that alpha+beta+gamma = 180.0

angles.append( alpha );
angles.append( beta );
angles.append( gamma );

return angles;
}
Expand Down Expand Up @@ -577,12 +579,12 @@ QgsPoint QgsTriangle::inscribedCenter() const
return QgsPoint();

const QVector<double> l = lengths();
const double x = ( l.at( 0 ) * vertexAt( 2 ).x() +
l.at( 1 ) * vertexAt( 0 ).x() +
l.at( 2 ) * vertexAt( 1 ).x() ) / perimeter();
const double y = ( l.at( 0 ) * vertexAt( 2 ).y() +
l.at( 1 ) * vertexAt( 0 ).y() +
l.at( 2 ) * vertexAt( 1 ).y() ) / perimeter();
const double x = ( l.at( 0 ) * vertexAt( 0 ).x() +
l.at( 1 ) * vertexAt( 1 ).x() +
l.at( 2 ) * vertexAt( 2 ).x() ) / perimeter();
const double y = ( l.at( 0 ) * vertexAt( 0 ).y() +
l.at( 1 ) * vertexAt( 1 ).y() +
l.at( 2 ) * vertexAt( 2 ).y() ) / perimeter();

QgsPoint center( x, y );

Expand Down

0 comments on commit 23b8287

Please sign in to comment.