frechet.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package frechet
  2. import "math"
  3. /*
  4. https://github.com/artpar/frechet
  5. */
  6. // Point is used to represent curves
  7. type Point struct {
  8. X float64
  9. Y float64
  10. }
  11. func euclideanDistance(p1 Point, p2 Point) float64 {
  12. dx := p2.X - p1.X
  13. dy := p2.Y - p1.Y
  14. return math.Sqrt(dx*dx + dy*dy)
  15. }
  16. func min(x float64, y float64, z float64) float64 {
  17. if x < y {
  18. return math.Min(x, z)
  19. }
  20. return math.Min(y, z)
  21. }
  22. // Frechet is a dynamic programming implementation calculating the frechet distance between the two curves c1 and c2.
  23. func Frechet(c1 []Point, c2 []Point) float64 {
  24. I := len(c1)
  25. J := len(c2)
  26. runningMaxI := 0.0
  27. for i := 0; i < I; i++ {
  28. currentMin := 1e+09
  29. for j := 0; j < J; j++ {
  30. currDist := euclideanDistance(c1[i], c2[j])
  31. currentMin = math.Min(currentMin, currDist)
  32. }
  33. runningMaxI = math.Max(runningMaxI, currentMin)
  34. }
  35. runningMaxJ := 0.0
  36. for j := 0; j < J; j++ {
  37. currentMin := 1e+09
  38. for i := 0; i < I; i++ {
  39. currDist := euclideanDistance(c1[i], c2[j])
  40. currentMin = math.Min(currentMin, currDist)
  41. }
  42. runningMaxJ = math.Max(runningMaxJ, currentMin)
  43. }
  44. return math.Max(runningMaxI, runningMaxJ)
  45. }