给出4个点,不同半径为2。获得圆的中心

时间:2015-07-29 20:42:44

标签: c math

这是编程法官的问题。

在简历中,声明如下:

  

黑洞具有压倒性的引力,使得最近的恒星开始围绕它们旋转(Example)。每颗受影响的恒星都保持恒定的角速度和距离黑洞的距离。给出了黑洞中2颗恒星的2个不同位置。你能给出黑洞的位置吗?

第一行输入的测试用例的数字 T (1≤T≤10000)。每个测试用例有4个点( X Y )( - 1000.0≤X,Y≤1000.0),分为4行;第一颗恒星的旧坐标,第二颗恒星的旧坐标,第一颗恒星的新坐标和第二颗恒星的新坐标。

输出由一条带黑洞坐标的线组成。

输入示例:

  

3
  12.00 2.00
  5.00 6.00
  10.00 8.00
  2.00 7.00
  0.50 -0.50
  -1.00 0.00
  -0.50 -0.50
  0.00 1.00
  0.50 6.50
  -10.50 -3.50
  -1.50 6.50
  -5.50 -8.50

输出示例:

  

2.00 2.00
  0.00 0.00
  -0.50 1.50

我的解决方案试图找到由两个恒星位置形成的垂直平分线相交的点。问题是,有时候,星座的y坐标差异为0,导致算法中除以0。还有其他解决方案吗?

#include <stdio.h>

typedef struct{
    double x,y;
}point_t;


int main(){
    point_t p1[2]; //p[0] is the old coordinate, p[1] is the new
    point_t p2[2];

    int n;
    scanf("%d",&n);

    //slope , b for the 2 perpendicular bisectors
    double m1,m2,b1,b2;

    //auxiliar points to store values for the formulas
    double x,x0,y,y0;
    for (int i = 0; i < n; ++i) {
        scanf("%lf %lf",&p1[0].x,&p1[0].y);
        scanf("%lf %lf",&p2[0].x,&p2[0].y);
        scanf("%lf %lf",&p1[1].x,&p1[1].y);
        scanf("%lf %lf",&p2[1].x,&p2[1].y);


        x0 = p1[0].x; 
        y0 = p1[0].y;
        x  = p1[1].x; 
        y  = p1[1].y;
        m1 = -((x-x0)/(y - y0)); // m = y - y0 / x - x0 >> bisector >>  m = x - x0 / y - y0

        x0 = p2[0].x; 
        y0 = p2[0].y;
        x  = p2[1].x; 
        y  = p2[1].y;
        m2 = - ((x-x0)/(y - y0));// m = y - y0 / x - x0 >> bisector >>  m = x - x0 / y - y0

        b1 = ((p1[0].y+p1[1].y)/2.0) - m1*((p1[0].x+p1[1].x)/2.0); // b = y - my >> x and y are the median points
        b2 = ((p2[0].y+p2[1].y)/2.0) - m2*((p2[0].x+p2[1].x)/2.0);// b = y - my >> x and y are the median points

        x = (b2-b1)/(m1 - m2);
        printf("%.2lf %.2lf\n",x, m1*x + b1);
    }
}

任何提示都表示赞赏。

2 个答案:

答案 0 :(得分:2)

您需要的是更好的线条表示。我建议使用Ax + By + C = 0形式,而不是使用线的斜率形式。然后,您找到系数A,B,C。请注意,它们只能确定一个因素;例如,2A,2B,2C也可以正常工作。

(如果有必要,可以使情况更明确的一种方法是仅允许C=1C=0 and B=1C=0 and B=0 and A=1。但我认为不必要为了你的问题。)

在此表示中,所有线都在同一个基础上,因此您不必为垂直线设置特殊情况。

答案 1 :(得分:0)

在这些情况下,尝试获取&#34; y - y0&#34;多种因素的值,而不是除数。 希望这可以帮助。 任何更多提示都将是代码的精确实现,我想你不想要;)