四叉树最近邻算法

2023-11-26

我已经实现了 n 个点的四叉树结构以及返回给定矩形内的点数组的方法。我似乎无法找到一种算法来有效地找到最接近另一个给定点的点。我错过了一些明显的事情吗?我认为递归解决方案是正确的方法吗?

我正在使用 Objective C,但伪代码就可以了。此外,我实际上存储了经纬度数据,并且点之间的距离沿着一个大圆。

EDIT:这是我的树插入和细分代码

- (BOOL)insert:(id<PASQuadTreeDataPoint>)dataPoint {

    BOOL pointAdded = false;

    // If the point lies within the region
    if(CGRectContainsPoint(self.region, dataPoint.point)) {

        // If there are less than 4 points then add this point
        if(self.dataPoints.count < kMaxPointsPerNode) {
            [self.dataPoints addObject:dataPoint];
            pointAdded = true;
        }
        else {

            // Subdivide into 4 quadrants if not already subdivided
            if(northEast == nil) [self subdivide];

            // Attempt to add the point to one of the 4 subdivided quadrants
            if([northEast insert:dataPoint]) return true;
            if([southEast insert:dataPoint]) return true;
            if([southWest insert:dataPoint]) return true;
            if([northWest insert:dataPoint]) return true;
        }
    }

    return pointAdded;
}

- (void)subdivide {

    // Compute the half width and the origin
    CGFloat width = self.region.size.width * 0.5f;
    CGFloat height = self.region.size.height * 0.5f;
    CGFloat x = self.region.origin.x;
    CGFloat y = self.region.origin.y;

    // Create a new child quadtree with the region divided into quarters
    self.northEast = [PASQuadTree quadTreeWithRegion:CGRectMake(x + width, y, width, height)];
    self.southEast = [PASQuadTree quadTreeWithRegion:CGRectMake(x + width, y + height, width, height)];
    self.southWest = [PASQuadTree quadTreeWithRegion:CGRectMake(x, y + height, width, height)];
    self.northWest = [PASQuadTree quadTreeWithRegion:CGRectMake(x, y, width, height)];
}

EDIT:编写此代码来查找包含该点的最小节点(叶):

-(PASQuadTree *)nodeThatWouldContainPoint:(CGPoint)point {

    PASQuadTree *node = nil;

    // If the point is within the region
    if (CGRectContainsPoint(self.region, point)) {

        // Set the node to this node
        node = self;

        // If the node has children
        if (self.northEast != nil) {

            // Recursively check each child to see if it would contain the point
            PASQuadTree *childNode = [self.northEast nodeThatWouldContainPoint:point];
            if (!childNode) childNode = [self.southEast nodeThatWouldContainPoint:point];
            if (!childNode) childNode = [self.southWest nodeThatWouldContainPoint:point];
            if (!childNode) childNode = [self.northWest nodeThatWouldContainPoint:point];
            if (childNode) node = childNode;
        }
    }

    return node;
}

更近了,但没有雪茄!


找到最小的正方形,其中搜索点位于中心,而另一个点正好位于该矩形内(您需要进行 logn 次搜索)。

设 x 为到另一点的距离。

然后找到边长为 2x 并以第一个点为中心的正方形内的所有点。对于该正方形内的每个点,计算距搜索点的距离并找到最近的点。

更新:如何找到一个以搜索点为中心且恰好包含另一个点的正方形?

