21Line::Line(std::array<float, 3> firstPoint, std::array<float, 3> secondPoint)
39 float module{std::abs(firstLine.cosinesDirector[1] * secondLine.cosinesDirector[2]) +
40 std::abs(firstLine.cosinesDirector[2] * secondLine.cosinesDirector[1])};
41 if (std::abs(crossProdX) >
precision * module) {
47 module = std::abs(firstLine.cosinesDirector[0] * secondLine.cosinesDirector[2]) +
48 std::abs(firstLine.cosinesDirector[2] * secondLine.cosinesDirector[0]);
49 if (std::abs(crossProdY) >
precision * module) {
55 module = std::abs(firstLine.cosinesDirector[0] * secondLine.cosinesDirector[1]) +
56 std::abs(firstLine.cosinesDirector[1] * secondLine.cosinesDirector[0]);
57 if (std::abs(crossProdZ) >
precision * module) {
66 std::array<float, 6>
components{0., 0., 0., 0., 0., 0.};
68 for (
int i{0};
i < 3; ++
i) {
69 cdelta -= line.cosinesDirector[
i] * (line.originPoint[
i] -
point[
i]);
72 components[0] = line.originPoint[0] -
point[0] + line.cosinesDirector[0] * cdelta;
73 components[3] = line.originPoint[1] -
point[1] + line.cosinesDirector[1] * cdelta;
74 components[5] = line.originPoint[2] -
point[2] + line.cosinesDirector[2] * cdelta;
82ClusterLines::ClusterLines(
const int firstLabel,
const Line& firstLine,
const int secondLabel,
const Line& secondLine,
86 updateROFPoll(firstLine);
87 updateROFPoll(secondLine);
89 mLabels.push_back(firstLabel);
90 if (secondLabel > 0) {
91 mLabels.push_back(secondLabel);
94 std::array<float, 3> covarianceFirst{1., 1., 1.};
95 std::array<float, 3> covarianceSecond{1., 1., 1.};
101 float determinantFirst =
105 float determinantSecond =
176 computeClusterCentroid();
181 std::transform(mRMS2.begin(), mRMS2.end(), tmpRMS2Line2.begin(), mRMS2.begin(), [&](
const float a,
const float b) { return a + (b - a) / mLabels.size(); });
188ClusterLines::ClusterLines(
const Line& firstLine,
const Line& secondLine)
191 std::array<float, 3> covarianceFirst{1., 1., 1.};
192 std::array<float, 3> covarianceSecond{1., 1., 1.};
193 updateROFPoll(firstLine);
194 updateROFPoll(secondLine);
199 float determinantFirst =
200 firstLine.cosinesDirector[2] * firstLine.cosinesDirector[2] * covarianceFirst[0] * covarianceFirst[1] +
201 firstLine.cosinesDirector[1] * firstLine.cosinesDirector[1] * covarianceFirst[0] * covarianceFirst[2] +
202 firstLine.cosinesDirector[0] * firstLine.cosinesDirector[0] * covarianceFirst[1] * covarianceFirst[2];
203 float determinantSecond =
204 secondLine.cosinesDirector[2] * secondLine.cosinesDirector[2] * covarianceSecond[0] * covarianceSecond[1] +
205 secondLine.cosinesDirector[1] * secondLine.cosinesDirector[1] * covarianceSecond[0] * covarianceSecond[2] +
206 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[0] * covarianceSecond[1] * covarianceSecond[2];
208 mAMatrix[0] = (firstLine.cosinesDirector[2] * firstLine.cosinesDirector[2] * covarianceFirst[1] +
209 firstLine.cosinesDirector[1] * firstLine.cosinesDirector[1] * covarianceFirst[2]) /
211 (secondLine.cosinesDirector[2] * secondLine.cosinesDirector[2] * covarianceSecond[1] +
212 secondLine.cosinesDirector[1] * secondLine.cosinesDirector[1] * covarianceSecond[2]) /
215 mAMatrix[1] = -firstLine.cosinesDirector[0] * firstLine.cosinesDirector[1] * covarianceFirst[2] / determinantFirst -
216 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[1] * covarianceSecond[2] / determinantSecond;
218 mAMatrix[2] = -firstLine.cosinesDirector[0] * firstLine.cosinesDirector[2] * covarianceFirst[1] / determinantFirst -
219 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[2] * covarianceSecond[1] / determinantSecond;
221 mAMatrix[3] = (firstLine.cosinesDirector[2] * firstLine.cosinesDirector[2] * covarianceFirst[0] +
222 firstLine.cosinesDirector[0] * firstLine.cosinesDirector[0] * covarianceFirst[2]) /
224 (secondLine.cosinesDirector[2] * secondLine.cosinesDirector[2] * covarianceSecond[0] +
225 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[0] * covarianceSecond[2]) /
228 mAMatrix[4] = -firstLine.cosinesDirector[1] * firstLine.cosinesDirector[2] * covarianceFirst[0] / determinantFirst -
229 secondLine.cosinesDirector[1] * secondLine.cosinesDirector[2] * covarianceSecond[0] / determinantSecond;
231 mAMatrix[5] = (firstLine.cosinesDirector[1] * firstLine.cosinesDirector[1] * covarianceFirst[0] +
232 firstLine.cosinesDirector[0] * firstLine.cosinesDirector[0] * covarianceFirst[1]) /
234 (secondLine.cosinesDirector[1] * secondLine.cosinesDirector[1] * covarianceSecond[0] +
235 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[0] * covarianceSecond[1]) /
239 (firstLine.cosinesDirector[1] * covarianceFirst[2] * (-firstLine.cosinesDirector[1] * firstLine.originPoint[0] + firstLine.cosinesDirector[0] * firstLine.originPoint[1]) +
240 firstLine.cosinesDirector[2] * covarianceFirst[1] * (-firstLine.cosinesDirector[2] * firstLine.originPoint[0] + firstLine.cosinesDirector[0] * firstLine.originPoint[2])) /
244 (secondLine.cosinesDirector[1] * covarianceSecond[2] * (-secondLine.cosinesDirector[1] * secondLine.originPoint[0] + secondLine.cosinesDirector[0] * secondLine.originPoint[1]) +
245 secondLine.cosinesDirector[2] * covarianceSecond[1] *
246 (-secondLine.cosinesDirector[2] * secondLine.originPoint[0] +
247 secondLine.cosinesDirector[0] * secondLine.originPoint[2])) /
251 (firstLine.cosinesDirector[0] * covarianceFirst[2] * (-firstLine.cosinesDirector[0] * firstLine.originPoint[1] + firstLine.cosinesDirector[1] * firstLine.originPoint[0]) +
252 firstLine.cosinesDirector[2] * covarianceFirst[0] * (-firstLine.cosinesDirector[2] * firstLine.originPoint[1] + firstLine.cosinesDirector[1] * firstLine.originPoint[2])) /
256 (secondLine.cosinesDirector[0] * covarianceSecond[2] * (-secondLine.cosinesDirector[0] * secondLine.originPoint[1] + secondLine.cosinesDirector[1] * secondLine.originPoint[0]) +
257 secondLine.cosinesDirector[2] * covarianceSecond[0] *
258 (-secondLine.cosinesDirector[2] * secondLine.originPoint[1] +
259 secondLine.cosinesDirector[1] * secondLine.originPoint[2])) /
263 (firstLine.cosinesDirector[0] * covarianceFirst[1] * (-firstLine.cosinesDirector[0] * firstLine.originPoint[2] + firstLine.cosinesDirector[2] * firstLine.originPoint[0]) +
264 firstLine.cosinesDirector[1] * covarianceFirst[0] * (-firstLine.cosinesDirector[1] * firstLine.originPoint[2] + firstLine.cosinesDirector[2] * firstLine.originPoint[1])) /
268 (secondLine.cosinesDirector[0] * covarianceSecond[1] * (-secondLine.cosinesDirector[0] * secondLine.originPoint[2] + secondLine.cosinesDirector[2] * secondLine.originPoint[0]) +
269 secondLine.cosinesDirector[1] * covarianceSecond[0] *
270 (-secondLine.cosinesDirector[1] * secondLine.originPoint[2] +
271 secondLine.cosinesDirector[2] * secondLine.originPoint[1])) /
274 computeClusterCentroid();
277void ClusterLines::add(
const int& lineLabel,
const Line& line,
const bool&
weight)
279 mLabels.push_back(lineLabel);
281 std::array<float, 3> covariance{1., 1., 1.};
288 double determinant{
line.cosinesDirector[2] *
line.cosinesDirector[2] * covariance[0] * covariance[1] +
289 line.cosinesDirector[1] *
line.cosinesDirector[1] * covariance[0] * covariance[2] +
290 line.cosinesDirector[0] *
line.cosinesDirector[0] * covariance[1] * covariance[2]};
292 mAMatrix[0] += (
line.cosinesDirector[2] *
line.cosinesDirector[2] * covariance[1] +
293 line.cosinesDirector[1] *
line.cosinesDirector[1] * covariance[2]) /
295 mAMatrix[1] += -
line.cosinesDirector[0] *
line.cosinesDirector[1] * covariance[2] / determinant;
296 mAMatrix[2] += -
line.cosinesDirector[0] *
line.cosinesDirector[2] * covariance[1] / determinant;
297 mAMatrix[3] += (
line.cosinesDirector[2] *
line.cosinesDirector[2] * covariance[0] +
298 line.cosinesDirector[0] *
line.cosinesDirector[0] * covariance[2]) /
300 mAMatrix[4] += -
line.cosinesDirector[1] *
line.cosinesDirector[2] * covariance[0] / determinant;
301 mAMatrix[5] += (
line.cosinesDirector[1] *
line.cosinesDirector[1] * covariance[0] +
302 line.cosinesDirector[0] *
line.cosinesDirector[0] * covariance[1]) /
305 mBMatrix[0] += (
line.cosinesDirector[1] * covariance[2] *
306 (-
line.cosinesDirector[1] *
line.originPoint[0] +
line.cosinesDirector[0] *
line.originPoint[1]) +
307 line.cosinesDirector[2] * covariance[1] *
308 (-
line.cosinesDirector[2] *
line.originPoint[0] +
line.cosinesDirector[0] *
line.originPoint[2])) /
310 mBMatrix[1] += (
line.cosinesDirector[0] * covariance[2] *
311 (-
line.cosinesDirector[0] *
line.originPoint[1] +
line.cosinesDirector[1] *
line.originPoint[0]) +
312 line.cosinesDirector[2] * covariance[0] *
313 (-
line.cosinesDirector[2] *
line.originPoint[1] +
line.cosinesDirector[1] *
line.originPoint[2])) /
315 mBMatrix[2] += (
line.cosinesDirector[0] * covariance[1] *
316 (-
line.cosinesDirector[0] *
line.originPoint[2] +
line.cosinesDirector[2] *
line.originPoint[0]) +
317 line.cosinesDirector[1] * covariance[0] *
318 (-
line.cosinesDirector[1] *
line.originPoint[2] +
line.cosinesDirector[2] *
line.originPoint[1])) /
321 computeClusterCentroid();
325void ClusterLines::computeClusterCentroid()
328 double determinant{mAMatrix[0] * (mAMatrix[3] * mAMatrix[5] - mAMatrix[4] * mAMatrix[4]) -
329 mAMatrix[1] * (mAMatrix[1] * mAMatrix[5] - mAMatrix[4] * mAMatrix[2]) +
330 mAMatrix[2] * (mAMatrix[1] * mAMatrix[4] - mAMatrix[2] * mAMatrix[3])};
332 if (determinant == 0) {
336 mVertex[0] = -(mBMatrix[0] * (mAMatrix[3] * mAMatrix[5] - mAMatrix[4] * mAMatrix[4]) -
337 mAMatrix[1] * (mBMatrix[1] * mAMatrix[5] - mAMatrix[4] * mBMatrix[2]) +
338 mAMatrix[2] * (mBMatrix[1] * mAMatrix[4] - mBMatrix[2] * mAMatrix[3])) /
340 mVertex[1] = -(mAMatrix[0] * (mBMatrix[1] * mAMatrix[5] - mBMatrix[2] * mAMatrix[4]) -
341 mBMatrix[0] * (mAMatrix[1] * mAMatrix[5] - mAMatrix[4] * mAMatrix[2]) +
342 mAMatrix[2] * (mAMatrix[1] * mBMatrix[2] - mAMatrix[2] * mBMatrix[1])) /
344 mVertex[2] = -(mAMatrix[0] * (mAMatrix[3] * mBMatrix[2] - mBMatrix[1] * mAMatrix[4]) -
345 mAMatrix[1] * (mAMatrix[1] * mBMatrix[2] - mBMatrix[1] * mAMatrix[2]) +
346 mBMatrix[0] * (mAMatrix[1] * mAMatrix[4] - mAMatrix[2] * mAMatrix[3])) /
350bool ClusterLines::operator==(
const ClusterLines& rhs)
const
353 for (
auto i{0};
i < 6; ++
i) {
354 retval &= this->mRMS2[
i] ==
rhs.mRMS2[
i];
356 for (
auto i{0};
i < 3; ++
i) {
357 retval &= this->mVertex[
i] ==
rhs.mVertex[
i];
359 if (this->mLabels.size() !=
rhs.mLabels.size()) {
362 for (
size_t i{0};
i < this->mLabels.size(); ++
i) {
363 retval &= this->mLabels[
i] ==
rhs.mLabels[
i];
366 return retval && this->mAvgDistance2 ==
rhs.mAvgDistance2;
369GPUhdi()
void ClusterLines::updateROFPoll(const Line& line)
372 if (mROFWeight == 0) {
373 mROF =
line.getMinROF();
376 if (mROF ==
line.getMinROF()) {
GLuint GLuint GLfloat weight
GLboolean GLboolean GLboolean b
GLint GLenum GLint components
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLboolean GLboolean GLboolean GLboolean a
GLenum GLint GLint * precision
int32_t const char int32_t line
D const SVectorGPU< T, D > & rhs
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
static std::array< float, 6 > getDCAComponents(const Line &line, const std::array< float, 3 > point)
Line(std::array< float, 3 > firstPoint, std::array< float, 3 > secondPoint)
const Cluster const Cluster *static float getDistanceFromPoint(const Line &line, const std::array< float, 3 > &point)
static bool areParallel(const Line &, const Line &, const float precision=constants::Tolerance)