我想知道处理大量移动物体(球体,三角形,盒子,点等)的最佳数据结构是什么?我正在尝试回答两个问题,即最近邻和Collsion检测.
我确实意识到传统上,像R树这样的数据结构用于最近邻居查询,而Oct/Kd/BSP用于处理静态对象或极少数移动对象的碰撞检测问题.
我只是希望那里有更好的东西.
我感谢所有的帮助.
geometry collision-detection spatial neighbours data-structures
我正在尝试确定一种存储一组对象的快速方法,每个对象都有一个x和y坐标值,这样我就可以快速检索某个矩形或圆形内的所有对象.对于小型对象集(~100),简单地将它们存储在列表中并通过它迭代的简单方法相对较快.然而,对于更大的群体来说,预计会很慢.我已经尝试将它们存储在一对TreeMaps中,一个在x坐标上排序,一个在y坐标上排序,使用以下代码:
xSubset = objectsByX.subSet( minX, maxX );
ySubset = objectsByY.subSet( minY, maxY );
result.addAll( xSubset );
result.retainAll( ySubset );
Run Code Online (Sandbox Code Playgroud)
这也有效,并且对于较大的对象集更快,但仍然比我想要的慢.部分问题还在于这些对象四处移动,需要插回到此存储中,这意味着将它们从树中删除并重新添加到树/列表中.我不禁想到那里必须有更好的解决方案.我在Java中实现这个,如果它有任何区别,虽然我希望任何解决方案都会以有用的模式/算法的形式出现.
很抱歉没有包含我的问题的任何示例数据.我找不到轻松生成示例形状文件的方法.希望有经验的用户ggplot可以从下面的描述中看到我想做的事情.
我有:
一个data.frameX与约样地信息(plotid,var1,var2,var3,var4,...)
Y具有样本图的空间信息的多边形shapefile
导入shapefile Y(with maptools)和fortifying as data.frame Z(ggplot2)可以正常工作.melt荷兰国际集团X以X_melted作品同样精致.merge-ing Z并X_melted以mapdf作品为好.
这意味着,现在我们有一个data.frame长形式的空间信息和var1,var2,var3,...
现在我想绘制这样的数据框:
pl1 <- ggplot(mapdf,aes(long,lat),group=group)
pl1 <- pl1 + geom_polygon(aes(group=group,fill=value),colour="black")
pl1 <- pl1 + facet_grid(variable ~ .)
pl1 <- pl1 + coord_equal(ratio = 1)
pl1
Run Code Online (Sandbox Code Playgroud)
结果是一个很好的情节,每个变量有一个面板.面板的地图是相同的,但填充颜色随变量的值而变化.到目前为止,一切都像魅力......有一个问题: …
这是一个基本问题,但不幸的是我在其他地方找不到相关的命令.
有没有办法可以将空间点数据帧转换为R中的普通数据帧.
例如,如果普通数据帧是dfLat,Lon作为位置坐标,我可以获得空间df,如下所示:
coordinates (df)= ~Lat + Lon
Run Code Online (Sandbox Code Playgroud)
如何反转或甚至可能?
目前我正在使用build in function dist来计算我在R中的距离矩阵.
dist(featureVector,method="manhattan")
Run Code Online (Sandbox Code Playgroud)
这是目前应用程序的瓶颈,因此我们的想法是平衡这项任务(概念上这应该是可能的)
搜索谷歌和这个论坛没有成功.
有人有想法吗?
从一开始,碰撞检测感觉就像是O(n ^ 2)问题.
你有一堆对象,你需要检查每个对象是否与任何其他对象发生碰撞.但是,我知道将每个对象与所有其他对象进行对比检查是非常无效的.为什么两个球之间的相对昂贵的碰撞检查,如果它们彼此不相近?
这是我正在处理的简单程序的示例:

