正规的做法是找切点。三角形三个顶点分别对圆作切线,然后求切点(2个)。两圆之间也要求切点(4个)。
扯淡了这就。。麻烦的要命。。
下面是写了一半的代码。。
void process_circle(point p, point o, double r, point &intersect1, point &intersect2) { point vec; vec = o - p; double angle = asin(r*1.0 / sqrt(dist(p, o))); double scale = sqrt(1 - r*r / dist(p, o)); intersect1 = Rotate(vec, -angle, scale) + p; intersect2 = Rotate(vec, angle, scale) + p; return; } void process_two_circles(point o1, point o2, double r1, double r2, point &intersect1, point &intersect2, point &intersect3, point &intersect4) |
当然了,可以水过它,把圆离散化成点,构成1000边形,然后注意,周长不要直接两点的距离,最好还是采用它们之间围成的那段弧的长度来计算。不难得到如下代码,但是我实在找不到错误在哪里了。。
e- ?(x):-(x))<eps) + ], convex[number_of_devision * + ]; ? : -) : (ret > ? : -); ; ; i < n; i++) |