找到一个随机点。设到该随机点的距离为 x。查找以搜索点为中心、大小为 x 的正方形内的所有点。如果该方格内的点数非零,则随机选择一个点并重复。如果没有点,请将搜索方块大小增加到 (2-0.5)*x(在下一步中为 (2-0.25)*x,依此类推。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

四叉树最近邻算法 的相关文章

  • 让电脑实现360度=0度,旋转炮塔

    我正在制作一个游戏 其中有一个计算机控制的炮塔 炮塔可360度旋转 它使用 trig 找出枪瞄准所需的角度 obj deg 并将枪的当前角度存储在 gun deg 下面的代码以设定的速度旋转枪 if objdeg gt gundeg gun
  • 广度优先搜索:检查访问状态的时机

    在有向图的广度优先搜索中 可能循环 当一个节点出队时 其所有尚未访问的子节点都会入队 并且该过程将继续 直到队列为空 有一次 我以相反的方式实现它 将节点的所有子节点排队 并在节点出队时检查访问状态 如果正在出队的节点之前已被访问过 则该节
  • 插入排序 - 如何接受输入并打印排序后的数组

    我试图做一个插入排序程序 它接受任何数据类型 Int Double String 然后打印排序后的数组 我知道我的代码可以工作 但我无法找出真正的问题 import java util public class MyInsertionSor
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • 竞争性编码 - 以最低成本清除所有级别:未通过所有测试用例

    当我遇到这个问题时 我正在一个竞争性编码网站上解决问题 问题指出 游戏中有 N 个关卡和 M 种可用武器 等级编号从 0 到 N 1 武器编号从 0 到 M 1 您可以按任意顺序清除这些级别 在每个关卡中 需要这些 M 武器的某些子集才能通
  • 地形/山地算法未按预期工作

    我想使用一个非常基本的原理创建一个上面有山的地形 如以下高度图所示 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 2 1 0 0 0
  • 后台地理围栏 Windows Phone 8.1 (WinRT)

    Issue 我试图在 WP8 1 WinRT 中发生地理围栏事件 进入 退出 时触发后台任务 我已经编写了一个示例应用程序来尝试让它工作 但似乎无法做到这一点 到目前为止 我已采取以下步骤来尝试让地理围栏在后台运行 检查位置功能 创建 注册
  • 智能位置表单字段

    我的用户注册表单上有一个文本字段location 我本质上希望这个字段能够根据 Google 地图 或同等地图 进行验证 只允许有效位置通过 最好采用类似的格式滑铁卢 伦敦 or 伦敦 英国 要求 除了位置名称之外 我还想返回该位置中心的坐
  • 在c#中遍历对象树

    我有一棵由多个对象组成的树 其中每个对象都有一个名称 string id int 以及可能是同一类型的子数组 如何遍历整个树并打印出所有 id 和名称 我是编程新手 坦率地说 我很难理解这个问题 因为我不知道有多少个级别 现在我正在使用fo
  • Cordova 地理定位不适用于 Android

    我想在 Android 上使用地理定位 我用 Apache Cordova 编写应用程序 地理定位在 android 电脑模拟器和 android 手机上均不起作用 I try http cordova apache org docs en
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 循环中的递归算法复杂度(运行时间)

    我想了解您对如何检测以下递归算法的 T n 运行时间 的意见 Charm 是一种用于发现事务数据库中频繁闭项集的算法 频繁闭项集列表是在一组交易 tids 中多次出现的频繁项 例如面包和牛奶是经常一起购买的物品 它们是通过将索引为 i 的当
  • 缓存感知树的实现

    I have a tree where every node may have 0 to N children 用例是以下查询 给定指向两个节点的指针 这些节点是否位于树的同一分支内 Examples q 2 7 gt true q 5 4
  • 如何找到给定顶点的所有多边形?

    我有一个顶点列表 并且我知道它们之间的连接 我试图找到顶点的所有多边形形状 这些多边形形状不应重叠 我做了一些研究 我认为如果我可以顺时针 或逆时针 没有区别 遍历顶点 我可以检测多边形形状 因此 我寻找顺时针遍历顶点的解决方案 我发现了一
  • 变量的多个值介于 0 和数字序言之间

    所以我一直在尝试自学序言 我认为我进展顺利 然而 我有点坚持我正在尝试的这一种方法 toN N A A 等于 0 到 N 1 之间的整数值 按升序生成 所以 toN 5 A 将是 A 0 A 1 A 2 A 3 A 4 我对序言还很陌生 所
  • 通过保留和复制来复制向量,还是通过创建和交换来复制向量更有效? [复制]

    这个问题在这里已经有答案了 我正在尝试有效地复制向量 我看到两种可能的方法 std vector
  • 图中使用 K 个反向边的所有最短路径

    假设我有一个有向图 G V E 其边的权重为正整数 我需要做的是使用最多 K 整数 个反向边找到所有顶点之间的最短路径 我的意思是 如果我们在边 u 处 并且只有一条从 v 到 u 的有向边 只要我们没有在这条路径上使用 K 个反向边 我们
  • 归并排序究竟进行了多少次比较?

    我读到 在实践中 快速排序比合并排序快得多 其原因是隐藏常量 那么 随机快速排序复杂度的解是2nlnn 1 39nlogn 这意味着快速排序中的常数是1 39 但是合并排序呢 归并排序中的常数是什么 让我们看看能否解决这个问题 在合并排序中
  • 如何测试哈希函数?

    有没有办法测试哈希函数的质量 我希望在哈希表中使用时具有良好的分布 如果这可以在单元测试中验证 那就太好了 EDIT 为了澄清 我的问题是我已经使用了longJava 中的值的方式是第一个 32 位编码一个 ID 第二个 32 位编码另一个
  • Haskell:先进先出队列算法的复杂性

    这是我对 FIFO 队列的尝试 type Queue a a gt a empty Queue a empty id remove Int gt Queue a gt a Queue a remove n queue take n queu

随机推荐

  • 返回一行中正则表达式搜索的第二个实例

    我有一个文件 其中包含特定的感兴趣行 例如第 12 行 如下所示 conform 244216 packets exceed 267093 packets 我编写了一个脚本来通过正则表达式提取第一个数字并将该值转储到新文件中 getexce
  • 如何使用 Phonegap 打开 Twitter 和 Facebook 应用程序?

    我正在尝试使用我的 PhoneGap 应用程序链接来打开 Twitter 应用程序中的特定用户个人资料页面 我知道并不是每个人的设备上都安装了 Twitter 应用程序 所以如果他们没有安装 我想将他们发送到 Play 商店下载 问题是 每
  • Python 字典中键的多个值

    我想做的是将键中的 3 个值获取到单独的变量中 目前我正在这样做 for key in names posX names key 0 posY names key 1 posZ names key 2 尽管它有效 但对我来说似乎不太直观 我
  • Rapidjson 提取键和值

    我试图提取数组中对象的键和值 但找不到正确的 getter for Value ConstValueIterator itr document params Begin itr document params End itr for Val
  • 我应该考虑 memmove() O(n) 还是 O(1)?

    这可能是一个愚蠢的问题 但我想计算我的一种算法的复杂性 并且我不确定要考虑什么复杂性内存移动 功能 你能帮忙 解释一下吗 void memmove void destination const void source size t num
  • Angular:如何使链接跳转到同一页面中的某些部分

    我想要一个锚链接使用 id 标签跳转到同一页面中的特定部分 这是我的html div class nav container ul class nav text center li class active a href account s
  • JDK8中ConcurrentHashmap代码解释

    我一直在尝试理解 JDK8 中的 ConcurrentHashMap 函数 与 JDK7 中的函数相反 除了源代码之外 还可以找到一些好人 例如 Richard 对其进行了很好的解释http www burnison ca articles
  • WPF Datagrid 对包含 null 元素的列进行排序

    我有一个 WPF 数据网格 正在使用多个列 其中一列的一些元素有时为空 当我尝试对此列进行排序时 这会导致异常 列的定义类似于
  • 检查的保护参数包是否会导致程序格式错误?

    我不止一次 甚至在 SO 上 看到过这样的代码 template
  • 将图像转换为字符串(用于 Symfony2 Response)

    我正在 Symfony2 中构建一个用于调整图像大小的脚本 因为我希望能够使用标准 Symfony2 响应系统 headers array Content Type gt image png Content Disposition gt i
  • 在 C# 中保持 http 连接处于活动状态?

    如何在 C 中保持连接处于活动状态 我做得不对 我是否应该创建一个 HttpWebRequest 对象并使用它来访问我需要的任何 URL 除了 HttpWebRequest Create 静态方法之外 我没有看到访问 url 的方法 如何创
  • 使用 TypeScript,我可以输入 getProperty 的柯里化版本吗

    示例来自https www typescriptlang org docs handbook advanced types html function getProperty
  • 如何在具有 MySql 后端的 Django 中为 TextField 指定索引?

    我在 Django 中定义了一个模型 它 部分 看起来像这样 class Info models Model information models TextField max length 32 null True db index Tru
  • 使行号不可复制

    我正在努力添加行号支持Rainbow 一个语法荧光笔 但我不知道如何使行号不可复制 禁用选择通过user select none 使一个元素无法突出显示 但您仍然可以通过突出显示它周围的文本然后复制来复制其文本 这最终会复制行号和代码 这是
  • 什么是 WCF 代理以及它们有什么用处?

    我最近一直在自学 WCF 甚至使用 WCF 编写了一些生产服务 但直到最近我才真正深入了解 WCF 我知道 代理 设计模式的想法 我还知道 ASMX Web 服务中代理的使用 但我很难理解 WCF 代理是什么以及它是如何使用的 我已经彻底阅
  • 在同一页面上绘制多个ggplot2

    我有一个工作循环 它可以生成并保存目录中保存的每个文件的单独绘图 我想将所有返回的图绘制在单个文件中作为多个页面上的 2x2 网格 但无法做到这一点 我尝试将绘图对象保存在列表中 pltList lt list pltList for f
  • 在不同的配置中引用不同的程序集

    在提问之前 我阅读了this and this线程 那里没有帮助 我正在使用 Visual Studio 2003 这是我的雇主强制要求的 但我想 VS 更高版本的答案也可能有用 因此 假设我有两个 Net 项目 A 这是一个类库 B 这是
  • CXF RESTful 客户端 - 如何信任所有证书?

    我写过 Jersey RESTful 客户端 它使用了DumbX509TrustManager 和 HostnameVerifier 信任我们实验室系统上的所有 SSL 证书 以便更轻松地处理自签名证书 ClientConfig confi
  • 如何在 Safari 和 NSTextView 等 Web 视图中突出显示搜索结果 showFindIndicatorForRange:

    在 Safari 和 OSX 上的 NSTextView 中 搜索结果可以用带有一点动画弹出的亮黄色框突出显示 有没有什么方法可以在网络视图中做到这一点 而无需自己编码 我确实找到了一种方法来做到这一点 See 显示范围查找指示器
  • 四叉树最近邻算法

    我已经实现了 n 个点的四叉树结构以及返回给定矩形内的点数组的方法 我似乎无法找到一种算法来有效地找到最接近另一个给定点的点 我错过了一些明显的事情吗 我认为递归解决方案是正确的方法吗 我正在使用 Objective C 但伪代码就可以了