正规的做法是找切点。三角形三个顶点分别对圆作切线,然后求切点(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)
{
    point vec = o2 - o1;
    double angle = asin(fabs(r2 - r1) / sqrt(dist(o2, o1)));
    intersect1 = Rotate(o1, angle + (pi / 2), sqrt(dist(o2, o1)) / r1);
    intersect2 = Rotate(o1, -angle - (pi / 2), sqrt(dist(o2, o1)) / r1);
    point vec2 = o1 - o2;
}

当然了,可以水过它,把圆离散化成点,构成1000边形,然后注意,周长不要直接两点的距离,最好还是采用它们之间围成的那段弧的长度来计算。不难得到如下代码,但是我实在找不到错误在哪里了。。

e-
?(x):-(x))<eps)

+ ], convex[number_of_devision *  + ];

?  : -) : (ret >  ?  : -);
}
;
    ], i = ; i<n; p2.x += p[i].x, p2.y += p[i].y, i++)
        ], p[] = p1;
    qsort(p + , n - , ] = p[], ch[] = p[], ch[] = p[], s = i = ; i < n; ch[s++] = p[i++])
         && xmult(ch[s - ], p[i], ch[s - ]) < -eps; s--);
}

;
    ;
    ;
    ;
    ;
}

; i < n; i++)
        ) != ) p[k++] = p[i];
    , ){
    point* temp = ] = temp[], n = , i = (dir ?  : (s - )); dir ? (i < s) : i; i += (dir ?  : -))
        ], temp[i], temp[(i + )%s])))
            convex[n++] = temp[i];
     && m == )
        {
             * pi * r << endl;
            ;
        ; i < n; i++)
        {
             * pi / (number_of_devision);
            ; angle <= pi * ; angle += step)
            {
                p[counts].x = x + r * cos(angle);
                p[counts].y = y + r * sin(angle);
                p[counts].r = r;
                p[counts++].flag = ; i < m; i++)
        {
            , p[counts].flag = , p[counts].flag = , p[counts].flag = , p, convex, );
        ;
        ; i < size_of_convex; i++)
        {
            ].flag)
            {
                dis += ( * pi * convex[i].r) / number_of_devision;
                ]);
            ], convex[size_of_convex - ]);
        cout << fixed << setprecision() << dis << endl;
    }
}

最新文章

  1. 如何把Excel中的某列数值如何转换成文本格式,且兼容性最好?
  2. u3d avatar部件的理解
  3. Java多线程问题总结
  4. .net学习笔记---webconfig的读与写
  5. gradle大体内容
  6. Java系列:JVM指令详解(下)(zz)
  7. 【OpenStack】OpenStack系列1之Python虚拟环境搭建
  8. nodeschool.io 8
  9. JAVA 修改 JSESSIONID
  10. C语言undefined behaviour未定义行为
  11. Chrome for Android在Chromium代码库中的提交patch
  12. wchar_t 、UTF-8、UTF-16的转换方法 - luketty的专栏 - 博客频道 - CSDN.NET
  13. git容易被忽略的准备工作命令
  14. [html5] 学习笔记-表单新增的元素与属性(续)
  15. 【读书笔记】-- JavaScript模块
  16. PHP-day01
  17. Java的三种代理模式简述
  18. python 大数据处理小结
  19. django在centos部署
  20. 批量插入数据, 将DataTable里的数据批量写入数据库的方法

热门文章

  1. (ubuntu) pip install scandir 时出现错误 fatal error: Python.h: No such file or directory
  2. 数据库索引(Index)【未完待续】
  3. IO扩展控件(System.IO.Abstractions)
  4. zabbix通过jvm监控tomcat
  5. java File类 打印目录树状结构(递归)
  6. Mac OS X 更新JAMF域控配置
  7. python脚本实现ipv6的ddns功能
  8. Codeforces Round #113 (Div. 2) Tetrahedron(滚动DP)
  9. Cobol online program 传指针
  10. 【BZOJ 1036】【ZJOI 2008】树的统计Count