文章目录
笛卡尔定理
链接:笛卡尔定理-百度百科
- 定律定义:
若平面上四个半径为r1、r2、r3、r4的圆两两相切于不同点,则其半径满足以下结论:
- (1)若四圆两两外切,则 ( ∑ i = 1 4 1 r i ) 2 = 2 ∑ i = 1 4 1 r i 2 (\sum_{i=1}^4{\frac{1}{r_i}})^2=2\sum_{i=1}^4{\frac{1}{r_i^2}} (i=1∑4ri1)2=2i=1∑4ri21
- (2)若半径为r1、r2、r3的圆内切于半径为r4的圆中,则 ( 1 r 1 + 1 r 1 + 1 r 3 − 1 r 4 ) 2 = 2 ∑ i = 1 4 1 r i 2 (\frac{1}{r_1}+\frac{1}{r_1}+\frac{1}{r_3}-\frac{1}{r_4})^2=2\sum_{i=1}^4{\frac{1}{r_i^2}} (r11+r11+r31−r41)2=2i=1∑4ri21
- 定理推广:笛卡尔定理在三维坐标系中也有类似的结论:若五个球的半径是ri(1,2,…,5),满足任意一个球与其他四个球外切,则 ( ∑ i = 1 5 1 r i ) 2 = 3 ∑ i = 1 5 1 r i 2 (\sum_{i=1}^5{\frac{1}{r_i}})^2=3\sum_{i=1}^5{\frac{1}{r_i^2}} (i=1∑5ri1)2=3i=1∑5ri21
圆冥定理
圆幂定理是一个总结性的定理,是对相交弦定理、切割线定理及割线定理(切割线定理推论)以及它们推论的统一与归纳。 [1] 根据两条与圆有相交关系的线的位置不同,有以下定理:
- 相交弦定理:圆内的两条相交弦,被交点分成的两条线段长的积相等。
- 切割线定理:从圆外一点引圆的切线和割线,切线长是这点到割线与圆交点的两条线段长的比例中项。
- 割线定理:从圆外一点P引两条割线与圆分别交于A、B;C、D,则有PA·PB=PC·PD
从上述定理可以看出,两条线的位置从内到外,都有着相似的结论。经过总结和归纳,便得出了圆幂定理。
极点 & 极线
稍微了解了一点,不知道有什么用但是写下来吧。有好多性质都看不懂。
个人认为的极线的几何定义:
- 过平面上的某定点作二次曲线的割线(或切线),作二次曲线在割点(切点)的切线,两个切线的交点的轨迹所在直线就是极线,定点就称该极线的极点。
极点和极线的关系:
- 极点和极线是一一对应的。
延伸出的二次曲线的性质:
- 过平面上的某定点作二次曲线的割线(或切线),作二次曲线在割点(切点)的切线,两个切线的交点的轨迹所在直线就是极线。
- 过平面上的某定直线上的任意一点作二次曲线的切线,切点所在直线始终过定点(即极点)。
题目
HDU 6158 笛卡尔定理 + 韦达定理
题意:给定两两相切的三个圆,求第 k k k 个与这三个圆相切的圆的面积。
题解:- HDU 6158 The Designer【计算几何+笛卡尔定理+韦达定理】
-
思路:大致思想就是,已知我们有三个圆(其中有一个是外切圆)满足笛卡尔定理的第二个形式,那么我们根据等式,可以得到一个一元二次方程,方程的两个解就是外切圆内部与两个内圆外切的第四个圆的半径(有两种情况)。之后韦达定理迭代即可。
AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=3e6+10;
typedef long long LL;
const double eps = 1e-7;
const double pi = acos(-1);
double ans[N];
int main()
{
int t; scanf("%d", &t);
while(t--)
{
double r, R; int n;
double t ;
scanf("%lf %lf %d", &r, &R, &n);
if(r > R) swap(r, R);
ans[1] = R - r;
for(int i=1; i<= n/2 + 5; i++)
{
t = 2 * (1 / ans[i] + 1 / r - 1 / R);
if(i == 1) ans[2] = 2 / t;
else ans[i + 1] = 1 / (t - 1 / ans[i - 1]);
if(ans[i] < eps) break;
}
double res = pi * ans[1] * ans[1];
int cnt = 1;
for(int i=2; ans[i] < eps && cnt < n; i++)
{
if(n - cnt >= 2) cnt += 2, res += 2 * pi * ans[i] * ans[i];
else cnt++, res += pi * ans[i] * ans[i];
}
printf("%.5f\n",res);
}
system("pause");
return 0;
}
牛客 contest 553 Chino with Geometry
题解:圆冥定理