求多边形形心坐标算法 已知多边形的各顶点坐标(X,Y),如何计算形心坐标? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://course.bitsde.com/tt/normal/cllx/kjzt/clkc/fulu/tm02/tm02.htm /* 求任意简单多边形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[i]; 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;} // 求凸多边形的重心,要求输入多边形按逆时针排序 POINT gravitycenter(int vcount,POINT polygon[]){ POINT tp; double x,y,s,x0,y0,cs,k; x=0;y=0;s=0; for(int i=1;i<vcount-1;i++) { x0=(polygon[0].x+polygon[i].x+polygon[i+1].x)/3; y0=(polygon[0].y+polygon[i].y+polygon[i+1].y)/3; //求当前三角形的重心 cs=multiply(polygon[i],polygon[i+1],polygon[0])/2; //三角形面积可以直接利用该公式求解 if(abs(s)<1e-20) { x=x0;y=y0;s+=cs;continue; } k=cs/s; //求面积比例 x=(x+k*x0)/(1+k); y=(y+k*y0)/(1+k); s += cs; } tp.x=x; tp.y=y; return tp;} 请问:使用CTabCtrl,当标签达到一定的数量或父窗口缩小时,如何重绘滚动按钮? 虚拟列表控件的用法疑问 难道要把所有显示数据保存? 关于读取EXCEL数据问题 QQ登录界面中软键盘是怎么实现的? 求助:图标显示问题 如何创建对象数组? 关于函数调用的问题 继承Cwnd类,Create一个子窗口,但子窗口闪一下就没了 28分!Driver Studio 2.01的注册码!!!!!!!!! 关于winsock的一个问题,比较菜,答着有分 200分寻找高手解答 请教:再次请教密码框屏蔽“粘贴”功能的问题。立即结帐,谢谢!
需要调用下面几个函数:
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[i];
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;
}
POINT gravitycenter(int vcount,POINT polygon[])
{
POINT tp;
double x,y,s,x0,y0,cs,k;
x=0;y=0;s=0;
for(int i=1;i<vcount-1;i++)
{
x0=(polygon[0].x+polygon[i].x+polygon[i+1].x)/3;
y0=(polygon[0].y+polygon[i].y+polygon[i+1].y)/3; //求当前三角形的重心
cs=multiply(polygon[i],polygon[i+1],polygon[0])/2;
//三角形面积可以直接利用该公式求解
if(abs(s)<1e-20)
{
x=x0;y=y0;s+=cs;continue;
}
k=cs/s; //求面积比例
x=(x+k*x0)/(1+k);
y=(y+k*y0)/(1+k);
s += cs;
}
tp.x=x;
tp.y=y;
return tp;
}