問題に直面しました: 3 つの円の交点を計算したいと思います。私の知る限りでは、いわゆる三辺測量を使用する必要があります。私はそれをc ++で実装しました。この記事では、このソリューションには 3 つの制限があると述べています。
- 3 つの中心はすべて平面 z = 0 にあります。
- 球の中心 P1 は原点にあり、
- 球の中心 P2 は x 軸上にある
最初の「基準」については、Z 座標を使用しないため、3 つの中心はすべて平面 z = 0 にあるため、何もする必要はありません。その後、最初のポイント (P1) の中心が原点にある位置にポイントを変換しました。その後、P2 (および P3 も同様) の点を、P2 が x 軸上にある位置に回転させました。
私の問題は: 3 つの中心がすべて X 軸上にある場合、交差領域の中心 ( wiki の記事のアルゴリズムを使用して計算されます) を計算しようとしましたが、計算できません。一方、「円の中心が 1 つの線上にあることはできません...私の問題を視覚的に見てみましょう。私はちょうどそれを描いた:
ご覧のとおり、3 つの円は座標 (4,3) の同じ点で交差しています。したがって、すべて同じ線上 (この例では x 軸上) にあるこれらの点には解があります。円のパラメータは次のとおりです (x、y、半径):
P1: (0,0,5)
P2: (4,0,3)
P3: (8,0,5)
前述したように、三辺測量のアルゴリズムを正常に実装しましたが、この例を解決できません。結果は NaN (非数) です。もちろん、このアルゴリズムを別の円 (同じ線上にない) で既に試しましたが、適切に動作します。
そこで、実装のデバッグを開始し、どこに問題があるのかを突き止めました。私の実装は次のとおりです。
#include <iostream>
#include <fstream>
#include <sstream>
#include <math.h>
#include <vector>
std::ifstream infile("coordinateList.txt");
using namespace std;
std::vector<double> trilateration2D(double point1[], double point2[], double point3[], double r1, double r2, double r3) {
std::vector<double> resultPose;
//unit vector in a direction from point1 to point 2
double p2p1Distance = pow(pow(point2[0]-point1[0],2) + pow(point2[1]-point1[1],2),0.5);
double exx = (point2[0]-point1[0])/p2p1Distance;
double exy = (point2[1]-point1[1])/p2p1Distance;
//signed magnitude of the x component
double ix = exx*(point3[0]-point1[0]);
double iy = exy*(point3[1]-point1[1]);
double i = ix+iy;
//the unit vector in the y direction.
double eyx = (point3[0]-point1[0]-ix*exx)/pow(pow(point3[0]-point1[0]-ix*exx,2) + pow(point3[1]-point1[1]-iy*exy,2),0.5);
double eyy = (point3[1]-point1[1]-iy*exy)/pow(pow(point3[0]-point1[0]-ix*exx,2) + pow(point3[1]-point1[1]-iy*exy,2),0.5);
//the signed magnitude of the y component
double jx = eyx*(point3[0]-point1[0]);
double jy = eyy*(point3[1]-point1[1]);
double j = jx + jy;
//coordinates
double x = (pow(r1,2) - pow(r2,2) + pow(p2p1Distance,2))/ (2 * p2p1Distance);
double y = (pow(r1,2) - pow(r3,2) + pow(i,2) + pow(j,2))/(2*j) - i*x/j;
//result coordinates
double finalX = point1[0]+ x*exx + y*eyx;
double finalY = point1[1]+ x*exy + y*eyy;
resultPose.push_back(finalX);
resultPose.push_back(finalY);
return resultPose;
}
int main(int argc, char* argv[]){
std::vector<double> finalPose;
double p1[] = {0,0};
double p2[] = {4,0};
double p3[] = {8,0};
double r1,r2,r3;
r1 = 5;
r2 =3;
r3 = 5;
finalPose = trilateration2D(p1,p2,p3,r1,r2,r3);
cout<<"X::: "<<finalPose[0]<<endl;
cout<<"Y::: "<<finalPose[1]<<endl;
}
プログラムがeyxとeyyを計算するとき、除算にはゼロがあり、言うまでもなく、ゼロによる除算は「許可されません」。eyxとeyyは y 方向の単位ベクトルですが、このような円の配置では y 方向の単位ベクトルはありません。
私の質問は: このアルゴリズムに 4 番目の制限はありますか? 私の意見では、それは記事に書かれているので、すべての点が同じ線上にあるときに交点を計算できるこの問題の他の解決策を教えてもらえますか? 前もって感謝します!