-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathclosestPoint.js
83 lines (63 loc) · 2.59 KB
/
closestPoint.js
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//line -> geometria do rua
//point-> geometria do ponto
exports.closestPoint = function(line, point){
//function closestPoint(line, point){
//tratar a string da geometria linha
var geomLine = line.substr(line.indexOf("(")+2);
geomLine = geomLine.substr(0,geomLine.indexOf(")"));
//tratar a string da geometria ponto
var geomPoint = point.substr(point.indexOf("(")+1);
geomPoint = geomPoint.substr(0,geomPoint.indexOf(")"));
//variaveis globais
var distances = [];
var distTotal = 0;
var minDistance = 1000;
//divide o endereço em x y
var coordinates = geomPoint.split(' ');
//divide a rua em grupo de pontos
var pointsLine = geomLine.split(',');
//loop para somar as distancias
for (var i = 1; i < pointsLine.length; i++) {
//insere as distancias no array distances
distances[i] = getDistance(pointsLine[(i-1)].split(' ')[0], pointsLine[(i-1)].split(' ')[1], pointsLine[(i)].split(' ')[0], pointsLine[(i)].split(' ')[1]);
distTotal = distTotal + distances[i];
//descobre onde se encontre o endereço buscados
if (getDistance(geomPoint.split(' ')[0], geomPoint.split(' ')[1], pointsLine[(i-1)].split(' ')[0], pointsLine[(i-1)].split(' ')[1]) < minDistance) {
minDistance = getDistance(geomPoint.split(' ')[0], geomPoint.split(' ')[1], pointsLine[(i-1)].split(' ')[0], pointsLine[(i-1)].split(' ')[1])
index = i;
}
}
//declara variavel P
var P = [];
P.x = geomPoint.split(' ')[0];
P.y = geomPoint.split(' ')[1];
//declara variavel A
var A = [];
A.x = pointsLine[(index-1)].split(' ')[0];
A.y = pointsLine[(index-1)].split(' ')[1];
//declara variavel B
var B = [];
B.x = pointsLine[(index)].split(' ')[0];
B.y = pointsLine[(index)].split(' ')[1];
//declara variavel AP
var AP = [];
AP.x = P.x - A.x;
AP.y = P.y - A.y;
//declara variavel AB
var AB = [];
AB.x = B.x - A.x;
AB.y = B.y - A.y;
//declara variavel ab2, ap_ab e t
var ab2 = AB.x*AB.x + AB.y*AB.y;
var ap_ab = AP.x*AB.x + AP.y*AB.y;
var t = ap_ab / ab2;
//calcula closestPoint usando primeiro ponto mais a distancia total vezes t
closestPoint.x = parseFloat(A.x) + parseFloat(AB.x) * parseFloat(t);
closestPoint.y = parseFloat(A.y) + parseFloat(AB.y) * parseFloat(t);
//alert("POINT("+closestPoint.x +" "+closestPoint.y+")");
return("POINT("+closestPoint.x +" "+closestPoint.y+")");
}
//FUNÇÕES AUXILIARES
var getDistance = function(x1, y1, x2, y2){
return Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}