Неверное пересечение 3 круга с ++ - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь найти общее пересечение (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...