poj.org/problem?id=3285
思路:
对于圆心(xi,yi)半径ri的圆,观察角度为特定a的所有点分布在以(xi, yi)为圆心,半径为ri/sin(a/2)的圆上,所以题目就是求三个圆的交点,即满足下列方程的点(x,y)
(x-xi)*(x-xi)+(y-yi)*(y-yi)=(ri*k)*(ri*k) for i in {1,2,3}
三个方程消去k,会有两种情况
1. 如果ri==rj, 那么第i和第j个方程消去k后是个直线方程
2. 如果ri!=rj, 那么第i个和第j个方程消去k后会得到一个圆的方程
所以,最终需要计算的是三种可能的情况
1. 两条直线的交点
2. 一条直线和一个圆的交点
3. 两个圆的交点
实现
两直线的交点
char linexline(double a0, double b0, double c0, double a1, double b1, double c1) {
double d = a0*b1-b0*a1;
if (d<EPS&&d>-EPS) return 0;
rxx[0].x = (c0*b1-b0*c1)/d;
rxx[0].y = (a0*c1-c0*a1)/d;
return 1;
}
直线于圆的交点,(个人比较习惯点斜式直线方程,对于ax+by=c的方程,会转换为点斜式)
char linexcircle2(double x0, double y0, double dx0, double dy0, double x1, double y1, double r1) {