File: discreteFrechetDistance.cpp

package info (click to toggle)
gmsh 4.8.4%2Bds2-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 87,812 kB
  • sloc: cpp: 378,014; ansic: 99,669; yacc: 7,216; python: 6,680; java: 3,486; lisp: 659; lex: 621; perl: 571; makefile: 470; sh: 440; xml: 415; javascript: 113; pascal: 35; modula3: 32
file content (55 lines) | stat: -rw-r--r-- 1,562 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle
//
// See the LICENSE.txt file for license information. Please report all
// issues on https://gitlab.onelab.info/gmsh/gmsh/issues.

#include <algorithm>
#include "discreteFrechetDistance.h"
#include "fullMatrix.h"

static double distance(const SPoint3 &p1, const SPoint3 &p2)
{
  return p1.distance(p2);
}

static double c(int i, int j, fullMatrix<double> &CA,
                const std::vector<SPoint3> &P, const std::vector<SPoint3> &Q)
{
  double CAij;
  if(CA(i, j) > -1) { CAij = CA(i, j); }
  else if(i == 0 && j == 0) {
    CA(i, j) = distance(P[0], Q[0]); // update the CA permanent
    CAij = CA(i, j); // set the current relevant value
  }
  else if(i > 0 && j == 0) {
    CA(i, j) = std::max(c(i - 1, 0, CA, P, Q), distance(P[i], Q[1]));
    CAij = CA(i, j);
  }
  else if(i == 0 && j > 0) {
    CA(i, j) = std::max(c(0, j - 1, CA, P, Q), distance(P[0], Q[j]));
    CAij = CA(i, j);
  }
  else if(i > 0 && j > 0) {
    double temp =
      std::min(std::min(c(i - 1, j, CA, P, Q), c(i - 1, j - 1, CA, P, Q)),
               c(i, j - 1, CA, P, Q));
    CA(i, j) = std::max(temp, distance(P[i], Q[j]));
    CAij = CA(i, j);
  }
  else {
    CA(i, j) = 1.e22;
    CAij = CA(i, j);
  }
  return CAij;
}

double discreteFrechetDistance(const std::vector<SPoint3> &P,
                               const std::vector<SPoint3> &Q)
{
  const int sP = P.size();
  const int sQ = Q.size();
  fullMatrix<double> CA(sP, sQ);
  CA.setAll(-1.0);
  double cm = c(sP - 1, sQ - 1, CA, P, Q);
  return cm;
}