在UE4里实现四叉树查找最近点

本文介绍了如何在UE4中利用四叉树实现高效查找最近点的方法,通过构建四叉树对大量点进行分层管理,降低查找复杂度。同时,文章提及杭州折跃科技有限公司的UE4相关岗位招聘信息,薪资待遇优厚,欢迎感兴趣的人才加入。
摘要由CSDN通过智能技术生成

*在UE4里实现四叉树查找最近点

分享前先发个招聘信息,哈哈~
不知大家是否对可视化软件开发感兴趣?我们团队目前有个可视化设计软件,类似twinmotion,已经开发了5年多,技术沉淀还是不错的,软件呈现的效果也很棒。公司很注重UE4的技术,今年也有扩招和培养人才的计划,地址在杭州市西湖区,欢迎有兴趣的小伙伴加我微信15958129977,或把简历发到邮箱754101613@qq.com,我们一起完善产品,一起提升技术~
公司名称:杭州折跃科技有限公司
产品:作一家(可视化设计软件)
岗位职责:
1.基于UE4引擎的家装软件业务逻辑开发;
2.为UE4引擎开发C++功能插件;
3.使用slate开发UI系统;
4.使用C++开发软件周边配套程序。
薪资待遇:15-30K(不设上限,优秀的薪资可谈)
公司地址:杭州市西湖区

接下去是技术分享:
如果问如何计算1个点与10个点中最近的点,可能只需要计算10次,比较9次便能得到答案。但若要以这样的方式计算1万,10万,甚至1千万个点中相邻的点,可能就需要计算几万次。这样计算的效率肯定是不可取的,所以就有了各式各样查找最近点的算法,四叉树查找就是一种简单易懂的查找方式。

日常生活中,如果我们要描述自己所处的位置,会用某国家某省某县市某街道级级细化,最简单的例子便是寄快递时填写地址。这样便能在整个地球中定义你的位置,那我们是否能用这种方式来定义上面提到的1千万个点,给所有点划分到各个"街道"。只要找到点所在"街道",离找到这个点也就不远了。

简单步骤如下:
1.依据点数据构建四叉树
1.1 创建根节点,每个节点能存一定数量的Point(带坐标信息的点)
1.2 不断从根节点插入被查找点
1.3 若没有子节点,且Point数量超出限制,则新建4个子节点(上下左右),并将该节点所有Point按象限移入子节点
1.4 重复此操作
2.查找
2.1 传入需要查找的点坐标,查找一定范围内的所有点
2.2 从根节点开始搜索,若有子节点,继续搜索符合要求的子节点,没有子节点的将该节点Point数据收集
2.3 将所有收集到的Point排序输出

FindNearPoint.h


// Fill out your copyright notice in the Description page of Project Settings.
 
#pragma once
 
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "FindNearPoint.generated.h"
 
#define CHILD_NUM 4
/**
 * 
 */
 //点信息
USTRUCT(BlueprintType)
struct FFindNear_Point
{
   
	GENERATED_USTRUCT_BODY()
		FFindNear_Point() {
   }
public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		FString Guid;
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		FVector2D Point;
};
 
//树节点信息
struct QuadTreeNode
{
   
	QuadTreeNode() {
   }
public:
		FBox2D rect;
		TArray<FFindNear_Point> pos_array;
		int child_num; 
		QuadTreeNode *child[CHILD_NUM];
		int depth;
};
 
UCLASS(BlueprintType)
class INTERACTIONPLUGIN_API UFindNearPoint : public UObject
{
   
	GENERATED_BODY()
public:
		UFindNearPoint();
		~UFindNearPoint();
private:
		//创建子(根)节点
		void CreateQuadTreeNode(int depth, FBox2D rect, QuadTreeNode *p_node);
		//拆分节点
		void Split(QuadTreeNode *pNode);
		//获得点所在象限(不在节点内返回-1)
		int GetIndex(FVector2D pos, QuadTreeNode *pNode);
		//插入一个点
		void Insert(FFindNear_Point pos, QuadTreeNode *p_node);
		//查询
		void Search(FBox2D AdsorbBox, TArray<FFindNear_Point> &pos_list, QuadTreeNode *p_node);
		//获得子节点与吸附Box重叠的象限
		TArray<int> GetChildIntersect(FBox2D AdsorbBox, QuadTreeNode *pNode);
 
		//允许单个节点存在的点数量上限
		int m_maxobjects;
		//节点深度上限
		int m_depth;
		//根节点
		QuadTreeNode *root;
public:
	//构造查询树
	UFUNCTION(BlueprintCallable, Category = "FindNearPoint")
		void BuildTree(TArray<FFindNear_Point> Points);
	//执行查询
    //Point:输入点
    //adsorbExtent:吸附范围
    //TArray<FFindNear_Point>:返回值距离小于吸附范围的所有点
	UFUNCTION(BlueprintCallable, Category = "FindNearPoint")
		void GetNearInfo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值