From d08af1a2857eb653dbe201fa60409c4ec3337bac Mon Sep 17 00:00:00 2001 From: const-ae Date: Mon, 15 Jun 2020 16:34:06 +0200 Subject: [PATCH 1/3] Calculate density if either x or y are infinite --- src/count_neighbors.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/count_neighbors.c b/src/count_neighbors.c index c32bd3f..f3d8d7e 100644 --- a/src/count_neighbors.c +++ b/src/count_neighbors.c @@ -25,8 +25,15 @@ SEXP count_neighbors_( SEXP x, SEXP y, SEXP r2, SEXP xy ) { for( int j = 0; j < l; j++ ) { double dx = xi - xp[j]; double dy = yi - yp[j]; - if( yxp*dx*dx + xyp*dy*dy <= r2p ) - s++; + if(R_FINITE(dx) && R_FINITE(dy)){ + if( yxp*dx*dx + xyp*dy*dy <= r2p ) + s++; + }else{ + if((! R_FINITE(dx) && xyp * dy * dy < r2p) || + (! R_FINITE(dy) && xyp * dx * dx < r2p) ){ + s++; + } + } } resp[i] = s; } From a202ac73d1e18facb57acab8ea0a9b00680518d4 Mon Sep 17 00:00:00 2001 From: const-ae Date: Mon, 15 Jun 2020 16:36:57 +0200 Subject: [PATCH 2/3] Fix bug in method = "kde2e" if x or y are infinite --- R/geom_pointdensity.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/geom_pointdensity.R b/R/geom_pointdensity.R index de2d7ac..4a0ae65 100644 --- a/R/geom_pointdensity.R +++ b/R/geom_pointdensity.R @@ -138,8 +138,8 @@ StatPointdensity <- ggproto("StatPointdensity", Stat, ix <- findInterval(data$x, dens$x) iy <- findInterval(data$y, dens$y) ii <- cbind(ix, iy) - data$density <- dens$z[ii] - + data$density[finites] <- dens$z[ii] + data$density[!finites] <- min(dens$z) } else { if (is.character(method)) { From 6010a81dc7d15345d5ec7240ade9292e0262bcd5 Mon Sep 17 00:00:00 2001 From: const-ae Date: Mon, 15 Jun 2020 20:58:27 +0200 Subject: [PATCH 3/3] Fix bug I introduced in count_neighbors() --- src/count_neighbors.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/count_neighbors.c b/src/count_neighbors.c index f3d8d7e..abe90b3 100644 --- a/src/count_neighbors.c +++ b/src/count_neighbors.c @@ -22,18 +22,18 @@ SEXP count_neighbors_( SEXP x, SEXP y, SEXP r2, SEXP xy ) { int s = 0; double xi = xp[i]; double yi = yp[i]; - for( int j = 0; j < l; j++ ) { - double dx = xi - xp[j]; - double dy = yi - yp[j]; - if(R_FINITE(dx) && R_FINITE(dy)){ - if( yxp*dx*dx + xyp*dy*dy <= r2p ) - s++; - }else{ - if((! R_FINITE(dx) && xyp * dy * dy < r2p) || - (! R_FINITE(dy) && xyp * dx * dx < r2p) ){ - s++; - } + for( int j = 0; j < l; j++ ) {\ + double xj = xp[j]; + double yj = yp[j]; + double dx = xi - xj; + double dy = yi - yj; + if((xi == xj && yi == yj) || + (xi == xj && xyp * dy * dy <= r2p) || + (yi == yj && xyp * dx * dx <= r2p) || + (yxp*dx*dx + xyp*dy*dy <= r2p) ){ + s++; } + } resp[i] = s; }