在golang中实现KDTREE 的 queryBallPoint方法

2024-04-16 00:12

本文主要是介绍在golang中实现KDTREE 的 queryBallPoint方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近工作中遇到用go重写kdtree的需求,上github上查了下,发现go的算法库是真心烂。star最高的kyroy/kdtree库,没有queryBallPoint方法,没办法,自己加一个

拉取源码

go get github.com/kyroy/kdtree

queryBallPoint 函数

queryBallPoint 函数的目标是查找从目标点到一定距离内的所有点。常见的用法是在圆形(在 2D 中)内搜索半径范围内的点。

talk less show me the code 下面上代码,修改 kdtree.go

// QueryBallPoint returns all points within distance r from a given point x in the KDTree.
func (t *KDTree) QueryBallPoint(x Point, r float64) []Point {var results []Pointif t.root == nil {return results}t.root.queryBallPoint(x, 0, r*r, &results)return results
}func (n *node) queryBallPoint(target Point, axis int, rSquared float64, results *[]Point) {if n == nil {return}// 计算当前节点到目标点的平方距离distSquared := 0.0for i := 0; i < target.Dimensions(); i++ {diff := n.Point.Dimension(i) - target.Dimension(i)distSquared += diff * diff}// 如果距离在半径内,则添加到结果中if distSquared <= rSquared {*results = append(*results, n.Point)}// 确定首先搜索哪个子树diff := target.Dimension(axis) - n.Point.Dimension(axis)nextAxis := (axis + 1) % target.Dimensions()// 优先搜索目标点较近的子树if diff < 0 {n.Left.queryBallPoint(target, nextAxis, rSquared, results)if diff*diff <= rSquared {n.Right.queryBallPoint(target, nextAxis, rSquared, results)}} else {n.Right.queryBallPoint(target, nextAxis, rSquared, results)if diff*diff <= rSquared {n.Left.queryBallPoint(target, nextAxis, rSquared, results)}}
}

收尾

go mod 添加

replace github.com/kyroy/kdtree => /Users/haiya/git_proj/kdtree

这篇关于在golang中实现KDTREE 的 queryBallPoint方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907313

相关文章

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@