【发布时间】: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)。您最终会得到一个等效的整体方程,但没有渐近线。