Skip to content

Commit 747909d

Browse files
committed
improved metric
1 parent 2174c80 commit 747909d

2 files changed

Lines changed: 20 additions & 47 deletions

File tree

raycloudtools/raydiff/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
set(SOURCES
22
raydiff.cpp
33
)
4-
add_compile_options(-ggdb -O0)
54
ras_add_executable(raydiff
65
LIBS raylib
76
SOURCES ${SOURCES}

raycloudtools/raydiff/raydiff.cpp

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ void usage(int exit_code = 1)
2121
std::cout << "Difference between two ray clouds, differences coloured red, and similarity printed to screen. Optional visualisation." << std::endl;
2222
std::cout << "usage:" << std::endl;
2323
std::cout << "raydiff cloud1.ply cloud2.ply" << std::endl;
24-
std::cout << " --metric 0 - diff metric: 0 single uniform, 1: double uniform" << std::endl;
2524
std::cout << " --visualise - open in the default visualisation tool" << std::endl;
2625
// clang-format on
2726
exit(exit_code);
@@ -72,10 +71,8 @@ void calcNearestNeighbourDistances(const ray::Cloud &cloud1, const ray::Cloud &c
7271
int rayDiff(int argc, char *argv[])
7372
{
7473
ray::FileArgument cloud1_name, cloud2_name;
75-
ray::OptionalFlagArgument visualise("--visualise", 'v');
76-
ray::IntArgument metric(0, 10, 0);
77-
ray::OptionalKeyValueArgument metric_option("--metric", 'm', &metric);
78-
if (!ray::parseCommandLine(argc, argv, { &cloud1_name, &cloud2_name }, { &metric_option, &visualise }))
74+
ray::OptionalFlagArgument visualise("visualise", 'v');
75+
if (!ray::parseCommandLine(argc, argv, { &cloud1_name, &cloud2_name }, { &visualise }))
7976
{
8077
usage();
8178
}
@@ -100,8 +97,6 @@ int rayDiff(int argc, char *argv[])
10097
max_dist = std::max(max_dist, dists_to_cloud2[i]);
10198
for (int i = 0; i<(int)dists_to_cloud1.size(); i++)
10299
max_dist = std::max(max_dist, dists_to_cloud1[i]);
103-
int num1 = (int)dists_to_cloud1.size();
104-
int num2 = (int)dists_to_cloud2.size();
105100

106101
// 3. median distance
107102
std::vector<double> sorted_dists = dists_to_cloud2;
@@ -116,30 +111,19 @@ int rayDiff(int argc, char *argv[])
116111
double d = sorted_dists[i];
117112
sorted_dists[i] = d*d*d; // would use d*d if the points were planar
118113
}
119-
120-
bool piecewise_linear = metric.value() == 1;
121114

122-
// 2. accumulate uniform term backwards
115+
// 2. accumulate outside term backwards
123116
std::vector<double> outside_const(num+1, 0.0);
124117
std::vector<double> outside_linear(num+1, 0.0);
125118
std::vector<double> outside_square(num+1, 0.0);
126119
for (int i = num-1; i>=0; i--)
127120
{
128-
if (piecewise_linear)
129-
{
130-
double d = sorted_dists.back() - sorted_dists[i];
131-
double yN = (num-1);
132-
double I = (double)i - yN;
133-
outside_const[i] = outside_const[i+1] + I*I;
134-
outside_linear[i] = outside_linear[i+1] + 2.0*I*d;
135-
outside_square[i] = outside_square[i+1] + d*d;
136-
}
137-
else
138-
{
139-
outside_const[i] = outside_const[i+1] + ray::sqr((double)i);
140-
outside_linear[i] = outside_linear[i+1] - 2.0*(double)i;
141-
outside_square[i] = outside_square[i+1] + 1.0;
142-
}
121+
double d = sorted_dists.back() - sorted_dists[i];
122+
double yN = (num-1);
123+
double I = (double)i - yN;
124+
outside_const[i] = outside_const[i+1] + I*I;
125+
outside_linear[i] = outside_linear[i+1] + 2.0*I*d;
126+
outside_square[i] = outside_square[i+1] + d*d;
143127
}
144128

145129
// 3. accumulate linear term forwards, but store only best results
@@ -157,27 +141,17 @@ int rayDiff(int argc, char *argv[])
157141

158142
// ai^2 + bi + c = 0
159143
double yN = (double)(num-1);
160-
double a = 0, b = 0, c = 0;
161-
if (piecewise_linear)
162-
{
163-
double d = sorted_dists.back() - sorted_dists[i];
164-
double square = outside_square[i]/ray::sqr(d);
165-
double linear = outside_linear[i]/d;
166-
a = square;
167-
b = -linear - 2.0*yN*square;
168-
c = outside_const[i] + linear*yN + square*yN*yN;
169-
170-
// add the inside part
171-
a += inside_square/ray::sqr(sorted_dists[i]); // the division is to match the gradient to y
172-
b += inside_linear/sorted_dists[i];
173-
c += inside_const;
174-
}
175-
else
176-
{
177-
a = outside_square[i] + inside_square/ray::sqr(sorted_dists[i]); // the division is to match the gradient to y
178-
b = outside_linear[i] + inside_linear/sorted_dists[i];
179-
c = outside_const[i] + inside_const;
180-
}
144+
double d = sorted_dists.back() - sorted_dists[i];
145+
double square = outside_square[i]/ray::sqr(d);
146+
double linear = outside_linear[i]/d;
147+
double a = square;
148+
double b = -linear - 2.0*yN*square;
149+
double c = outside_const[i] + linear*yN + square*yN*yN;
150+
151+
// add the inside part
152+
a += inside_square/ray::sqr(sorted_dists[i]); // the division is to match the gradient to y
153+
b += inside_linear/sorted_dists[i];
154+
c += inside_const;
181155

182156
double min_i = -b/(2.0*a); // the height y of the integrated readings
183157
double error_sqr = a*min_i*min_i + b*min_i + c;

0 commit comments

Comments
 (0)