r - 离线正交范围计数实现

标签 r computational-geometry

我正在研究的一个统计问题似乎需要做一些在计算几何中称为“离线正交范围计数”的事情:

假设我有一组 n 个点(目前,在平面上)。对于每对点 i 和 j,我想计算矩形中剩余点的数量,该矩形的对角线是具有端点 i 和 j 的线段。总输出则是一个包含 n(n-1) 个值的向量,每个值都在 [0, 1, 2, ... , n-2] 中。

我已经看到关于该问题(或至少是一个非常相似的问题)的丰富文献存在,但我找不到实现。我更喜欢 R(一种统计计算语言)包,但我想这要求太多了。开源 C/C++ 实现也将起作用。

谢谢。

最佳答案

我希望我能理解你的问题。这里使用包 geometry 在 R 中实现.我用 mesh.drectangle计算从点 p 到矩形边界的有符号距离的函数。

  • 我使用 combn 创建所有点的组合
  • 对于组合的每个点 p,我计算从矩形 rect_p 到其他点的距离
  • 如果距离 < 0 我选择点。

  • 例如
    library(geometry)
    ## I generate some data 
    set.seed(1234)
    p.x <- sample(1:100,size=30,replace=T)
    p.y <- sample(1:100,size=30,replace=T)
    points <- cbind(p.x,p.y)
    
    ## the  algortithm
    ll <- combn(1:nrow(points),2,function(x){
         x1<- p.x[x[1]]; y1 <- p.y[x[1]]
         x2<- p.x[x[2]]; y2 <- p.y[x[2]]
         p <- points[-x,]
         d <- mesh.drectangle(p,x1,y1,x2,y2)
         res <- NA
         if(length(which(d <0))){
            points.in = as.data.frame(p,ncol=2)[ d < 0 , ]
           res <- list(n = nrow(points.in), 
                        rect = list(x1=x1,x2=x2,y1=y1,y2=y2),
                        points.in = points.in)
         }
         res
    },simplify=F)
    ll <- ll[!is.na(ll)]
    
    ## the result
    nn <- do.call(rbind,lapply(ll,'[[','n'))
    

    为了可视化结果,我绘制了例如具有 5 个点的矩形。

    enter image description here
    library(grid)
    grid.newpage()
    vp <- plotViewport(xscale = extendrange(p.x),
                              yscale = extendrange(p.y))
    pushViewport(vp)
    grid.xaxis()   
    grid.yaxis()
    grid.points(x=points[,'p.x'],y=points[,'p.y'],pch='*')
    cols <- rainbow(length(ll))
    ll <- ll[nn == 5]           ## here I plot only the rectangle with 5 points 
    lapply(seq_along(ll),function(i){
                x <- ll[[i]]
                col <- sample(cols,1)
                x1<- x$rect$x1; x2<- x$rect$x2
                y1<- x$rect$y1; y2<- x$rect$y2
                grid.rect(x=(x1+x2)*.5,y=(y1+y2)*.5,
                          width= x2-x1,height = y2-y1,
                          default.units ='native',
                          gp=gpar(fill=col,col='red',alpha=0.2)
                          )
                grid.points(x=x$points.in$p.x,y=x$points.in$p.y,pch=19,
                            gp=gpar(col=rep(col,x$n))) 
    
     }
    )
    upViewport()
    

    关于r - 离线正交范围计数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14801195/

    相关文章:

    r - 在带有对数刻度的 ggplot2 条形图中显示值 1

    r - 使字符串统一 -- "AB-CD"=== "CD-AB"

    python - 重叠矩形的总面积

    c++ - 如何在范围树中搜索?

    凸多边形的最大和最小对角线算法?

    r - 将列表文件取消列出到多个数据帧

    r - 如何更新 Shiny 的 fileInput 对象?

    r - Lyx 调用 Rscript 时出错

    java - 确定线段和圆弧的所有组合之间的交点

    3d - 在 3D 形状上创建样本点