这是编程法官的问题。
在简历中,声明如下:
黑洞具有压倒性的引力,使得最近的恒星开始围绕它们旋转(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);
}
}
任何提示都表示赞赏。
答案 0 :(得分:2)
您需要的是更好的线条表示。我建议使用Ax + By + C = 0
形式,而不是使用线的斜率形式。然后,您找到系数A,B,C
。请注意,它们只能确定一个因素;例如,2A,2B,2C
也可以正常工作。
(如果有必要,可以使情况更明确的一种方法是仅允许C=1
或C=0 and B=1
或C=0 and B=0 and A=1
。但我认为不必要为了你的问题。)
在此表示中,所有线都在同一个基础上,因此您不必为垂直线设置特殊情况。
答案 1 :(得分:0)
在这些情况下,尝试获取&#34; y - y0&#34;多种因素的值,而不是除数。 希望这可以帮助。 任何更多提示都将是代码的精确实现,我想你不想要;)