Replace mjQUICKSORT with std::stable_sort in user_mesh.cc

PiperOrigin-RevId: 677864209
Change-Id: I1cca8e1ae8c84e652b12c24cfddfbca97d8c6841
This commit is contained in:
Yuval Tassa
2024-09-23 11:05:44 -07:00
committed by Copybara-Service
parent bbe8a0c516
commit 5219893813
+14 -17
View File
@@ -55,7 +55,6 @@
#include <mujoco/mjtnum.h> #include <mujoco/mjtnum.h>
#include "engine/engine_crossplatform.h" #include "engine/engine_crossplatform.h"
#include "engine/engine_plugin.h" #include "engine/engine_plugin.h"
#include "engine/engine_sort.h"
#include "engine/engine_util_errmem.h" #include "engine/engine_util_errmem.h"
#include "user/user_cache.h" #include "user/user_cache.h"
#include "user/user_model.h" #include "user/user_model.h"
@@ -843,33 +842,31 @@ void mjCMesh::FitGeom(mjCGeom* geom, double* meshpos) {
// comparison function for vertex sorting // comparison function for vertex sorting
quicksortfunc(vertcompare, context, el1, el2) { bool vertcompare(int index1, int index2, const std::vector<float>& vert) {
float* vert = (float*) context; for (int i = 0; i < 3; i++) {
float x1 = vert[3*(*(int*)el1)] + 1e-2*vert[1+3*(*(int*)el1)] + 1e-4*vert[2+3*(*(int*)el1)]; if (vert[3*index1 + i] < vert[3*index2 + i]) {
float x2 = vert[3*(*(int*)el2)] + 1e-2*vert[1+3*(*(int*)el2)] + 1e-4*vert[2+3*(*(int*)el2)]; return true;
}
if (x1 < x2) { if (vert[3*index1 + i] > vert[3*index2 + i]) {
return -1; return false;
} else if (x1 == x2) { }
return 0;
} else {
return 1;
} }
return false;
} }
// remove repeated vertices // remove repeated vertices
void mjCMesh::RemoveRepeated() { void mjCMesh::RemoveRepeated() {
int repeated = 0; int repeated = 0;
// allocate sort and redirection indices, set to identity std::vector<int> index(nvert());
auto index = std::unique_ptr<int[]>(new int[nvert()]); std::vector<int> redirect(nvert());
auto redirect = std::unique_ptr<int[]>(new int[nvert()]);
for (int i=0; i < nvert(); i++) { for (int i=0; i < nvert(); i++) {
index[i] = redirect[i] = i; index[i] = redirect[i] = i;
} }
// sort vertices std::stable_sort(index.begin(), index.end(), [&vert = vert_](int a, int b) {
mjQUICKSORT(index.get(), nvert(), sizeof(int), vertcompare, vert_.data()); return vertcompare(a, b, vert);
});
// find repeated vertices, set redirect // find repeated vertices, set redirect
for (int i=1; i < nvert(); i++) { for (int i=1; i < nvert(); i++) {