Я пытаюсь найти общее пересечение (x, y) 3 окружностей, используя c ++. Но я не получаю правильный вывод. Что я делаю не так в моем коде? Здесь я использую мою программу для вычисления общей точки пересечения. Здесь сначала я вычислил пересечение двух пикселей, которое получается из квадратного уравнения, как (x0, y0), (x1, y1). После этого, учитывая, что 3-й круг пересекается по крайней мере в одной точке, я использовал эти две точки пересечения в 3-м круге, в зависимости от того, что удовлетворяет 3-му кругу, он считается общей точкой пересечения 3-го круга. Я делаю что-то не так?
vector<pix> obj; struct pix { int x; int y; };
auto p0 = obj[stoi(r[2])][stoi(r[0])];
auto p1 = obj[stoi(r[2])][stoi(r[1])];
int ax = p1.x-p0.x; int ay = p1.y-p0.y;
int bx = -ay; int by = ax;
pix pv;
pv.x = p1.x+bx; pv.y = p1.y+by;
OrigImg.copyTo(cv_ptr->image);
for(auto pi : obj[stoi(r[2])]) {
float p0pi = sqrt(pow(p0.x-pi.x,2)+pow(p0.y-pi.y,2));
float p1pi = sqrt(pow(p1.x-pi.x,2)+pow(p1.y-pi.y,2));
float pvpi = sqrt(pow(pv.x-pi.x,2)+pow(pv.y-pi.y,2));
float a1 = 2*(p1.x-p0.x);
float b1 = 2*(p1.y-p0.y);
float c1 = p0.x*p0.x-p1.x*p1.x+p0.y*p0.y-p1.y*p1.y-p0pi*p0pi+p1pi*p1pi;
float a = a1*a1+b1*b1;
float b = 2*(b1*c1 + b1*a1*p0.x - p0.y*a1*a1);
float c = c1*c1+2*c1*p0.x*a1 + a1*a1*(p0.x*p0.x + p0.y*p0.y - p0pi*p0pi);
int y0 = -(b+sqrt(b*b-4*a*c))/2*a;
int y1 = (b+sqrt(b*b-4*a*c))/2*a;
int x0 = -(b1*y0+c1)/a1;
int x1 = -(b1*y1+c1)/a1;
int x,y;
cout<<"hello"<<x0<<"\t"<<y0<<"\t"<<x1<<"\t"<<y1<<endl;
cout<<pow(x0-pv.x,2)+pow(y0-pv.y,2)<<"\t"<<pvpi*pvpi<<"\t"<<
pow(x1-pv.x,2)+pow(y1-pv.y,2)<<"\t"<<pvpi*pvpi<<endl;
if(sqrt(pow(x0-pv.x,2)+pow(y0-pv.y,2))==pvpi) {
x = x0; y = y0;
}
else if(sqrt(pow(x1-pv.x,2)+pow(y1-pv.y,2))==pvpi) {
x = x1; y = y1;
}
if(x>=0 && x<OrigImg.rows && y>=0 && y<OrigImg.cols) {
cv_ptr->image.at<cv::Vec3b>( y, x )[2] = 0;
cv_ptr->image.at<cv::Vec3b>( y, x )[1] = 0;
cv_ptr->image.at<cv::Vec3b>( y, x )[0] = 0;
}
}
}
image_pub_.publish(cv_ptr->toImageMsg());
Здесь p0, p1, pv - положение трех окружностей, которые находятся в разных положениях. Вот что я пытаюсь сделать, я сохранил пиксели, принадлежащие одному объекту, на карте obj [obj_index] [pixel_index], где индекс пикселя - это индекс для каждого уникального пикселя, принадлежащего этому пикселю, а obj_index - индекс для каждого уникального объекта. ,
После применения некоторого алгоритма сопоставления с образцом я получаю r [0] = obj_index, r [1] = p0 index, r [2] = p1 index объекта. Теперь, что я пытаюсь сделать, чтобы визуализировать и проверить, какие пиксели присутствуют в текущем анализируемом объекте с ранее сохраненным объектом.
Здесь вывод выглядит так:
hello 150492 150336 -150180 -150336
4.51763e+10 873 4.52274e+10 873