【模板】【计几】圆的反演
emm感觉圆的反演是一个很有趣的东西,而且也并没有那么高大上,其实就是一个图形映射到另一个图形而已。
参考博客:https://www.cnblogs.com/NineSwords/p/9225187.html
四点:
1、过反演中心的圆,反形(经过反演之后的图形)为不过反演中心的直线。
2、不过反演中心的直线,反形为过反演中心的圆。
3、不过反演中心的圆,反形也为不过反演中心的圆,并且反演中心为这两个互为反形的圆的位似中心。
4、相切两圆的反象仍相切,若切点恰是反演中心,则其反象为两平行线。
5、相离的两圆反演(反演中心不在圆上)后仍然相离;两圆相切,若反演中心在某圆上,则为反形为相切的直线与圆。
1 Point Point_Inver(Circle c0,Point P){ 2 Point OP = P - c0.o; 3 double len = dis(c0.o,P); 4 len = len*len; 5 return c0.o + OP*( c0.r * c0.r / len ); 6 } 7 Circle Circle_Inver(Circle c0,Circle a){ 8 Circle res; 9 Point OA = a.o - c0.o; 10 double len = dis(a.o,c0.o); 11 Point up = c0.o + OA * ( ( len + a.r) / len ); 12 Point down = c0.o + OA *( (len - a.r) / len ); 13 up = Point_Inver(c0,up); 14 down = Point_Inver(c0,down); 15 res.o = (up+down) * 0.5; 16 res.r = dis(up,down) * 0.5; 17 return res; 18 } 19 Circle Line_Inver(Circle c0,Point a,Point b){ 20 Circle res; 21 double d = fabs( cross(a,c0.o,b) / dis(a,b)); 22 res.r = c0.r * c0.r / (2.0 * d); 23 24 double len = dot(a,b,c0.o) / dis(a,b); 25 Point AB = b - a; 26 Point c = a + AB * (len/dis(a,b)); 27 Point CO = c - c0.o; 28 res.o = c0.o + CO * (res.r/d); 29 30 //double len = dis(a,c[1].o); 31 //res.o = c0.o + (a-c[1].o) * (res.r/len); 32 return res; 33 }