[feat] add prometheus metrics for country
[getmyip.git] / geo.go
1 // Copyright (c) 2018 LEAP Encryption Access Project
2 //
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16 package main
17
18 import (
19         "github.com/hongshibao/go-kdtree"
20 )
21
22 type EuclideanPoint struct {
23         kdtree.Point
24         Vec []float64
25 }
26
27 func (p EuclideanPoint) Dim() int {
28         return len(p.Vec)
29 }
30
31 func (p EuclideanPoint) GetValue(dim int) float64 {
32         return p.Vec[dim]
33 }
34
35 func (p EuclideanPoint) Distance(other kdtree.Point) float64 {
36         var ret float64
37         for i := 0; i < p.Dim(); i++ {
38                 tmp := p.GetValue(i) - other.GetValue(i)
39                 ret += tmp * tmp
40         }
41         return ret
42 }
43
44 func (p EuclideanPoint) PlaneDistance(val float64, dim int) float64 {
45         tmp := p.GetValue(dim) - val
46         return tmp * tmp
47 }
48
49 func NewEuclideanPoint(vals ...float64) *EuclideanPoint {
50         ret := &EuclideanPoint{}
51         for _, val := range vals {
52                 ret.Vec = append(ret.Vec, val)
53         }
54         return ret
55 }