c语言课程设计关于四边形证明
对于任意的四边形ABCD对角线AC与BD的中点分别是M、N,AB、CD的延长线交于R。验证三角形RMN的面积是四边形ABCD面积的四分之一。...
对于任意的四边形ABCD对角线AC与BD的中点分别是M、N,AB、CD的延长线交于R。验证三角形RMN的面积是四边形ABCD面积的四分之一。
展开
2013-11-20
展开全部
/*
AC中点M,BD中点N,BA、CD延长后交于R
验证area(ABCD)==4*area(RMN)
*/#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define EPS 1e-10typedef struct
{
double x;
double y;
} Point;/*两点之间的直线距离*/
double length(Point *A,Point *B)
{
return sqrt(pow(A->x-B->x,2)+pow(A->y-B->y,2));
}double area_of_triangle(Point A,Point B,Point C)
{
double area,a,b,c,p;
a=length(&B,&C);
b=length(&C,&A);
c=length(&A,&B);
p=(a+b+c)/2;
area=sqrt(p*(p-a)*(p-b)*(p-c));
return area;
}/*初步检测四边形*/
int ok(Point *p)
{
double side[4];/*4边长*/
int i,j;
for(i=0;i<4;i++)
{
double t;
j=(i+1)%4;
t=length(&p[i],&p[j]);
if(fabs(t)<EPS)return 0; /*不允许有重合在一起的点*/
side[i]=t;
}
{
double k1,k2;/*斜率*/
k1=(p[1].y-p[0].y)/(p[1].x-p[0].x);
k2=(p[3].y-p[2].y)/(p[3].x-p[2].x);
if(fabs(k2-k1)<EPS)
return 0; /*不允许AB与CD近乎平行*/
}return 1;
}#define a P[0]
#define b P[1]
#define c P[2]
#define d P[3]main()
{
char pname[]="ABCD",*p=pname;
Point m,n,r,P[4],*PP=P;
double abcd,rmn,abcd1;
while(*p)
{
printf("input (x,y) of point %c:",*p);
scanf("%lf%*c%lf",&PP->x,&PP->y);
p++;PP++;
} /*至此得到四边形的4个顶点的坐标*/ if(!ok(P))/*如果AB//CD则无法相交只好退出*/
{
fprintf(stderr,"invalid input...\n\n");
exit(1); /*异常结束1*/
}/*推算M、N两个“中点”的坐标*/
m.x = (a.x+c.x)/2;
m.y = (a.y+c.y)/2;
n.x = (b.x+d.x)/2;
n.y = (b.y+d.y)/2;/*这里计算BA与CD延长后的交点坐标*/
{
double cdx,cdy,abx,aby,dax,day, del,du,dv;
cdx = c.x-d.x;
cdy = c.y-d.y;
abx = a.x-b.x;
aby = a.y-b.y;
dax = d.x-a.x;
day = d.y-a.y;
del = cdx*aby-cdy*abx;
du = dax*aby-day*abx;
dv = cdx*day-cdy*dax;
du /= del;
dv /= del;
r.x = d.x-du*cdx;
r.y = d.y-du*cdy;
}/*这里计算四边形ABCD的面积*/
abcd = area_of_triangle(a,b,c) + area_of_triangle(a,d,c);
/*补充检测四边形,看它的凹凸性*/
abcd1= area_of_triangle(a,b,d) + area_of_triangle(b,d,c);
if(fabs(abcd1-abcd)>EPS)
{
fprintf(stderr,"凹四边形!不行!\n\n");
exit(2); /*异常结束2*/
}/*这里计算△RMN的面积*/
rmn = area_of_triangle(r,m,n);/*这里是二者相除,看它是否非常接近于4.00*/
printf("as a result\nABCD:RMN=%4.2f:%4.2f=%4.2f\n"
,abcd,rmn,abcd/rmn);}/*运行情况举例
input (x,y) of point A:0,0
input (x,y) of point B:2,0
input (x,y) of point C:1.5,1.5
input (x,y) of point D:0.5,1
as a result
ABCD:RMN=1.87:0.47=4.00
Press any key to continue
*/
参考于: http://bbs.bccn.net/thread-75642-2-1.html
AC中点M,BD中点N,BA、CD延长后交于R
验证area(ABCD)==4*area(RMN)
*/#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define EPS 1e-10typedef struct
{
double x;
double y;
} Point;/*两点之间的直线距离*/
double length(Point *A,Point *B)
{
return sqrt(pow(A->x-B->x,2)+pow(A->y-B->y,2));
}double area_of_triangle(Point A,Point B,Point C)
{
double area,a,b,c,p;
a=length(&B,&C);
b=length(&C,&A);
c=length(&A,&B);
p=(a+b+c)/2;
area=sqrt(p*(p-a)*(p-b)*(p-c));
return area;
}/*初步检测四边形*/
int ok(Point *p)
{
double side[4];/*4边长*/
int i,j;
for(i=0;i<4;i++)
{
double t;
j=(i+1)%4;
t=length(&p[i],&p[j]);
if(fabs(t)<EPS)return 0; /*不允许有重合在一起的点*/
side[i]=t;
}
{
double k1,k2;/*斜率*/
k1=(p[1].y-p[0].y)/(p[1].x-p[0].x);
k2=(p[3].y-p[2].y)/(p[3].x-p[2].x);
if(fabs(k2-k1)<EPS)
return 0; /*不允许AB与CD近乎平行*/
}return 1;
}#define a P[0]
#define b P[1]
#define c P[2]
#define d P[3]main()
{
char pname[]="ABCD",*p=pname;
Point m,n,r,P[4],*PP=P;
double abcd,rmn,abcd1;
while(*p)
{
printf("input (x,y) of point %c:",*p);
scanf("%lf%*c%lf",&PP->x,&PP->y);
p++;PP++;
} /*至此得到四边形的4个顶点的坐标*/ if(!ok(P))/*如果AB//CD则无法相交只好退出*/
{
fprintf(stderr,"invalid input...\n\n");
exit(1); /*异常结束1*/
}/*推算M、N两个“中点”的坐标*/
m.x = (a.x+c.x)/2;
m.y = (a.y+c.y)/2;
n.x = (b.x+d.x)/2;
n.y = (b.y+d.y)/2;/*这里计算BA与CD延长后的交点坐标*/
{
double cdx,cdy,abx,aby,dax,day, del,du,dv;
cdx = c.x-d.x;
cdy = c.y-d.y;
abx = a.x-b.x;
aby = a.y-b.y;
dax = d.x-a.x;
day = d.y-a.y;
del = cdx*aby-cdy*abx;
du = dax*aby-day*abx;
dv = cdx*day-cdy*dax;
du /= del;
dv /= del;
r.x = d.x-du*cdx;
r.y = d.y-du*cdy;
}/*这里计算四边形ABCD的面积*/
abcd = area_of_triangle(a,b,c) + area_of_triangle(a,d,c);
/*补充检测四边形,看它的凹凸性*/
abcd1= area_of_triangle(a,b,d) + area_of_triangle(b,d,c);
if(fabs(abcd1-abcd)>EPS)
{
fprintf(stderr,"凹四边形!不行!\n\n");
exit(2); /*异常结束2*/
}/*这里计算△RMN的面积*/
rmn = area_of_triangle(r,m,n);/*这里是二者相除,看它是否非常接近于4.00*/
printf("as a result\nABCD:RMN=%4.2f:%4.2f=%4.2f\n"
,abcd,rmn,abcd/rmn);}/*运行情况举例
input (x,y) of point A:0,0
input (x,y) of point B:2,0
input (x,y) of point C:1.5,1.5
input (x,y) of point D:0.5,1
as a result
ABCD:RMN=1.87:0.47=4.00
Press any key to continue
*/
参考于: http://bbs.bccn.net/thread-75642-2-1.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-11-20
展开全部
对于任意四边形里的平行四边形,RMN的面积为零,好的,不用证了,结论错误。呵呵,如果在抛开一些人为因素,站在理解你意思的角度上考虑的话,我用我学的,找不到一个类去实现…回答完毕,望楼主采纳…
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-11-20
展开全部
帖个100面值的RMB上去。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-11-20
展开全部
先写出 数学公式, 怎么证明? 流程图。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询