24 if ( p1 && p2 && p3 && result )
27 const double area =
triArea( p1, p2, p3 );
32 const double area1 =
triArea( &p, p2, p3 );
33 const double area2 =
triArea( p1, &p, p3 );
34 const double area3 =
triArea( p1, p2, &p );
35 const double u = area1 / area;
36 const double v = area2 / area;
37 const double w = area3 / area;
45 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );
55 if ( p1 && p2 && p3 && result )
57 const double area =
triArea( p1, p2, p3 );
61 QgsDebugMsg( QStringLiteral(
"warning, p1, p2 and p3 are in a line" ) );
65 const double denominator = ( ( p2->
y() - p3->
y() ) * ( p1->
x() - p3->
x() ) - ( p3->
y() - p1->
y() ) * ( p3->
x() - p2->
x() ) );
66 if ( denominator != 0 )
68 px = ( 2 * u * area * ( p1->
x() - p3->
x() ) - 2 * v * area * ( p3->
x() - p2->
x() ) - p2->
x() * p3->
y() * ( p1->
x() - p3->
x() ) + p3->
x() * p1->
y() * ( p3->
x() - p2->
x() ) + p3->
x() * p2->
y() * ( p1->
x() - p3->
x() ) - p1->
x() * p3->
y() * ( p3->
x() - p2->
x() ) ) / denominator;
69 if ( ( p3->
x() - p2->
x() ) != 0 )
71 py = ( 2 * u * area - px * ( p2->
y() - p3->
y() ) - p2->
x() * p3->
y() + p3->
x() * p2->
y() ) / ( p3->
x() - p2->
x() );
75 py = ( 2 * v * area - px * ( p3->
y() - p1->
y() ) - p3->
x() * p1->
y() + p1->
x() * p3->
y() ) / ( p1->
x() - p3->
x() );
80 py = ( 2 * u * area * ( p3->
y() - p1->
y() ) - 2 * v * area * ( p2->
y() - p3->
y() ) - p2->
x() * p3->
y() * ( p3->
y() - p1->
y() ) + p3->
x() * p1->
y() * ( p2->
y() - p3->
y() ) + p3->
x() * p2->
y() * ( p3->
y() - p1->
y() ) - p1->
x() * p3->
y() * ( p2->
y() - p3->
y() ) ) / ( ( p3->
x() - p2->
x() ) * ( p3->
y() - p1->
y() ) - ( p1->
x() - p3->
x() ) * ( p2->
y() - p3->
y() ) );
81 if ( ( p2->
y() - p3->
y() ) != 0 )
83 px = ( 2 * u * area - py * ( p3->
x() - p2->
x() ) - p2->
x() * p3->
y() + p3->
x() * p2->
y() ) / ( p2->
y() - p3->
y() );
87 px = ( 2 * v * area - py * ( p1->
x() - p3->
x() ) - p3->
x() * p1->
y() + p1->
x() * p3->
y() ) / ( p3->
y() - p1->
y() );
96 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );
108 return lower( n, i ) * std::pow( t, i ) * std::pow( ( 1 - t ), ( n - i ) );
118 if ( p1 && p2 && p3 && result )
120 const double distp1p2 = std::sqrt( ( p1->
x() - p2->
x() ) * ( p1->
x() - p2->
x() ) + ( p1->
y() - p2->
y() ) * ( p1->
y() - p2->
y() ) );
121 const double distp2p3 = std::sqrt( ( p2->
x() - p3->
x() ) * ( p2->
x() - p3->
x() ) + ( p2->
y() - p3->
y() ) * ( p2->
y() - p3->
y() ) );
122 if ( distp1p2 > distp2p3 )
129 const double denominator = -p3->
x() * p2->
y() + p3->
x() * p1->
y() + p1->
x() * p2->
y() + p2->
x() * p3->
y() - p2->
x() * p1->
y() - p1->
x() * p3->
y();
131 if ( denominator == 0 )
133 QgsDebugMsg( QStringLiteral(
"error: the three points are in a line" ) );
138 result->
setX( 0.5 * ( p1->
x()*p1->
x()*p2->
y() - p1->
x()*p1->
x()*p3->
y() - p3->
x()*p3->
x()*p2->
y() - p1->
y()*p2->
x()*p2->
x() - p1->
y()*p1->
y()*p3->
y() - p3->
y()*p3->
y()*p2->
y() + p1->
y()*p1->
y()*p2->
y() + p3->
y()*p2->
x()*p2->
x() - p1->
y()*p2->
y()*p2->
y() + p1->
y()*p3->
y()*p3->
y() + p1->
y()*p3->
x()*p3->
x() + p3->
y()*p2->
y()*p2->
y() ) / denominator );
139 result->
setY( -0.5 * ( p3->
x()*p2->
x()*p2->
x() + p2->
x()*p1->
y()*p1->
y() + p3->
x()*p2->
y()*p2->
y() - p3->
x()*p1->
x()*p1->
x() + p1->
x()*p3->
y()*p3->
y() - p3->
x()*p1->
y()*p1->
y() - p1->
x()*p2->
x()*p2->
x() - p2->
x()*p3->
y()*p3->
y() - p1->
x()*p2->
y()*p2->
y() - p2->
x()*p3->
x()*p3->
x() + p1->
x()*p3->
x()*p3->
x() + p2->
x()*p1->
x()*p1->
x() ) / denominator );
143 double dist1 = std::sqrt( ( p1->getX() - result->getX() ) * ( p1->getX() - result->getX() ) + ( p1->getY() - result->getY() ) * ( p1->getY() - result->getY() ) );
144 double dist2 = std::sqrt( ( p2->getX() - result->getX() ) * ( p2->getX() - result->getX() ) + ( p2->getY() - result->getY() ) * ( p2->getY() - result->getY() ) );
145 double dist3 = std::sqrt( ( p3->getX() - result->getX() ) * ( p3->getX() - result->getX() ) + ( p3->getY() - result->getY() ) * ( p3->getY() - result->getY() ) );
147 if ( dist1 - dist2 > 1 || dist2 - dist1 > 1 || dist1 - dist3 > 1 || dist3 - dist1 > 1 )
158 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );
166 if ( p1 && p2 && p3 && result )
168 QgsPoint midpoint12( ( p1->getX() + p2->getX() ) / 2, ( p1->getY() + p2->getY() ) / 2, 0 );
169 QgsPoint midpoint23( ( p2->getX() + p3->getX() ) / 2, ( p2->getY() + p3->getY() ) / 2, 0 );
170 Vector3D v12( p2->getX() - p1->getX(), p2->getY() - p1->getY(), 0 );
171 Vector3D v23( p3->getX() - p2->getX(), p3->getY() - p2->getY(), 0 );
176 QgsPoint helppoint1( midpoint12.getX() + n12.
getX(), midpoint12.getY() + n12.
getY(), 0 );
177 QgsPoint helppoint2( midpoint23.getX() + n23.
getX(), midpoint23.getY() + n23.
getY(), 0 );
181 double dist1 = std::sqrt( ( p1->getX() - result->getX() ) * ( p1->getX() - result->getX() ) + ( p1->getY() - result->getY() ) * ( p1->getY() - result->getY() ) );
182 double dist2 = std::sqrt( ( p2->getX() - result->getX() ) * ( p2->getX() - result->getX() ) + ( p2->getY() - result->getY() ) * ( p2->getY() - result->getY() ) );
183 double dist3 = std::sqrt( ( p3->getX() - result->getX() ) * ( p3->getX() - result->getX() ) + ( p3->getY() - result->getY() ) * ( p3->getY() - result->getY() ) );
185 if ( dist1 - dist2 > 1 || dist2 - dist1 > 1 || dist1 - dist3 > 1 || dist3 - dist1 > 1 )
195 cout <<
"null pointer in method MathUtils::circumcenter" << endl << flush;
203 if ( thepoint && p1 && p2 )
206 Vector3D line( p2->
x() - p1->
x(), p2->
y() - p1->
y(), 0 );
208 const double a = normal.
getX();
209 const double b = normal.
getY();
210 const double c = -( normal.
getX() * p2->
x() + normal.
getY() * p2->
y() );
211 const double distance = std::fabs( ( a * thepoint->
x() + b * thepoint->
y() +
c ) / ( std::sqrt( a * a + b * b ) ) );
216 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );
223 return std::tgamma( n + 1 );
228 const double tolerance = 0.0001;
230 if ( testp && p1 && p2 && p3 )
238 double px = testp->
x();
239 double py = testp->
y();
241 const double xmin = std::min( std::min( ax, px ), std::min( bx, cx ) );
242 const double ymin = std::min( std::min( ay, py ), std::min( by, cy ) );
252 double aValue = ( ax * ax + ay * ay ) *
triArea( p2, p3, testp );
253 aValue = aValue - ( ( bx * bx + by * by ) *
triArea( p1, p3, testp ) );
254 aValue = aValue + ( ( cx * cx + cy * cy ) *
triArea( p1, p2, testp ) );
255 aValue = aValue - ( ( px * px + py * py ) *
triArea( p1, p2, p3 ) );
257 return aValue > tolerance;
261 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );
268 return angle( p1, point, p2, point ) > 90;
274 if ( p1 && p2 && point )
276 Vector3D p1p2( p2->getX() - p1->getX(), p2->getY() - p1->getY(), 0 );
278 QgsPoint midpoint( ( p1->getX() + p2->getX() ) / 2, ( p1->getY() + p2->getY() ) / 2, 0 );
279 double radius = p1p2.getLength() / 2;
281 QgsPoint p3( midpoint.getX() + orthogonalvec.
getX(), midpoint.getY() + orthogonalvec.
getY(), 0 );
282 return inCircle( point, p1, p2, &p3 );
286 cout <<
"null pointer in MathUtils::inDiametral" << endl << flush;
297 const double f1 = thepoint.
x() - p1->
x();
298 const double f2 = p2->
y() - p1->
y();
299 const double f3 = thepoint.
y() - p1->
y();
300 const double f4 = p2->
x() - p1->
x();
301 return f1 * f2 - f3 * f4;
306 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );
313 if ( p1 && p2 && p3 && p4 )
316 const Vector3D p1p2( p2->
x() - p1->
x(), p2->
y() - p1->
y(), 0 );
317 const Vector3D p3p4( p4->
x() - p3->
x(), p4->
y() - p3->
y(), 0 );
321 t1 = ( p3->
x() - p1->
x() + t2 * p3p4.
getX() ) / p1p2.
getX();
326 t2 = ( p1->
x() + t1 * p1p2.
getX() - p3->
x() ) / p3p4.
getX();
333 if ( t1 > 0 && t1 < 1 && t2 > 0 && t2 < 1 )
335 if ( ( *p1 ) == ( *p3 ) || ( *p1 ) == ( *p4 ) || ( *p2 ) == ( *p3 ) || ( *p2 ) == ( *p4 ) )
349 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );
356 if ( p1 && p2 && p3 && p4 )
359 const Vector3D p1p2( p2->
x() - p1->
x(), p2->
y() - p1->
y(), 0 );
360 const Vector3D p3p4( p4->
x() - p3->
x(), p4->
y() - p3->
y(), 0 );
364 t1 = ( p3->
x() - p1->
x() + t2 * p3p4.
getX() ) / p1p2.
getX();
369 t2 = ( p1->
x() + t1 * p1p2.
getX() - p3->
x() ) / p3p4.
getX();
373 intersection_point->
setX( 0 );
374 intersection_point->
setY( 0 );
375 intersection_point->
setZ( 0 );
379 if ( t1 > 0 && t1 < 1 && t2 > 0 && t2 < 1 )
381 if ( ( *p1 ) == ( *p3 ) || ( *p1 ) == ( *p4 ) || ( *p2 ) == ( *p3 ) || ( *p2 ) == ( *p4 ) )
383 intersection_point->
setX( 0 );
384 intersection_point->
setY( 0 );
385 intersection_point->
setZ( 0 );
389 intersection_point->
setX( p1->
x() * ( 1 - t1 ) + p2->
x()*t1 );
390 intersection_point->
setY( p1->
y() * ( 1 - t1 ) + p2->
y()*t1 );
391 intersection_point->
setZ( 0 );
402 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );
409 if ( i >= 0 && i <= n )
421 if ( pa && pb && pc )
423 const double deter = ( pa->
x() * pb->
y() + pb->
x() * pc->
y() + pc->
x() * pa->
y() - pa->
x() * pc->
y() - pb->
x() * pa->
y() - pc->
x() * pb->
y() );
428 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );
435 if ( n != 3 || i > n )
437 QgsDebugMsg( QStringLiteral(
"error, can't calculate hermite polynom" ) );
440 if ( n == 3 && i == 0 )
445 if ( n == 3 && i == 1 )
450 if ( n == 3 && i == 2 )
455 if ( n == 3 && i == 3 )
461 QgsDebugMsg( QStringLiteral(
"unexpected error" ) );
468 if ( n != 3 || i > n )
470 QgsDebugMsg( QStringLiteral(
"error, can't calculate hermite polynom" ) );
473 if ( n == 3 && i == 0 )
480 if ( n == 3 && i == 1 )
486 if ( n == 3 && i == 2 )
492 if ( n == 3 && i == 3 )
500 QgsDebugMsg( QStringLiteral(
"unexpected error" ) );
507 if ( v1 && v2 && result )
524 if ( v1->
getY() == 0 )
528 if ( v1->
getX() < 0 )
530 result->
setY( -length );
535 result->
setY( length );
541 const double a = 1 + ( v1->
getX() * v1->
getX() ) / ( v1->
getY() * v1->
getY() );
543 const double c = -( length * length );
544 const double d = b * b - 4 * a *
c;
548 QgsDebugMsg( QStringLiteral(
"Determinant Error" ) );
552 result->
setX( ( -b + std::sqrt( d ) ) / ( 2 * a ) );
559 if ( !(
leftOf( point1, &point2, &point3 ) < 0 ) )
581 if ( v1->
getY() == 0 )
585 if ( v1->
getX() < 0 )
587 result->
setY( length );
592 result->
setY( -length );
598 const double a = 1 + ( v1->
getX() * v1->
getX() ) / ( v1->
getY() * v1->
getY() );
600 const double c = -( length * length );
601 const double d = b * b - 4 * a *
c;
605 QgsDebugMsg( QStringLiteral(
"Determinant Error" ) );
609 result->
setX( ( -b + std::sqrt( d ) ) / ( 2 * a ) );
616 if ( (
leftOf( point1, &point2, &point3 ) < 0 ) )
634 if ( p1 && p2 && p3 && vec )
636 const double ax = p2->
x() - p1->
x();
637 const double ay = p2->
y() - p1->
y();
638 const double az = p2->
z() - p1->
z();
639 const double bx = p3->
x() - p1->
x();
640 const double by = p3->
y() - p1->
y();
641 const double bz = p3->
z() - p1->
z();
643 vec->
setX( ay * bz - az * by );
644 vec->
setY( az * bx - ax * bz );
645 vec->
setZ( ax * by - ay * bx );
652 if ( first && vec1 && second && vec2 )
662 return ( ( first->
x() * vec1->
getY() - first->
y() * vec1->
getX() - second->
x() * vec1->
getY() + second->
y() * vec1->
getX() ) / ( vec2->
getX() * vec1->
getY() - vec2->
getY() * vec1->
getX() ) );
667 QgsDebugMsg( QStringLiteral(
"warning: vectors are parallel" ) );
675 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );
700 if ( tangent && target && result )
702 const double xt = tangent->
getX();
703 const double yt = tangent->
getY();
704 const double zt = tangent->
getZ();
706 const double xw = target->
getX();
707 const double yw = target->
getY();
708 const double zw = target->
getZ();
710 double xg1, yg1, zg1;
711 double xg2, yg2, zg2;
714 const double xgalpha1 = 1 / ( 2 * xt * xt * yw * yw * zt * zt - 2 * zt * zt * zt * xt * zw * xw + yt * yt * yt * yt * zw * zw + yt * yt * zw * zw * zt * zt + xt * xt * yt * yt * xw * xw + xt * xt * yw * yw * yt * yt - 2 * xt * xt * xt * zt * zw * xw + yt * yt * yt * yt * xw * xw + yt * yt * yw * yw * zt * zt + 2 * xt * xt * yt * yt * zw * zw - 2 * yt * yt * yt * yw * zt * zw + zt * zt * xt * xt * zw * zw + zt * zt * zt * zt * xw * xw + xt * xt * zt * zt * xw * xw + 2 * zt * zt * xw * xw * yt * yt - 2 * xt * xt * yw * zt * yt * zw - 2 * xt * yt * yt * yt * xw * yw - 2 * xt * xt * xt * yw * yt * xw - 2 * xt * zt * zt * xw * yt * yw - 2 * xt * zt * xw * yt * yt * zw - 2 * yw * zt * zt * zt * yt * zw + xt * xt * xt * xt * yw * yw + yw * yw * zt * zt * zt * zt + xt * xt * xt * xt * zw * zw );
717 QgsDebugMsg( QStringLiteral(
"warning, only complex solution of xg" ) );
720 xg1 = std::sqrt( xgalpha1 ) * ( -yt * yw * xt + yt * yt * xw + xw * zt * zt - zt * xt * zw );
721 xg2 = -sqrt( xgalpha1 ) * ( -yt * yw * xt + yt * yt * xw + xw * zt * zt - zt * xt * zw );
724 const double ygalpha1 = 1 / ( 2 * xt * xt * yw * yw * zt * zt - 2 * zt * zt * zt * xt * zw * xw + yt * yt * yt * yt * zw * zw + yt * yt * zw * zw * zt * zt + xt * xt * yt * yt * xw * xw + xt * xt * yw * yw * yt * yt - 2 * xt * xt * xt * zt * zw * xw + yt * yt * yt * yt * xw * xw + yt * yt * yw * yw * zt * zt + 2 * xt * xt * yt * yt * zw * zw - 2 * yt * yt * yt * yw * zt * zw + zt * zt * xt * xt * zw * zw + zt * zt * zt * zt * xw * xw + xt * xt * zt * zt * xw * xw + 2 * zt * zt * xw * xw * yt * yt - 2 * xt * xt * yw * zt * yt * zw - 2 * xt * yt * yt * yt * xw * yw - 2 * xt * xt * xt * yw * yt * xw - 2 * xt * zt * zt * xw * yt * yw - 2 * xt * zt * xw * yt * yt * zw - 2 * yw * zt * zt * zt * yt * zw + xt * xt * xt * xt * yw * yw + yw * yw * zt * zt * zt * zt + xt * xt * xt * xt * zw * zw );
727 QgsDebugMsg( QStringLiteral(
"warning, only complex solution of yg" ) );
730 yg1 = -sqrt( ygalpha1 ) * ( -yw * xt * xt - zt * zt * yw + zt * yt * zw + yt * xw * xt );
731 yg2 = std::sqrt( ygalpha1 ) * ( -yw * xt * xt - zt * zt * yw + zt * yt * zw + yt * xw * xt );
734 const double zgalpha1 = 1 / ( 2 * xt * xt * yw * yw * zt * zt - 2 * zt * zt * zt * xt * zw * xw + yt * yt * yt * yt * zw * zw + yt * yt * zw * zw * zt * zt + xt * xt * yt * yt * xw * xw + xt * xt * yw * yw * yt * yt - 2 * xt * xt * xt * zt * zw * xw + yt * yt * yt * yt * xw * xw + yt * yt * yw * yw * zt * zt + 2 * xt * xt * yt * yt * zw * zw - 2 * yt * yt * yt * yw * zt * zw + zt * zt * xt * xt * zw * zw + zt * zt * zt * zt * xw * xw + xt * xt * zt * zt * xw * xw + 2 * zt * zt * xw * xw * yt * yt - 2 * xt * xt * yw * zt * yt * zw - 2 * xt * yt * yt * yt * xw * yw - 2 * xt * xt * xt * yw * yt * xw - 2 * xt * zt * zt * xw * yt * yw - 2 * xt * zt * xw * yt * yt * zw - 2 * yw * zt * zt * zt * yt * zw + xt * xt * xt * xt * yw * yw + yw * yw * zt * zt * zt * zt + xt * xt * xt * xt * zw * zw );
737 QgsDebugMsg( QStringLiteral(
"warning, only complex solution of zg" ) );
740 zg1 = -sqrt( zgalpha1 ) * ( yt * yw * zt - yt * yt * zw + xw * zt * xt - xt * xt * zw );
741 zg2 = std::sqrt( zgalpha1 ) * ( yt * yw * zt - yt * yt * zw + xw * zt * xt - xt * xt * zw );
743 const double distance1 = std::sqrt( ( xw - xg1 ) * ( xw - xg1 ) + ( yw - yg1 ) * ( yw - yg1 ) + ( zw - zg1 ) * ( zw - zg1 ) );
744 const double distance2 = std::sqrt( ( xw - xg2 ) * ( xw - xg2 ) + ( yw - yg2 ) * ( yw - yg2 ) + ( zw - zg2 ) * ( zw - zg2 ) );
746 if ( distance1 <= distance2 )
763 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );
771 if ( test && pt1 && pt2 && pt3 )
773 const double a = ( pt1->
z() * ( pt2->
y() - pt3->
y() ) + pt2->
z() * ( pt3->
y() - pt1->
y() ) + pt3->
z() * ( pt1->
y() - pt2->
y() ) ) / ( ( pt1->
x() - pt2->
x() ) * ( pt2->
y() - pt3->
y() ) - ( pt2->
x() - pt3->
x() ) * ( pt1->
y() - pt2->
y() ) );
774 const double b = ( pt1->
z() * ( pt2->
x() - pt3->
x() ) + pt2->
z() * ( pt3->
x() - pt1->
x() ) + pt3->
z() * ( pt1->
x() - pt2->
x() ) ) / ( ( pt1->
y() - pt2->
y() ) * ( pt2->
x() - pt3->
x() ) - ( pt2->
y() - pt3->
y() ) * ( pt1->
x() - pt2->
x() ) );
775 const double c = pt1->
z() - a * pt1->
x() - b * pt1->
y();
776 const double zpredicted = test->
x() * a + test->
y() * b +
c;
777 return ( test->
z() - zpredicted );
781 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );
788 if ( p1 && p2 && p3 && p4 )
790 const Vector3D v1( p2->
x() - p1->
x(), p2->
y() - p1->
y(), 0 );
791 const Vector3D v2( p4->
x() - p3->
x(), p4->
y() - p3->
y(), 0 );
797 QgsDebugMsg( QStringLiteral(
"warning, null pointer" ) );