В настоящее время я пытаюсь разработать приложение трилатерации для отслеживания маяков с использованием 3-х телефонов. Я преобразовал код, который я нашел в python, к C#, но у меня возникли проблемы с его работой. Это мой код:Формула Trilateration (программирование)
public double[] getPosition(double phoneADistance, double phoneBDistance, double phoneCDistance)
{
//meterToFeet is just a conversion method which takes the distance parameter and multiplies it by 3.28.
double PhoneADist = meterToFeet(phoneADistance);
double PhoneBDist = meterToFeet(phoneBDistance);
double PhoneCDist = meterToFeet(phoneCDistance);
//The phone's x and y coordinates are pre-set
Vector<double> P1 = new DenseVector(new[] { PhoneA_x, PhoneA_y });
Vector<double> P2 = new DenseVector(new[] { PhoneB_x, PhoneB_y });
Vector<double> P3 = new DenseVector(new[] { PhoneC_x, PhoneC_y });
var ex = (P2 - P1)/(P2 - P1).L2Norm();
var i = ex.DotProduct(P3 - P1);
var ey = (P3 - P1 - i * ex)/(P3 - P1 - i * ex).L2Norm();
var d = (P2 - P1).L2Norm();
var j = ey.DotProduct(P3 - P1);
var x = (Math.Pow(PhoneADist, 2) - Math.Pow(PhoneBDist, 2) + Math.Pow(d, 2))/(2 * d);
var y = ((Math.Pow(PhoneADist, 2) - Math.Pow(PhoneCDist, 2) + Math.Pow(i, 2) + Math.Pow(j, 2))/(2 * j)) - ((i/j) * x);
double[] answer = new double[] { x, y };
Console.Write(x + " " + y);
return answer;
}
Когда я запускаю этот метод
Тестовый случай # 1:
- PhoneA_x & у = (0,0)
- PhoneB_x & у = (100,0)
- PhoneC_x & y = (50,100)
- phoneADistance = 0
- phoneBDistance = 100
- phoneCDistance = 111,803
он возвращает (-488,195, -366,147)
Контрольный пример # 2:
- PhoneA_x & y = (0,0)
- PhoneB_x & у = (100,0)
- PhoneC_x & у = (50100)
- phoneADistance = 25
- phoneBDistance = 25
- phoneCDistance = 25
он возвращает (50, 37.5)
Как результат отличается от ожидаемого? Когда вы проходите через отладчик, в какой момент расчет отличается от ожидаемого? – David
@David В тестовом примере №1 ответ должен быть положительным и находиться в позиции (0,0). Кроме того, в большинстве моих тестовых случаев они почти всегда возвращают (50,37.5), что неверно. – Jay
Откуда взялись данные теста? Не похоже, что эти числа могли бы решить уравнения, если они правильны. – Simon