【问题标题】:Given 4 points with 2 on different radius. Obtain the center of the circle给定 4 个点,其中 2 个在不同的半径上。获取圆心
【发布时间】:2015-07-29 20:42:44
【问题描述】:

这是编程裁判的问题。

在简历中,声明如下:

黑洞具有压倒性的引力,以至于最近的恒星开始围绕它们旋转 (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);
    }
}

感谢任何提示。

【问题讨论】:

  • 我认为您想将其标记为 C,而不是 C++。
  • 通过检查应该很容易避免除以 null 错误,但如果解决方案大部分有效并且您希望获得有关设计的反馈,那么这个问题可能更适合 Code Review
  • 您的方法对我来说似乎不错。为了避免渐近行为,我建议您从矢量角度而不是梯度角度考虑它(例如,平分线具有方向(-y,x)而不是梯度-y/x,并且可以通过这种方法找到交点:mathworld.wolfram.com/Line-LineIntersection.html)。您最终会得到一个等效的整体方程,但没有渐近线。

标签: c math


【解决方案1】:

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

(如果有必要,使情况更加明确的一种方法是只允许C=1C=0 and B=1C=0 and B=0 and A=1。但我认为这对于您的问题没有必要。)

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

【讨论】:

    【解决方案2】:

    在这种情况下,尝试将“y - y0”类型的值作为乘法因子,而不是作为除数。 希望这可以帮助。 更多提示将是代码的精确实现,我想你不想要;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 2014-05-12
      • 2018-09-08
      • 1970-01-01
      • 2021-04-09
      • 2014-01-12
      • 1970-01-01
      相关资源
      最近更新 更多