@@ -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
7271int 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