在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

相关文章

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

IDEA中Maven Dependencies出现红色波浪线的原因及解决方法

《IDEA中MavenDependencies出现红色波浪线的原因及解决方法》在使用IntelliJIDEA开发Java项目时,尤其是基于Maven的项目,您可能会遇到MavenDependenci... 目录一、问题概述二、解决步骤2.1 检查 Maven 配置2.2 更新 Maven 项目2.3 清理本

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、