@@ -60,8 +60,8 @@ QgsPoint::QgsPoint( const QgsPointXY &p )
60
60
: QgsAbstractGeometry()
61
61
, mX( p.x() )
62
62
, mY( p.y() )
63
- , mZ( 0.0 )
64
- , mM( 0.0 )
63
+ , mZ( std::numeric_limits< double >::quiet_NaN() )
64
+ , mM( std::numeric_limits< double >::quiet_NaN() )
65
65
{
66
66
mWkbType = QgsWkbTypes::Point ;
67
67
}
@@ -70,8 +70,8 @@ QgsPoint::QgsPoint( QPointF p )
70
70
: QgsAbstractGeometry()
71
71
, mX( p.x() )
72
72
, mY( p.y() )
73
- , mZ( 0.0 )
74
- , mM( 0.0 )
73
+ , mZ( std::numeric_limits< double >::quiet_NaN() )
74
+ , mM( std::numeric_limits< double >::quiet_NaN() )
75
75
{
76
76
mWkbType = QgsWkbTypes::Point ;
77
77
}
@@ -272,7 +272,17 @@ void QgsPoint::draw( QPainter &p ) const
272
272
273
273
void QgsPoint::clear ()
274
274
{
275
- mX = mY = mZ = mM = 0 .;
275
+ mX = mY = 0 .;
276
+ if ( is3D () )
277
+ mZ = 0 .;
278
+ else
279
+ mZ = std::numeric_limits<double >::quiet_NaN ();
280
+
281
+ if ( isMeasure () )
282
+ mM = 0 .;
283
+ else
284
+ mM = std::numeric_limits<double >::quiet_NaN ();
285
+
276
286
clearCache ();
277
287
}
278
288
@@ -404,7 +414,7 @@ bool QgsPoint::dropZValue()
404
414
return false ;
405
415
406
416
mWkbType = QgsWkbTypes::dropZ ( mWkbType );
407
- mZ = 0.0 ;
417
+ mZ = std::numeric_limits< double >:: quiet_NaN () ;
408
418
clearCache ();
409
419
return true ;
410
420
}
@@ -415,7 +425,7 @@ bool QgsPoint::dropMValue()
415
425
return false ;
416
426
417
427
mWkbType = QgsWkbTypes::dropM ( mWkbType );
418
- mM = 0.0 ;
428
+ mM = std::numeric_limits< double >:: quiet_NaN () ;
419
429
clearCache ();
420
430
return true ;
421
431
}
@@ -430,17 +440,17 @@ bool QgsPoint::convertTo( QgsWkbTypes::Type type )
430
440
switch ( type )
431
441
{
432
442
case QgsWkbTypes::Point :
433
- mZ = 0.0 ;
434
- mM = 0.0 ;
443
+ mZ = std::numeric_limits< double >:: quiet_NaN () ;
444
+ mM = std::numeric_limits< double >:: quiet_NaN () ;
435
445
mWkbType = type;
436
446
return true ;
437
447
case QgsWkbTypes::PointZ:
438
448
case QgsWkbTypes::Point25D:
439
- mM = 0.0 ;
449
+ mM = std::numeric_limits< double >:: quiet_NaN () ;
440
450
mWkbType = type;
441
451
return true ;
442
452
case QgsWkbTypes::PointM:
443
- mZ = 0.0 ;
453
+ mZ = std::numeric_limits< double >:: quiet_NaN () ;
444
454
mWkbType = type;
445
455
return true ;
446
456
case QgsWkbTypes::PointZM:
@@ -481,22 +491,38 @@ double QgsPoint::distanceSquared( const QgsPoint &other ) const
481
491
482
492
double QgsPoint::distance3D ( double x, double y, double z ) const
483
493
{
484
- return sqrt ( ( mX - x ) * ( mX - x ) + ( mY - y ) * ( mY - y ) + ( mZ - z ) * ( mZ - z ) );
494
+ double zDistSquared = 0.0 ;
495
+ if ( is3D () || !qIsNaN ( z ) )
496
+ zDistSquared = ( mZ - z ) * ( mZ - z );
497
+
498
+ return sqrt ( ( mX - x ) * ( mX - x ) + ( mY - y ) * ( mY - y ) + zDistSquared );
485
499
}
486
500
487
501
double QgsPoint::distance3D ( const QgsPoint &other ) const
488
502
{
489
- return sqrt ( ( mX - other.x () ) * ( mX - other.x () ) + ( mY - other.y () ) * ( mY - other.y () ) + ( mZ - other.z () ) * ( mZ - other.z () ) );
503
+ double zDistSquared = 0.0 ;
504
+ if ( is3D () || other.is3D () )
505
+ zDistSquared = ( mZ - other.z () ) * ( mZ - other.z () );
506
+
507
+ return sqrt ( ( mX - other.x () ) * ( mX - other.x () ) + ( mY - other.y () ) * ( mY - other.y () ) + zDistSquared );
490
508
}
491
509
492
510
double QgsPoint::distanceSquared3D ( double x, double y, double z ) const
493
511
{
494
- return ( mX - x ) * ( mX - x ) + ( mY - y ) * ( mY - y ) + ( mZ - z ) * ( mZ - z );
512
+ double zDistSquared = 0.0 ;
513
+ if ( is3D () || !qIsNaN ( z ) )
514
+ zDistSquared = ( mZ - z ) * ( mZ - z );
515
+
516
+ return ( mX - x ) * ( mX - x ) + ( mY - y ) * ( mY - y ) + zDistSquared;
495
517
}
496
518
497
519
double QgsPoint::distanceSquared3D ( const QgsPoint &other ) const
498
520
{
499
- return ( mX - other.x () ) * ( mX - other.x () ) + ( mY - other.y () ) * ( mY - other.y () ) + ( mZ - other.z () ) * ( mZ - other.z () );
521
+ double zDistSquared = 0.0 ;
522
+ if ( is3D () || other.is3D () )
523
+ zDistSquared = ( mZ - other.z () ) * ( mZ - other.z () );
524
+
525
+ return ( mX - other.x () ) * ( mX - other.x () ) + ( mY - other.y () ) * ( mY - other.y () ) + zDistSquared;
500
526
}
501
527
502
528
double QgsPoint::azimuth ( const QgsPoint &other ) const
@@ -520,8 +546,6 @@ double QgsPoint::inclination( const QgsPoint &other ) const
520
546
521
547
QgsPoint QgsPoint::project ( double distance, double azimuth, double inclination ) const
522
548
{
523
- QgsWkbTypes::Type pType ( QgsWkbTypes::Point );
524
-
525
549
double radsXy = azimuth * M_PI / 180.0 ;
526
550
double dx = 0.0 , dy = 0.0 , dz = 0.0 ;
527
551
@@ -534,18 +558,11 @@ QgsPoint QgsPoint::project( double distance, double azimuth, double inclination
534
558
}
535
559
else
536
560
{
537
- pType = QgsWkbTypes::addZ ( pType );
538
561
double radsZ = inclination * M_PI / 180.0 ;
539
562
dx = distance * sin ( radsZ ) * sin ( radsXy );
540
563
dy = distance * sin ( radsZ ) * cos ( radsXy );
541
564
dz = distance * cos ( radsZ );
542
565
}
543
566
544
- if ( isMeasure () )
545
- {
546
- pType = QgsWkbTypes::addM ( pType );
547
- }
548
-
549
- double z = qIsNaN ( mZ ) ? 0 : mZ ;
550
- return QgsPoint ( mX + dx, mY + dy, z + dz, mM , pType );
567
+ return QgsPoint ( mX + dx, mY + dy, mZ + dz, mM , mWkbType );
551
568
}
0 commit comments