// static void swap(List<T> arr, int index1, int index2) // { // T tmp = arr[index1]; // arr[index1] = arr[index2]; // arr[index2] = tmp; // } // static T SelectMedian(List<T> a, int left, int right, CompareFunction<T> _compareFunction, params object[] args) // { // int midIndex = (left + right)>>1; // int diff = _compareFunction(a[left], a[midIndex], args); // if (diff > 0) // { // swap(a, left, midIndex); // } // diff = _compareFunction(a[left], a[right], args); // if (diff > 0) // { // swap(a, left, right); // } // diff = _compareFunction(a[midIndex], a[right], args); // if (diff > 0) // { // swap(a, midIndex, right); // } // swap(a, midIndex, right); // return a[right-1]; //返回中轴 // } ////// test ////////////////////////// public static void test_find() { List <int> arr = new List <int>(10); arr.Add(2); arr.Add(9); arr.Add(4); arr.Add(5); arr.Add(3); arr.Add(2); arr.Add(8); arr.Add(1); arr.Add(7); CQuickSort.Sort <int>(arr, 0, arr.Count - 1, test_compare_function); string out1 = ""; for (int i = 0; i < arr.Count; i++) { out1 += " " + arr[i].ToString(); } //Debug.LogError(out1); int _index = -1; _index = CQuickSort.Search <int>(arr, 9, test_compare_function); //Debug.LogError("_index " + _index); }
public PathNode GeneratePathNode(int _groupId, int _refeshIndex, List <PathNode> result) { if (_refeshIndex == mRefeshIndex) { return(mPathNode); } mRefeshIndex = _refeshIndex; mPathNode = new PathNode(); mPathNode.mId = sMaxID++; mPathNode.mName = mName; mPathNode.mGroupID = _groupId; mPathNode.mValue = mValue; mPathNode.mPosition = transform.position; for (int i = 0; i < mListNode.Count; i++) { PathNode linknode = mListNode[i].GeneratePathNode(_groupId, _refeshIndex, result); if (linknode != null) { mPathNode.mLinkID.Add(linknode.mId); } } CQuickSort.Sort <int>(mPathNode.mLinkID, 0, mPathNode.mLinkID.Count - 1, PathNodeManager.SortIntCompare); result.Add(mPathNode); return(mPathNode); }
public void SaveBinary(string pathfile) { FileStream fs = new FileStream(pathfile, FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); Refesh(); List <PathNode> lstnode = GeneratePathNode(); Debug.LogError("lstnode.Count " + lstnode.Count); CQuickSort.Sort <PathNode>(lstnode, 0, lstnode.Count - 1, PathNodeManager.SortPathNodeCompare); //sort bw.Write(lstnode.Count); for (int i = 0; i < lstnode.Count; i++) { // Debug.LogError("node id " + lstnode[i].mId); lstnode[i].Write(bw); } bw.Close(); fs.Close(); AssetDatabase.Refresh(); }
//////////////////////// // 1.把所有点放在二维坐标系中,则纵坐标最小的点一定是凸包上的点 // 2.把所有点的坐标平移一下,使 P0 作为原点 // 3.计算各个点相对于 P0 的幅角 α ,按从小到大的顺序对各个点排序。当 α 相同时,距离 P0 比较近的排在前面。我们由几何知识可以知道,结果中第一个点 P1 和最后一个点一定是凸包上的点。 // (以上是准备步骤,以下开始求凸包) // 以上,我们已经知道了凸包上的第一个点 P0 和第二个点 P1,我们把它们放在栈里面。现在从步骤3求得的那个结果里,把 P1 后面的那个点拿出来做当前点,即 P2 。接下来开始找第三个点: // 4.连接P0和栈顶的那个点,得到直线 L 。看当前点是在直线 L 的右边还是左边。如果在直线的右边就执行步骤5;如果在直线上,或者在直线的左边就执行步骤6。 // 5.如果在右边,则栈顶的那个元素不是凸包上的点,把栈顶元素出栈。执行步骤4。 // 6.当前点是凸包上的点,把它压入栈,执行步骤7。 // 7.检查当前的点 P2 是不是步骤3那个结果的最后一个元素。是最后一个元素的话就结束。如果不是的话就把 P2 后面那个点做当前点,返回步骤4。 // 最后,栈中的元素就是凸包上的点了。 // convex public static List <Vector2> ConvexHull(List <Vector2> vex) { List <Vector2> result = new List <Vector2> (16); CQuickSort.Sort <Vector2> (vex, 0, vex.Count - 1, ConvexCompare1); for (int i = 1; i < vex.Count - 1;) { Vector2 v1 = vex[i - 1]; Vector2 v2 = vex[i]; Vector2 v3 = v1 - v2; if (IsEqualZero(v3)) { vex.RemoveAt(i); } else { i++; } } _TempConvexFirst = vex[0]; result.Add(vex[0]); CQuickSort.Sort <Vector2> (vex, 1, vex.Count - 1, ConvexCompare2); result.Add(vex[1]); for (int i = 2; i < vex.Count; i++) { // Debug.LogError("index " + i); while (ConvexPointCross(result[result.Count - 2], result[result.Count - 1], vex[i]) < 0) { result.RemoveAt(result.Count - 1); } result.Add(vex[i]); } return(result); }
// Counter clock wise operation public static void CCW(List <Vector2> vex) { CQuickSort.Sort <Vector2> (vex, 0, vex.Count - 1, ConvexCompare1); _TempConvexFirst = vex[0]; CQuickSort.Sort <Vector2> (vex, 1, vex.Count - 1, ConvexCompare2); }
public static void test_sort() { List <int> arr = new List <int>(10); arr.Add(2); arr.Add(9); arr.Add(4); arr.Add(5); arr.Add(3); arr.Add(2); arr.Add(8); arr.Add(1); arr.Add(7); // List<int> arr = new List<int>(10); // arr.Add(2); // arr.Add(1); // List<int> arr = new List<int>(10); // arr.Add(2); // arr.Add(1); // arr.Add(4); // List<int> arr = new List<int>(10); // arr.Add(1); // arr.Add(2); // arr.Add(3); // arr.Add(4); // arr.Add(5); // arr.Add(6); // arr.Add(7); // arr.Add(8); // List<int> arr = new List<int>(10); // arr.Add(2); // arr.Add(2); // arr.Add(2); // arr.Add(2); // arr.Add(2); // arr.Add(2); // arr.Add(2); // arr.Add(2); string out1 = ""; out1 = ""; for (int i = 0; i < arr.Count; i++) { out1 += " " + arr[i].ToString(); } //Debug.LogError(out1); CQuickSort.Sort <int>(arr, 0, arr.Count - 1, test_compare_function); out1 = ""; for (int i = 0; i < arr.Count; i++) { out1 += " " + arr[i].ToString(); } //Debug.LogError(out1); }