【模板】【计几】圆的反演

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 }
View Code

 

posted @ 2020-02-06 21:40  小布鞋  阅读(391)  评论(0编辑  收藏  举报