首页 > 解决方案 > 3个圆的交点不正确c ++

问题描述

我正在尝试使用 c++ 找到 3 个圆的公共交点(x,y)。但我没有得到正确的输出。我在我的代码中做错了什么?这是我用来计算公共交点的程序。这里首先我计算了来自二次方程的两个像素的交集,如(x0,y0),(x1,y1)。之后考虑到第三个圆至少在一个点相交,我在第三个圆中使用了这两个交点,以满足第三个圆的为准,它被认为是三个圆的共同交点。我做错什么了吗?

      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 是 3 个不同位置的圆的位置。在这里,我正在尝试执行此操作,我已将属于一个对象的像素保存在地图 obj[obj_index][pixel_index] 中,其中像素索引是属于该像素的每个唯一像素的索引,而 obj_index 是每个唯一对象的索引. 应用一些模式匹配算法后,我得到了 r[0]=obj_index, r[1]=p0 index, r[2]=p1 index of object。现在我试图做的是可视化和检查当前分析的对象中存在哪些像素wrt先前保存的对象。这里的输出如下:

hello 150492    150336  -150180 -150336
4.51763e+10 873 4.52274e+10 873

标签: c++geometry

解决方案


推荐阅读