| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4519 人关注过本帖
标题:求解多边形的重心
只看楼主 加入收藏
xiayizhanzyf
Rank: 2
等 级:论坛游民
帖 子:80
专家分:78
注 册:2010-7-21
结帖率:84.62%
收藏
已结贴  问题点数:20 回复次数:20 
求解多边形的重心
基本算法如下,但不知main函数如何写
请各位高手速速给出解答,谢谢!
#include <iostream.h>
#include <math.h>
#include <iomanip.h>

struct point
{
double x;
double y;
};

//求多边形的重心算法
//说明:
//求多边形重心并不是简单的把求三角形的重心公式推广就行了
//我的算法是在平面上取一点(一般取原点, 这样可以减少很多计算, 而且使思路更清晰^_^)
//这样就得到了N个三角形OP[i]P[i+1](其中点的顺序要为逆时针的),
//分别求出这N个三角形的重心Ci和面积Ai(注意此处面积是又向面积, 就是用叉乘求面积时保留其正负号)
//在求出A = A1+A2+...+AN(同样保留正负号的代数相加)
//最终重心C = sigma(Ai+Ci)/A;
point gravity(point *p, int n)
{
double area = 0;
point center;
center.x = 0;
center.y = 0;

for (int i = 0; i < n-1; i++)
{
   area += (p[i].x*p[i+1].y - p[i+1].x*p[i].y)/2;
   center.x += (p[i].x*p[i+1].y - p[i+1].x*p[i].y) * (p[i].x + p[i+1].x);
   center.y += (p[i].x*p[i+1].y - p[i+1].x*p[i].y) * (p[i].y + p[i+1].y);
}

area += (p[n-1].x*p[0].y - p[0].x*p[n-1].y)/2;
center.x += (p[n-1].x*p[0].y - p[0].x*p[n-1].y) * (p[n-1].x + p[0].x);
center.y += (p[n-1].x*p[0].y - p[0].x*p[n-1].y) * (p[n-1].y + p[0].y);

center.x /= 6*area;
center.y /= 6*area;

return center;
}
   
各点如下:  
1    13.28    1.32
2    13.76    1.48
3    15.50    0.63
4    4.71    1.75
5    13.68    1.35
7    4.50    2.49
8    4.15    12.12
10    0.63    8.41
11    4.74    3.12
12    8.25    1.98
13    11.96    1.03
搜索更多相关主题的帖子: 多边形 重心 求解 
2010-08-19 16:53
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:2 
回复 楼主 xiayizhanzyf
汗 子程序都写了 主程序写不成了?晕呢

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-08-19 17:54
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:2 
我感觉这个算法似乎不对耶?御坂御坂挠着头

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-08-19 17:57
xiayizhanzyf
Rank: 2
等 级:论坛游民
帖 子:80
专家分:78
注 册:2010-7-21
收藏
得分:0 
拜托啦,急求
2010-08-19 18:30
rofor
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:68
专家分:165
注 册:2009-6-12
收藏
得分:2 
有偿帮你,QQ:1247142440

I'm rofor.
for(;;;);  :-)
RoFoR [AT] YaHoO [DoT] CN
2010-08-19 18:48
promising
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
帖 子:87
专家分:147
注 册:2009-8-31
收藏
得分:2 
回复 楼主 xiayizhanzyf
你物理专业啊,果然牛逼,想法就是不一样~~

解释下,为什么求重心不能直接把各点相加求平均值啊???
主函数可以这样啊~
#include<iostream.h>
void main()
{
    const n=10;
    int g[n];
    int i;
    for(i=0;i<n;i++)
        cin>>g[n];
    point ans=gravity(g,n);
    cout<<"重心是:"<<'('<<ans.x<<','<<ans.y<<')'<<endl;
}

[ 本帖最后由 promising 于 2010-8-20 09:10 编辑 ]

向前走着……
2010-08-20 00:37
xiayizhanzyf
Rank: 2
等 级:论坛游民
帖 子:80
专家分:78
注 册:2010-7-21
收藏
得分:0 
你的main函数貌似有错误,根据你的我改了一下,能运行了,但输出有点问题
2010-08-20 14:11
xiayizhanzyf
Rank: 2
等 级:论坛游民
帖 子:80
专家分:78
注 册:2010-7-21
收藏
得分:0 
我改后的代码为
void main()
{
    const n=1;
    point g[n];
    int i;
    for(i=0;i<n;i++)
    {
        cin>>g[i].x;
        cin>>g[i].y;
    }
    point ans=gravity(g,n);
    cout<<"重心是:"<<'('<<ans.x<<','<<ans.y<<')'<<endl;
}
2010-08-20 14:11
xiayizhanzyf
Rank: 2
等 级:论坛游民
帖 子:80
专家分:78
注 册:2010-7-21
收藏
得分:0 
ok,好了,调试成功,6楼,感谢你的帮助
2010-08-20 14:15
promising
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
帖 子:87
专家分:147
注 册:2009-8-31
收藏
得分:0 
回复 9楼 xiayizhanzyf

解释下:为什么求重心不能直接把各点坐标相加求平均值啊???从小到大我都是这么求的啊~~

向前走着……
2010-08-21 23:57
快速回复:求解多边形的重心
数据加载中...
 
   



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

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