如果你有1000个球,那么如果你进行了天真的碰撞检测,你将获得1000 ^ 2次收集检查(一百万)!这种冲突检查很快成为我的应用程序的瓶颈.我需要实施一些广泛的阶段修剪.
在处理2d - 圆形物体时,应该使用哪些技术来修剪碰撞检查?我已经阅读过关于QuadTrees,BSP,空间散列等的内容,但很难理解哪种方法最适合这个用例.
有没有人知道什么可能最好?
我需要删除R包"raster"中图形周围的框框,但我无法弄清楚应该更改哪个参数.示例如下:
library(raster)
r <- raster(nrows=10, ncols=10)
r <- setValues(r, 1:ncell(r))
plot(r)
plot(r,axes=F)
Run Code Online (Sandbox Code Playgroud) 我目前正在努力解决由其Microsoft.SqlServer.Types及其相关的非托管库引起的部署问题,SqlServerSpatial110.dll这两者都适用于Microsoft SQL Server 2012.问题很容易解决,只是典型的DLL缺失问题,但我试图决定处理这些依赖关系的完美方法.
首先,我必须声明我不同意手动部署任一库(通常通过将它们复制到项目的输出目录中,或者可疑地将其复制到System32自身中)的流行观点是正确的.Microsoft为这些文件提供可再发行的MSI安装程序,这些安装程序将这些文件放入系统位置.很明显,他们希望我们依赖于单独安装的可再发行组件,或者作为MSI本身内置的经过试验和测试的依赖机制的一部分.
在发布时,可以从以下网址下载这些可再发行组件的最新版本:http://www.microsoft.com/en-gb/download/details.aspx?id = 43339
因为SqlServerSpatial110.dll,似乎没有任何问题.MSI安装程序(特定于平台)将文件放入任一Windows\System32或Windows\SysWOW64适当的一切,一切都很好.
托管包装器库Microsoft.SqlServer.Types.dll更令人困惑.
在我看来,该文件被放入全局程序集缓存 - 运行MSI后,在我的机器上,我可以看到它位于,C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll该文件具有正确的版本和修改日期.
奇怪的是,我无法在Visual Studio的参考浏览器或Windows资源管理器中直接看到它 - 只有我在Mysicsoft的老式文件系统搜索工具中才能看到它.为什么我看不到它?
由于该文件几乎在GAC中,我猜测引用它的项目不应该制作它的本地副本 - 它们应该依赖它在目标系统上.我测试了这个假设并且它有效:
Microsoft.SqlServer.Types.dll从其位置手动复制C:\Windows\assembly\GAC_MSILCopy Local设置为FalseMicrosoft.SqlServer.Types.dll输出中绝对不存在.因此,如果可以在运行时从GAC解析程序集以满足此依赖性,那么为什么在添加引用时它不会显示在引用浏览器中?为什么我必须将其从GAC中复制出来并参考副本?
在我看来,理想的工作流程是这样的:
Microsoft.SqlServer.Types使用参考浏览器就像任何框架库从GAC.(默认Copy Local设置为False.) …我想将Voronoi多边形与地图结合起来,以便稍后用于空间分析.我有多个点和shapefile,我想要组合,然后保存为shapefile /空间多边形.要获得voronoi多边形,我使用本主题中的函数.
我的代码如下:
coords<-data.frame(LONG=c(16.9252,16.9363,16.9408,16.8720,16.9167,16.9461,16.9093,16.9457,16.9171,16.8506,16.9471,16.8723,16.9444,16.9212,16.8809,16.9191,16.8968,16.8719,16.9669,16.8845),
LAT=c(52.4064,52.4266,52.3836,52.3959,52.4496,52.3924,52.4012,52.3924,52.3777,52.4368,52.4574,52.3945,52.4572,52.3962,52.3816,52.3809,52.3956,52.3761,52.4236,52.4539))
Run Code Online (Sandbox Code Playgroud)
我的地图位于:https://docs.google.com/file/d/0B-ZJyVlQBsqlSURiN284dF9YNUk/edit
library(rgdal)
voronoipolygons <- function(x) {
require(deldir)
if (.hasSlot(x, 'coords')) {
crds <- x@coords
} else crds <- x
z <- deldir(crds[,1], crds[,2])
w <- tile.list(z)
polys <- vector(mode='list', length=length(w))
require(sp)
for (i in seq(along=polys)) {
pcrds <- cbind(w[[i]]$x, w[[i]]$y)
pcrds <- rbind(pcrds, pcrds[1,])
polys[[i]] <- Polygons(list(Polygon(pcrds)), ID=as.character(i))
}
SP <- SpatialPolygons(polys)
voronoi <- SpatialPolygonsDataFrame(SP, data=data.frame(x=crds[,1],
y=crds[,2], row.names=sapply(slot(SP, 'polygons'),
function(x) slot(x, 'ID'))))
}
Run Code Online (Sandbox Code Playgroud)
我的代码来获取voronoipolygons:
pzn.coords<-voronoipolygons(coords)
plot(pznall)
plot(pzn.coords,add=T)
points(coords$LONG,coords$LAT)
Run Code Online (Sandbox Code Playgroud)
结果:

我想把我的地图中的这个voronoi多边形作为新的空间多边形. …
Package sp为不同的空间概念(点,线,多边形)提供了许多类.对于某些类,访问要素坐标很简单,例如SpatialLines.所有示例均来自各个类帮助页面.
l1 = cbind(c(1,2,3),c(3,2,2))
l1a = cbind(l1[,1]+.05,l1[,2]+.05)
l2 = cbind(c(1,2,3),c(1,1.5,1))
Sl1 = Line(l1)
Sl1a = Line(l1a)
Sl2 = Line(l2)
S1 = Lines(list(Sl1, Sl1a), ID="a")
S2 = Lines(list(Sl2), ID="b")
Sl = SpatialLines(list(S1,S2))
coordinates(Sl)
# [prints a list of two with corresponding segments]
Run Code Online (Sandbox Code Playgroud)
对于SpatialPolygons,coordinates()返回多边形中心,如下所示.
Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))
Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5)))
Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE)
Srs1 = Polygons(list(Sr1), "s1")
Srs2 = Polygons(list(Sr2), "s2")
Srs3 = Polygons(list(Sr3, Sr4), "s3/4")
SpP = …Run Code Online (Sandbox Code Playgroud)