用拓朴学方法证明欧拉公式
尝欧拉公式:对于任意多面体(即各面都是平面多边形并且没有洞的立体),假 设F,E和V分别表示面,棱(或边),角(或顶)的个数,那么
F-E+V=2。试一下用拓朴学方法证明关于多面体的面、棱、顶点数的欧拉公式。
证明 :
(1)把多面体(图中①)看成表面是薄橡皮的中空立体。
(2)去掉多面体的一个面,就可以完全拉开铺在平面上而得到一个平面中的直线形,像图中②的样子。假设F′,E′和V′分别表示这个平面图形的(简单)多边形、边和顶点的个数,我们只须证明F′-E′+V′=1。
(3)对于这个平面图形,进行三角形分割,也就是说,对于还不是三角形的多边形陆续引进对角线,一直到成为一些三角形为止,像图中③的样子。每引进一条对角线,F′和E′各增加1,而V′却不变,所以F′-E′+V′不变。因此当完全分割成三角形的时候,F′-E′+V′的值仍然没有变。有些三角形有一边或两边在平面图形的边界上。
(4)如果某一个三角形有一边在边界上,例如图④中的△ABC,去掉这个三角形的不属于其他三角形的边,即AC,这样也就去掉了△ABC。这样F′和E′各减去1而V′不变,所以F′-E′+V′也没有变。
(5)如果某一个三角形有二边在边界上,例如图⑤中的△DEF,去掉这个三角形的不属于其他三角形的边,即DF和EF,这样就去掉△DEF。这样F′减去1,E′减去2,V′减去1,因此F′-E′+V′仍没有变。
(6)这样继续进行,直到只剩下一个三角形为止,像图中⑥的样子。这时F′=1,E′=3,V′=3,因此F′-E′+V′=1-3+3=1。
(7)因为原来图形是连在一起的,中间引进的各种变化也不破坏这事实,因此最后图形还是连在一起的,所以最后不会是分散在向外的几个三角形,像图中⑦那样。
(8)如果最后是像图中⑧的样子,我们可以去掉其中的一个三角形,也就是去掉1个三角形,3个边和2个顶点。因此F′-E′+V′仍然没有变。
即F′-E′+V′=1
成立,于是欧拉公式:
F-E+V=2
得证。
#include
#include
#define PI acos(-1)
// 直角坐标
struct RectangularCoordinate
{
// 实部和虚部
double real,imaginary;
};
// 极坐标
struct PolarCoordinates
{
double z;
// 弧度制
double phi;
};
// 直角坐标转换为极坐标
struct PolarCoordinates transRectangularToPolar(struct RectangularCoordinate rc)
{
struct PolarCoordinates pc ;
pc.z = sqrt(rc.real*rc.real + rc.imaginary*rc.imaginary);
// 对于 实部为零 要特殊处理
if(rc.real == 0.0)
{
/*
在 实部 为零的情况下:
若 虚部 为正数 θ = 90° (π/2 );
若 虚部 为负, 则 θ = 270° (3π/2 ).
*/
pc.phi = (rc.imaginary > 0.0) ? PI/2 : 3*PI/2;
}
else
{
pc.phi = atan(rc.imaginary/rc.real);
}
return pc;
}
// 极坐标转换为直角坐标
struct RectangularCoordinate transPolarToRectangular(struct PolarCoordinates pc)
{
struct RectangularCoordinate rc ;
rc.real = pc.z * cos(pc.phi);
rc.imaginary = pc.z * sin(pc.phi);
return rc;
}
int main(int argc, char *argv[])
{
struct RectangularCoordinate rc = {3,4};
struct PolarCoordinates pc;
pc = transRectangularToPolar(rc);
printf("直角坐标(%lf + %lfi) 转换为极坐标:(%lf∠%lf)\n",rc.real,rc.imaginary,pc.z,(180*pc.phi/PI));
rc = transPolarToRectangular(pc);
printf("极坐标(%lf∠%lf) 转换为直角坐标:(%lf + %lfi)\n",pc.z,(180*pc.phi/PI),rc.real,rc.imaginary);
return 0;
}
/*
直角坐标(3.000000 + 4.000000i) 转换为极坐标:(5.000000∠53.130102)
极坐标(5.000000∠53.130102) 转换为直角坐标:(3.000000 + 4.000000i)
*/
#include
#include
void foo(int a, int b, float *z, float *phi)
{
float d, zeta;
d = sqrt(a * a + b * b);
zeta = atan(b / a); //对复数不太了解可能是a /b.
*z = d;
*phi = zeta;
}
int main(void)
{
int a = 3, b = 5;
float c, d;
foo(a, b, &c, &d);
printf("%.1f %.1f", c, d);
return 0;
}