跪求:凹多边形形心算法(重心)

weir75034 2009-01-08 10:39:00
如题:小弟跪求凹多边形形心算法
形心:因为小弟所用多边形均为匀质多边形,所以形心即重心。
小弟晓得可以用微积分做,可是我想知道如何通过各顶点坐标去求形心。
望高手指点。。最好能贴出代码。。主要包括 槽型、I型、T型、双槽型。。
...全文
3008 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
bitterapricot 2011-09-11
  • 打赏
  • 举报
回复
可以拆分为三角形,按三角形公式计算各三角形的形心及惯性矩,再移轴.
neeestth 2009-01-09
  • 打赏
  • 举报
回复
怎么确定一个多边形是凸多边形?
星羽 2009-01-09
  • 打赏
  • 举报
回复
积分啊。。。。

up
joly_zl 2009-01-09
  • 打赏
  • 举报
回复
其实就是找重心的的问题。
1 如果这个多边形是关于x(或者y)对称得,那么可以找到重心的y(x坐标),y=(yLeft+yRight)/2
2 如果不是对称的,需要计算重心的x和y坐标
(1)计算x坐标,x坐标切割多边形的左右面积相等,找到x, 面积用积分公式
(2)计算x坐标,y坐标切割多边形的上下面积相等,找到y, 面积用积分公式
weir75034 2009-01-09
  • 打赏
  • 举报
回复
我上面贴出的算法是正确的,大家可以用,刚才程序其他地方有点问题。。嘻嘻。。不好意思。。
谢谢大家了。。
yaoyansi 2009-01-09
  • 打赏
  • 举报
回复
这种属于计算几何的问题,应该在一些开源的(计算几何)工具库里有吧.
http://www.cgal.org/

这里有更多的资料,http://www.realtimerendering.com/index.html#polytech
你可能只需要其中计算几何和算法相关的部分.

找到之后,请来这里汇报一下.
nullah 2009-01-09
  • 打赏
  • 举报
回复
up~~
weir75034 2009-01-09
  • 打赏
  • 举报
回复
没有人知道么?
我在网上找到如下代码,可是在计算槽形的形心时算出来的结果是错误的。。。
希望有高手可以解释一下这是什么原因,小弟感激不尽。。。

/* 求任意简单多边形polygon的重心
需要调用下面几个函数:
void AddPosPart(); 增加右边区域的面积
void AddNegPart(); 增加左边区域的面积
void AddRegion(); 增加区域面积
在使用该程序时,如果把xtr,ytr,wtr,xtl,ytl,wtl设成全局变量就可以使这些函数的形式得到化简,但要注意函数的声明和调用要做相应变化
*/
void AddPosPart(double x, double y, double w, double &xtr, double &ytr, double &wtr)
{
if (abs(wtr + w)<1e-10 ) return; // detect zero regions
xtr = ( wtr*xtr + w*x ) / ( wtr + w );
ytr = ( wtr*ytr + w*y ) / ( wtr + w );
wtr = w + wtr;
return;
}

void AddNegPart(double x, ouble y, double w, double &xtl, double &ytl, double &wtl)
{
if ( abs(wtl + w)<1e-10 )
return; // detect zero regions

xtl = ( wtl*xtl + w*x ) / ( wtl + w );
ytl = ( wtl*ytl + w*y ) / ( wtl + w );
wtl = w + wtl;
return;
}


void AddRegion ( double x1, double y1, double x2, double y2, double &xtr, double &ytr,
double &wtr, double &xtl, double &ytl, double &wtl )
{
if ( abs (x1 - x2)< 1e-10 )
return;

if ( x2 > x1 )

{
AddPosPart ((x2+x1)/2, y1/2, (x2-x1) * y1,xtr,ytr,wtr); /* rectangle 全局
变量变化处 */
AddPosPart ((x1+x2+x2)/3, (y1+y1+y2)/3, (x2-x1)*(y2-y1)/2,xtr,ytr,wtr);
// triangle 全局变量变化处
}
else
{
AddNegPart ((x2+x1)/2, y1/2, (x2-x1) * y1,xtl,ytl,wtl);
// rectangle 全局变量变化处
AddNegPart ((x1+x2+x2)/3, (y1+y1+y2)/3, (x2-x1)*(y2-y1)/2,xtl,ytl,wtl);
// triangle 全局变量变化处
}
}

POINT cg_simple(int vcount,POINT polygon[])
{
double xtr,ytr,wtr,xtl,ytl,wtl;
//注意: 如果把xtr,ytr,wtr,xtl,ytl,wtl改成全局变量后这里要删去
POINT p1,p2,tp;
xtr = ytr = wtr = 0.0;
xtl = ytl = wtl = 0.0;
for(int i=0;i<vcount;i++)
{
p1=polygon;
p2=polygon[(i+1)%vcount];
AddRegion(p1.x,p1.y,p2.x,p2.y,xtr,ytr,wtr,xtl,ytl,wtl); //全局变量变化处
}
tp.x = (wtr*xtr + wtl*xtl) / (wtr + wtl);
tp.y = (wtr*ytr + wtl*ytl) / (wtr + wtl);
return tp;
}
chenchangxiong 2009-01-09
  • 打赏
  • 举报
回复
首先你得知道一个多边形求面积的简单方法:
比如
a1,a2,...an
则定点a1, a2, a3组成一三角形
顺时针面积为正,逆时针为副
则S=|s123+s134+s145+.......+s1n-1n|
再则有两个已知中心的区域a,b
求两个区域合起来的方法
x=(Sa*Xa+Sb*Xb)/(Sa+Sb)
y类似
面积变为Sa+Sb
三角形重心及其面积应当很好解
不过对于楼主给的例子程序的做法看不太明白,变量真多
  • 打赏
  • 举报
回复
mark
weir75034 2009-01-09
  • 打赏
  • 举报
回复
最终还是不能理解自己找到的那几个函数的意思。。
有没有高人可以解释一下那几个函数呢?
neeestth 2009-01-09
  • 打赏
  • 举报
回复
多边形的中心

一个由 N 个顶点( xi , yi ) 确定的不自交闭多边形的中心能如下计算: [1]

记号 ( xN , yN )与顶点 ( x0 , y0 )相同。多边形的面积为:

A = \frac{1}{2}\sum_{i=0}^{N-1} (x_i\ y_{i+1} - x_{i+1}\ y_i)

多边形的中心由下式给出:

C_x = \frac{1}{6A}\sum_{i=0}^{N-1}(x_i+x_{i+1})(x_i\ y_{i+1} - x_{i+1}\ y_i)

C_y = \frac{1}{6A}\sum_{i=0}^{N-1}(y_i+y_{i+1})(x_i\ y_{i+1} - x_{i+1}\ y_i)
维基百科有个这样的公式,可以直接用不?
aaajj 2009-01-08
  • 打赏
  • 举报
回复
还是要微分啊

64,692

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