GetRandomReachablePointInRadius和GetRandomPointInNavigableRadius

本文介绍了UE4中两个用于生成随机位置的C++函数:K2_GetRandomReachablePointInRadius和K2_GetRandomLocationInNavigableRadius。前者确保返回的位置是可达的,而后者则可能返回不可达的导航点,特别是在存在障碍如孤立平台的情况下。选择使用哪个函数取决于是否需要保证路径可达性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蓝图节点

C++接口

	/** Generates a random location reachable from given Origin location.
	 *	@return Return Value represents if the call was successful */
	UFUNCTION(BlueprintPure, Category = "AI|Navigation", meta = (WorldContext = "WorldContextObject", DisplayName = "GetRandomReachablePointInRadius", ScriptName = "GetRandomReachablePointInRadius"))
	static bool K2_GetRandomReachablePointInRadius(UObject* WorldContextObject, const FVector& Origin, FVector& RandomLocation, float Radius, ANavigationData* NavData = NULL, TSubclassOf<UNavigationQueryFilter> FilterClass = NULL);

	/** Generates a random location in navigable space within given radius of Origin.
	 *	@return Return Value represents if the call was successful */
	UFUNCTION(BlueprintCallable, Category = "AI|Navigation", meta = (WorldContext = "WorldContextObject", DisplayName = "GetRandomLocationInNavigableRadius", ScriptName = "GetRandomLocationInNavigableRadius"))
	static bool K2_GetRandomLocationInNavigableRadius(UObject* WorldContextObject, const FVector& Origin, FVector& RandomLocation, float Radius, ANavigationData* NavData = NULL, TSubclassOf<UNavigationQueryFilter> FilterClass = NULL);

二者都是获取范围内一个随机位置,区别是

GetRandomReachablePointInRadius:一定可达。

GetRandomPointInNavigableRadius:不一定可达。例如在孤立平台上,随机到周围地面,实际上从当前位置到随机位置不可达。

参考

What's the difference between GetRandomReachablePointInRadius and GetRandomPointInNavigableRadius? In which case we should use which. - UE4 AnswerHub

### Java 中 NavigableSet 接口及其实现 #### NavigableSet 接口概述 `NavigableSet<E>` 是 `SortedSet<E>` 的子接口,提供了更丰富的导航方法来访问处理有序集合同类型的元素[^1]。 #### 主要功能特性 - **增强的遍历能力**:提供了一系列新的方法用于获取最接近给定元素的集合成员。 - **迭代器方向控制**:允许创建降序排列的视图以及相应的迭代器。 #### 实现类分析 ##### TreeSet 类 作为 `NavigableSet` 的典型实现之一,`TreeSet` 基于红黑树(Red-Black tree)数据结构实现了该接口。这意味着它不仅能够维持键值对之间的自然顺序或是通过自定义比较器指定的顺序,还具备高效的查找性能 O(log n)[^3]。 ```java // 创建一个新的空 TreeSet,默认按照升序排序 TreeSet<Integer> ts = new TreeSet<>(); ts.add(5); ts.add(7); ts.add(9); System.out.println(ts.lower(8)); // 输出 7 System.out.println(ts.floor(8)); // 输出 7 System.out.println(ts.higher(6)); // 输出 7 System.out.println(ts.ceiling(6)); // 输出 7 ``` 上述代码展示了如何利用 `TreeSet` 提供的一些基本操作函数来进行上下限查询。 ##### ConcurrentSkipListSet 类 另一个值得注意的是并发环境下适用的选择——`ConcurrentSkipListSet`,它是基于跳表(skip list)的数据结构设计而成,同样遵循 `NavigableSet` 定义的行为模式,并且支持高效并行读写操作而不必担心同步问题带来的开销。 ```java import java.util.concurrent.ConcurrentSkipListSet; public class Example { public static void main(String[] args) { ConcurrentSkipListSet<String> css = new ConcurrentSkipListSet<>(); css.add("apple"); css.add("banana"); css.add("orange"); System.out.println(css.pollFirst()); // 移除并返回第一个元素 apple System.out.println(css.last()); // 获取最后一个元素 orange } } ``` 此示例说明了 `ConcurrentSkipListSet` 如何方便地管理共享资源列表的同时保持良好的响应性吞吐率。 #### 导航方法详解 对于任意实现了 `NavigableSet` 接口的对象而言,下面列举了一些常用的导航方法: | 方法名 | 描述 | | --- | --- | | lower(E e) | 返回严格小于给定参数的最大元素;如果不存在这样的元素,则返回 null| | floor(E e)| 返回小于等于给定参数的最大元素;如果没有找到匹配项则返回null | | higher(E e)| 返回严格大于给定参数最小元素;找不到符合条件者时返回null | | ceiling(E e)| 返回大于等于给定参数最小元素;当没有合适的结果存在时返回null | 这些方法极大地简化了开发者在面对复杂业务逻辑需求下对序列化容器内特定位置元素定位的任务难度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值