Tôi đang cố triển khai thuật toán trilateration vào ứng dụng Android của mình để xác định vị trí trong nhà của người dùng. Tôi đang sử dụng đèn hiệu siêu rộng để có khoảng cách tới các điểm cố định. Tôi đã có thể thích nghi với phương pháp đề xuất trong Trilateration Method Android Java như sau:Thuật toán trilateration đa điểm trong Java
public LatLng getLocationByTrilateration(
LatLng location1, double distance1,
LatLng location2, double distance2,
LatLng location3, double distance3){
//DECLARE VARIABLES
double[] P1 = new double[2];
double[] P2 = new double[2];
double[] P3 = new double[2];
double[] ex = new double[2];
double[] ey = new double[2];
double[] p3p1 = new double[2];
double jval = 0;
double temp = 0;
double ival = 0;
double p3p1i = 0;
double triptx;
double tripty;
double xval;
double yval;
double t1;
double t2;
double t3;
double t;
double exx;
double d;
double eyy;
//TRANSALTE POINTS TO VECTORS
//POINT 1
P1[0] = location1.latitude;
P1[1] = location1.longitude;
//POINT 2
P2[0] = location2.latitude;
P2[1] = location2.longitude;
//POINT 3
P3[0] = location3.latitude;
P3[1] = location3.longitude;
//TRANSFORM THE METERS VALUE FOR THE MAP UNIT
//DISTANCE BETWEEN POINT 1 AND MY LOCATION
distance1 = (distance1/100000);
//DISTANCE BETWEEN POINT 2 AND MY LOCATION
distance2 = (distance2/100000);
//DISTANCE BETWEEN POINT 3 AND MY LOCATION
distance3 = (distance3/100000);
for (int i = 0; i < P1.length; i++) {
t1 = P2[i];
t2 = P1[i];
t = t1 - t2;
temp += (t*t);
}
d = Math.sqrt(temp);
for (int i = 0; i < P1.length; i++) {
t1 = P2[i];
t2 = P1[i];
exx = (t1 - t2)/(Math.sqrt(temp));
ex[i] = exx;
}
for (int i = 0; i < P3.length; i++) {
t1 = P3[i];
t2 = P1[i];
t3 = t1 - t2;
p3p1[i] = t3;
}
for (int i = 0; i < ex.length; i++) {
t1 = ex[i];
t2 = p3p1[i];
ival += (t1*t2);
}
for (int i = 0; i < P3.length; i++) {
t1 = P3[i];
t2 = P1[i];
t3 = ex[i] * ival;
t = t1 - t2 -t3;
p3p1i += (t*t);
}
for (int i = 0; i < P3.length; i++) {
t1 = P3[i];
t2 = P1[i];
t3 = ex[i] * ival;
eyy = (t1 - t2 - t3)/Math.sqrt(p3p1i);
ey[i] = eyy;
}
for (int i = 0; i < ey.length; i++) {
t1 = ey[i];
t2 = p3p1[i];
jval += (t1*t2);
}
xval = (Math.pow(distance1, 2) - Math.pow(distance2, 2) + Math.pow(d, 2))/(2*d);
yval = ((Math.pow(distance1, 2) - Math.pow(distance3, 2) + Math.pow(ival, 2) + Math.pow(jval, 2))/(2*jval)) - ((ival/jval)*xval);
t1 = location1.latitude;
t2 = ex[0] * xval;
t3 = ey[0] * yval;
triptx = t1 + t2 + t3;
t1 = location1.longitude;
t2 = ex[1] * xval;
t3 = ey[1] * yval;
tripty = t1 + t2 + t3;
return new LatLng(triptx,tripty);
}
Sử dụng phương pháp này mang lại cho tôi một vị trí người sử dụng, nhưng không phải là terribly chính xác. Làm thế nào tôi có thể mở rộng điều này để sử dụng hơn 3 địa điểm/khoảng cách đã biết? Lý tưởng nhất là N số điểm mà N> = 3.
Điều này chắc chắn sẽ giúp bạn: http: //gis.stackexchange.com/questions/40660/trilateration-algorithm-for-n-amount-of-point – ChrisStillwell
Có vẻ như liên kết đó chỉ cung cấp giải pháp bằng gói phần mềm của bên thứ ba có tên Mathematica. Tôi cần cái gì đó trong Java. Lý tưởng nhất là tôi sẽ không phải bao gồm thư viện hoặc SDK của bên thứ ba, nhưng chỉ cần điều chỉnh thuật toán trên. – Chris
Họ sử dụng nó cho số crunching nhưng toán học vẫn giống nhau bằng cách sử dụng [phi tuyến tính hình vuông nhỏ nhất] (http://en.wikipedia.org/wiki/Non-linear_least_squares) [Thư viện toán học Apache] (http: //commons.apache.org/proper/commons-math/) có tất cả các chức năng bạn sẽ cần – ChrisStillwell