| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3178 人关注过本帖
标题:[求助]四边形是三角形面积的4倍(怎样验证)
只看楼主 加入收藏
pangxigua
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2006-6-29
收藏
得分:0 
我下去研究研究,嘿嘿,不知道可以搞定不.
2006-06-29 15:49
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

/*
AC中点M,BD中点N,BA、CD延长后交于R
验证area(ABCD)==4*area(RMN)
*/

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef struct
{
double x;
double y;
} Point;

#define a P[0]
#define b P[1]
#define c P[2]
#define d P[3]

double area_of_triangle(Point A,Point B,Point C)
{
double area=0;
/* ...... */
return area;
}

int ok(Point *p)
{ /*检测是否平行四边形,若是返回0*/

return 1;
}

main()
{
char pname[]="ABCD",*p=pname;
Point m,n,r,P[4],*PP=P;
double abcd,rmn;
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,"\ninvalid input...\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);

/*这里计算△RMN的面积*/
rmn = area_of_triangle(r,m,n);

/*这里是二者相除,看它是否非常接近于4.00*/
printf("as a result\nABCD : RMN = %4.2f\n",abcd/rmn);

}

[此贴子已经被作者于2006-6-29 20:23:27编辑过]


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-29 16:15
cordier
Rank: 2
等 级:论坛游民
威 望:1
帖 子:449
专家分:14
注 册:2006-2-9
收藏
得分:0 
四个点应当还要再排除
三点共线的可能吧。

2006-06-29 16:40
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

/*
AC中点M,BD中点N,BA、CD延长后交于R
验证area(ABCD)==4*area(RMN)
*/

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define EPS 1e-10

typedef struct
{
double x;
double y;
} Point;

#define a P[0]
#define b P[1]
#define c P[2]
#define d P[3]

/*两点之间的几何长度*/
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=0;
/*已经快要成功啦*/
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;
}

main()
{
char pname[]="ABCD",*p=pname;
Point m,n,r,P[4],*PP=P;
double abcd,rmn;
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,"\ninvalid input...\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);

/*这里计算△RMN的面积*/
rmn = area_of_triangle(r,m,n);

/*这里是二者相除,看它是否非常接近于4.00*/
printf("as a result\nABCD : RMN = %4.2f\n",abcd/rmn);

}

[此贴子已经被作者于2006-6-29 20:21:06编辑过]


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-29 16:48
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

/*
AC中点M,BD中点N,BA、CD延长后交于R
验证area(ABCD)==4*area(RMN)
*/

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define EPS 1e-10

typedef 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
*/

[此贴子已经被作者于2006-6-30 10:33:53编辑过]


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-29 17:30
pangxigua
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2006-6-29
收藏
得分:0 
谢谢斑竹啦!完全可以了!
555,C语言挂了,重修```
2006-07-01 08:55
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
回复:(pangxigua)谢谢斑竹啦!完全可以了!555,C语言...
以下是引用pangxigua在2006-7-1 8:55:15的发言:
谢谢斑竹啦!完全可以了!
555,C语言挂了,重修```

希望广大大学生朋友不要被
文凭有用·知识无用的浊浪
颠覆了自己的一叶扁舟!!!

毛泽东说过:
真理有时掌握在少数人手中!
反潮流是马列主义的一个原则。

逆向思维才是有价值的个性


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-07-01 09:12
pangxigua
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2006-6-29
收藏
得分:0 

呵呵,真向斑竹学了不少啊,以后多到这个坛子来学习,请大家关照哦 !!!
斑竹我QQ 83130105,以后多象向你请教!

2006-07-01 09:29
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
这道平面几何题引发的思考

1。自由度?表面上看似乎等于8,因为四边形的4个
顶点的(x,y)坐标几乎看不出相互间有什么制约。
其实据我研究从验证命题的角度只有4个自由度。
为什么?平移不会改变命题的真值,8减去2得6。
旋转不会改变命题的真值,6再减1得5。尺寸的
大小不会改变命题的真值,5再减1得4。
2。怎样用活这四个自由度呢?我的见解是
⑴“不在一直线上的仨点确定一个圆”,所以不失
一般性,不妨将四边形头三个顶点定格在单位圆上
何以取单位圆?因为尺寸大小不会改变命题的真值
⑵ 最后1个顶点当然不见得在圆周上因此需要开销
两个自由度,(x,y)或(ρ,θ)
⑶ 咋一看,似乎3+2=5需要五个自由度。实际上
如前所述,既然旋转不会改变命题的真值,故默认
四边形第1个顶点不仅在单位圆上且方位角θ=0度!
⑷ 归纳起来,作出如下结论:为了减少不必要的
验证工作量,本几何命题的验证程序的输入数据除
顶点A的方位角等于零以外,其余应为:①第2个顶
点B的方位角②第3个顶点C的方位角③第4个顶点D
的方位角;④第4个顶点D到单位圆心的距离,注意
不能让顶点D成为△ABC的内点

--------------------------------------------
做完一道编程题,尽可能地引伸一下,看看有没有
值得回味的地方、进一步探讨的地方?这或许就是
“高手”与“菜鸟”不太一样的地方。

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-07-01 10:23
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-13 08:05
快速回复:[求助]四边形是三角形面积的4倍(怎样验证)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037842 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved