21Line::Line(std::array<float, 3> firstPoint, std::array<float, 3> secondPoint)
22 : weightMatrix{1., 0., 0., 1., 0., 1.}
40 float module{std::abs(firstLine.cosinesDirector[1] * secondLine.cosinesDirector[2]) +
41 std::abs(firstLine.cosinesDirector[2] * secondLine.cosinesDirector[1])};
42 if (std::abs(crossProdX) >
precision * module) {
48 module = std::abs(firstLine.cosinesDirector[0] * secondLine.cosinesDirector[2]) +
49 std::abs(firstLine.cosinesDirector[2] * secondLine.cosinesDirector[0]);
50 if (std::abs(crossProdY) >
precision * module) {
56 module = std::abs(firstLine.cosinesDirector[0] * secondLine.cosinesDirector[1]) +
57 std::abs(firstLine.cosinesDirector[1] * secondLine.cosinesDirector[0]);
58 if (std::abs(crossProdZ) >
precision * module) {
67 std::array<float, 6>
components{0., 0., 0., 0., 0., 0.};
69 for (
int i{0};
i < 3; ++
i) {
83ClusterLines::ClusterLines(
const int firstLabel,
const Line& firstLine,
const int secondLabel,
const Line& secondLine,
87 updateROFPoll(firstLine);
88 updateROFPoll(secondLine);
90 mLabels.push_back(firstLabel);
91 if (secondLabel > 0) {
92 mLabels.push_back(secondLabel);
95 std::array<float, 3> covarianceFirst{1., 1., 1.};
96 std::array<float, 3> covarianceSecond{1., 1., 1.};
98 for (
int i{0};
i < 6; ++
i) {
102 float determinantFirst =
106 float determinantSecond =
177 computeClusterCentroid();
182 std::transform(mRMS2.begin(), mRMS2.end(), tmpRMS2Line2.begin(), mRMS2.begin(), [&](
const float a,
const float b) { return a + (b - a) / mLabels.size(); });
189ClusterLines::ClusterLines(
const Line& firstLine,
const Line& secondLine)
192 std::array<float, 3> covarianceFirst{1., 1., 1.};
193 std::array<float, 3> covarianceSecond{1., 1., 1.};
194 updateROFPoll(firstLine);
195 updateROFPoll(secondLine);
196 for (
int i{0};
i < 6; ++
i) {
197 mWeightMatrix[
i] = firstLine.weightMatrix[
i] + secondLine.weightMatrix[
i];
200 float determinantFirst =
201 firstLine.cosinesDirector[2] * firstLine.cosinesDirector[2] * covarianceFirst[0] * covarianceFirst[1] +
202 firstLine.cosinesDirector[1] * firstLine.cosinesDirector[1] * covarianceFirst[0] * covarianceFirst[2] +
203 firstLine.cosinesDirector[0] * firstLine.cosinesDirector[0] * covarianceFirst[1] * covarianceFirst[2];
204 float determinantSecond =
205 secondLine.cosinesDirector[2] * secondLine.cosinesDirector[2] * covarianceSecond[0] * covarianceSecond[1] +
206 secondLine.cosinesDirector[1] * secondLine.cosinesDirector[1] * covarianceSecond[0] * covarianceSecond[2] +
207 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[0] * covarianceSecond[1] * covarianceSecond[2];
209 mAMatrix[0] = (firstLine.cosinesDirector[2] * firstLine.cosinesDirector[2] * covarianceFirst[1] +
210 firstLine.cosinesDirector[1] * firstLine.cosinesDirector[1] * covarianceFirst[2]) /
212 (secondLine.cosinesDirector[2] * secondLine.cosinesDirector[2] * covarianceSecond[1] +
213 secondLine.cosinesDirector[1] * secondLine.cosinesDirector[1] * covarianceSecond[2]) /
216 mAMatrix[1] = -firstLine.cosinesDirector[0] * firstLine.cosinesDirector[1] * covarianceFirst[2] / determinantFirst -
217 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[1] * covarianceSecond[2] / determinantSecond;
219 mAMatrix[2] = -firstLine.cosinesDirector[0] * firstLine.cosinesDirector[2] * covarianceFirst[1] / determinantFirst -
220 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[2] * covarianceSecond[1] / determinantSecond;
222 mAMatrix[3] = (firstLine.cosinesDirector[2] * firstLine.cosinesDirector[2] * covarianceFirst[0] +
223 firstLine.cosinesDirector[0] * firstLine.cosinesDirector[0] * covarianceFirst[2]) /
225 (secondLine.cosinesDirector[2] * secondLine.cosinesDirector[2] * covarianceSecond[0] +
226 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[0] * covarianceSecond[2]) /
229 mAMatrix[4] = -firstLine.cosinesDirector[1] * firstLine.cosinesDirector[2] * covarianceFirst[0] / determinantFirst -
230 secondLine.cosinesDirector[1] * secondLine.cosinesDirector[2] * covarianceSecond[0] / determinantSecond;
232 mAMatrix[5] = (firstLine.cosinesDirector[1] * firstLine.cosinesDirector[1] * covarianceFirst[0] +
233 firstLine.cosinesDirector[0] * firstLine.cosinesDirector[0] * covarianceFirst[1]) /
235 (secondLine.cosinesDirector[1] * secondLine.cosinesDirector[1] * covarianceSecond[0] +
236 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[0] * covarianceSecond[1]) /
240 (firstLine.cosinesDirector[1] * covarianceFirst[2] * (-firstLine.cosinesDirector[1] * firstLine.originPoint[0] + firstLine.cosinesDirector[0] * firstLine.originPoint[1]) +
241 firstLine.cosinesDirector[2] * covarianceFirst[1] * (-firstLine.cosinesDirector[2] * firstLine.originPoint[0] + firstLine.cosinesDirector[0] * firstLine.originPoint[2])) /
245 (secondLine.cosinesDirector[1] * covarianceSecond[2] * (-secondLine.cosinesDirector[1] * secondLine.originPoint[0] + secondLine.cosinesDirector[0] * secondLine.originPoint[1]) +
246 secondLine.cosinesDirector[2] * covarianceSecond[1] *
247 (-secondLine.cosinesDirector[2] * secondLine.originPoint[0] +
248 secondLine.cosinesDirector[0] * secondLine.originPoint[2])) /
252 (firstLine.cosinesDirector[0] * covarianceFirst[2] * (-firstLine.cosinesDirector[0] * firstLine.originPoint[1] + firstLine.cosinesDirector[1] * firstLine.originPoint[0]) +
253 firstLine.cosinesDirector[2] * covarianceFirst[0] * (-firstLine.cosinesDirector[2] * firstLine.originPoint[1] + firstLine.cosinesDirector[1] * firstLine.originPoint[2])) /
257 (secondLine.cosinesDirector[0] * covarianceSecond[2] * (-secondLine.cosinesDirector[0] * secondLine.originPoint[1] + secondLine.cosinesDirector[1] * secondLine.originPoint[0]) +
258 secondLine.cosinesDirector[2] * covarianceSecond[0] *
259 (-secondLine.cosinesDirector[2] * secondLine.originPoint[1] +
260 secondLine.cosinesDirector[1] * secondLine.originPoint[2])) /
264 (firstLine.cosinesDirector[0] * covarianceFirst[1] * (-firstLine.cosinesDirector[0] * firstLine.originPoint[2] + firstLine.cosinesDirector[2] * firstLine.originPoint[0]) +
265 firstLine.cosinesDirector[1] * covarianceFirst[0] * (-firstLine.cosinesDirector[1] * firstLine.originPoint[2] + firstLine.cosinesDirector[2] * firstLine.originPoint[1])) /
269 (secondLine.cosinesDirector[0] * covarianceSecond[1] * (-secondLine.cosinesDirector[0] * secondLine.originPoint[2] + secondLine.cosinesDirector[2] * secondLine.originPoint[0]) +
270 secondLine.cosinesDirector[1] * covarianceSecond[0] *
271 (-secondLine.cosinesDirector[1] * secondLine.originPoint[2] +
272 secondLine.cosinesDirector[2] * secondLine.originPoint[1])) /
275 computeClusterCentroid();
278void ClusterLines::add(
const int& lineLabel,
const Line& line,
const bool&
weight)
280 mLabels.push_back(lineLabel);
282 std::array<float, 3> covariance{1., 1., 1.};
284 for (
int i{0};
i < 6; ++
i) {
285 mWeightMatrix[
i] += line.weightMatrix[
i];
289 double determinant{line.cosinesDirector[2] * line.cosinesDirector[2] * covariance[0] * covariance[1] +
290 line.cosinesDirector[1] * line.cosinesDirector[1] * covariance[0] * covariance[2] +
291 line.cosinesDirector[0] * line.cosinesDirector[0] * covariance[1] * covariance[2]};
293 mAMatrix[0] += (line.cosinesDirector[2] * line.cosinesDirector[2] * covariance[1] +
294 line.cosinesDirector[1] * line.cosinesDirector[1] * covariance[2]) /
296 mAMatrix[1] += -line.cosinesDirector[0] * line.cosinesDirector[1] * covariance[2] / determinant;
297 mAMatrix[2] += -line.cosinesDirector[0] * line.cosinesDirector[2] * covariance[1] / determinant;
298 mAMatrix[3] += (line.cosinesDirector[2] * line.cosinesDirector[2] * covariance[0] +
299 line.cosinesDirector[0] * line.cosinesDirector[0] * covariance[2]) /
301 mAMatrix[4] += -line.cosinesDirector[1] * line.cosinesDirector[2] * covariance[0] / determinant;
302 mAMatrix[5] += (line.cosinesDirector[1] * line.cosinesDirector[1] * covariance[0] +
303 line.cosinesDirector[0] * line.cosinesDirector[0] * covariance[1]) /
306 mBMatrix[0] += (line.cosinesDirector[1] * covariance[2] *
307 (-line.cosinesDirector[1] * line.originPoint[0] + line.cosinesDirector[0] * line.originPoint[1]) +
308 line.cosinesDirector[2] * covariance[1] *
309 (-line.cosinesDirector[2] * line.originPoint[0] + line.cosinesDirector[0] * line.originPoint[2])) /
311 mBMatrix[1] += (line.cosinesDirector[0] * covariance[2] *
312 (-line.cosinesDirector[0] * line.originPoint[1] + line.cosinesDirector[1] * line.originPoint[0]) +
313 line.cosinesDirector[2] * covariance[0] *
314 (-line.cosinesDirector[2] * line.originPoint[1] + line.cosinesDirector[1] * line.originPoint[2])) /
316 mBMatrix[2] += (line.cosinesDirector[0] * covariance[1] *
317 (-line.cosinesDirector[0] * line.originPoint[2] + line.cosinesDirector[2] * line.originPoint[0]) +
318 line.cosinesDirector[1] * covariance[0] *
319 (-line.cosinesDirector[1] * line.originPoint[2] + line.cosinesDirector[2] * line.originPoint[1])) /
322 computeClusterCentroid();
326void ClusterLines::computeClusterCentroid()
329 double determinant{mAMatrix[0] * (mAMatrix[3] * mAMatrix[5] - mAMatrix[4] * mAMatrix[4]) -
330 mAMatrix[1] * (mAMatrix[1] * mAMatrix[5] - mAMatrix[4] * mAMatrix[2]) +
331 mAMatrix[2] * (mAMatrix[1] * mAMatrix[4] - mAMatrix[2] * mAMatrix[3])};
333 if (determinant == 0) {
337 mVertex[0] = -(mBMatrix[0] * (mAMatrix[3] * mAMatrix[5] - mAMatrix[4] * mAMatrix[4]) -
338 mAMatrix[1] * (mBMatrix[1] * mAMatrix[5] - mAMatrix[4] * mBMatrix[2]) +
339 mAMatrix[2] * (mBMatrix[1] * mAMatrix[4] - mBMatrix[2] * mAMatrix[3])) /
341 mVertex[1] = -(mAMatrix[0] * (mBMatrix[1] * mAMatrix[5] - mBMatrix[2] * mAMatrix[4]) -
342 mBMatrix[0] * (mAMatrix[1] * mAMatrix[5] - mAMatrix[4] * mAMatrix[2]) +
343 mAMatrix[2] * (mAMatrix[1] * mBMatrix[2] - mAMatrix[2] * mBMatrix[1])) /
345 mVertex[2] = -(mAMatrix[0] * (mAMatrix[3] * mBMatrix[2] - mBMatrix[1] * mAMatrix[4]) -
346 mAMatrix[1] * (mAMatrix[1] * mBMatrix[2] - mBMatrix[1] * mAMatrix[2]) +
347 mBMatrix[0] * (mAMatrix[1] * mAMatrix[4] - mAMatrix[2] * mAMatrix[3])) /
351bool ClusterLines::operator==(
const ClusterLines& rhs)
const
354 for (
auto i{0};
i < 6; ++
i) {
355 retval &= this->mRMS2[
i] ==
rhs.mRMS2[
i];
357 for (
auto i{0};
i < 3; ++
i) {
358 retval &= this->mVertex[
i] ==
rhs.mVertex[
i];
360 if (this->mLabels.size() !=
rhs.mLabels.size()) {
363 for (
size_t i{0};
i < this->mLabels.size(); ++
i) {
364 retval &= this->mLabels[
i] ==
rhs.mLabels[
i];
367 return retval && this->mAvgDistance2 ==
rhs.mAvgDistance2;
370GPUhdi()
void ClusterLines::updateROFPoll(const Line& line)
386 mROF = line.getMinROF();
388 if (line.getMinROF() < mROF) {
389 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
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=1e-14)
const float secondPoint[3]