在我的Unity3d应用程序中,我需要检测用户选择的折线。确定这一点的简单方法是向每个GameObject(折线)添加一个碰撞器组件,然后我会在用户点击折线时知道。但这非常低效,因为我将拥有数千条折线。
所以我更有效的方法是将每条折线距离点{0,0,0}存储在List <KeyValuePair<double,GameObject>>
中。此列表将从最低距离到最高距离排序。当用户选择游戏中的一个点时,我将确定这些点数&#39;距离(D)距离(0,0,0)然后使用“上限”#39; Binary Search
找到最接近此点的折线(即与(0,0,0)的距离相近)。
我的问题:在我去重新发明轮子并编码我自己的“上界”之前。二进制搜索算法,元素排序等,是否有一个C#.NET类用于上边界二进制搜索,它将对我进行排序和搜索?
我知道方法List(T).BinarySearch()
,但是我应该确保List
正确排序吗?如果我的列表没有排序,并且该方法需要对每个方法调用进行排序,那么这可能效率很低。
答案 0 :(得分:1)
您可以使用SortedList<double, GameObject>
来存储多边形,而不是List <KeyValuePair<double,GameObject>>
。或者你在添加了所有多边形后排序()你的List<>
一次(如果你不打算在后面添加其他多边形,那么第二个选项最好)。
IList
下限的@LeakyCode provided an implementation,它会为您提供最接近GameObject
的索引(在您的列表中):
private static int BinarySearch<T>(IList<T> list, T value)
{
if (list == null)
throw new ArgumentNullException("list");
var comp = Comparer<T>.Default;
int lo = 0, hi = list.Length - 1;
while (lo < hi) {
int m = (hi + lo) / 2; // this might overflow; be careful.
if (comp(list[m], value) < 0) lo = m + 1;
else hi = m - 1;
}
if (comp(list[lo], value) < 0) lo++;
return lo;
}
public static int FindFirstIndexGreaterThanOrEqualTo<T,U>
(this SortedList<T,U> sortedList, T key)
{
return BinarySearch(sortedList.Keys, key);
}
答案 1 :(得分:0)
您是否应该首先使用List<T>.Sort
方法对列表进行排序,并在类中实现我们自己的IComparer<T>
。我认为这是最好的方法。