题解完全参考的AekdyCoin牛、lishi牛和盾哥的题解,具体方法见这些人的文章,这里不罗嗦了
这里记几个值得一提的细节
1.叉积求面积记得除以2,还有扇形面积公式S = r^2 * p / 2,p是圆心角(弧度),刚好也要除以2
2.判好两个圆完全相同的情况,我用的是一个标记数组表示i有没有曾经被包含过,这个包含的意义是要取等号的,也就是说两个完全相同的圆,出现在前面的那个会被判为被包含,后面那个则不会
3.当区间跨极角的边界时,我的做法是拆成两个区间
4.我的两圆求交点的方法,如图:
将O1当做极点,先求出O2的极角,再用余弦定理求出角AO1O2,然后就能得到A的极角,由于r1已知,所以可以根据极角求出A的坐标,另外一个交点类似。由于实际上我们需要求的是“有向线段”,所以用这个方法就能很方便的直接确定这条边的方向——由减去角AO1O2的指向加上的。但是这个方法由于有反三角函数的使用,所以精度不怎么样,需要用精度高的extended才能达到6位精度的要求
另外,这个算法实际上是很好实现的,我的代码100行左右
Ps:调试几何题有个画图器真是爽啊!