- UID
- 5511
- 积分
- 2061
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-5-23
- 最后登录
- 1970-1-1
|
发表于 2004-8-8 21:06:27
|
显示全部楼层
鱼,我找到啦,呵呵~~~~可惜不会C++,只能慢慢猜算法再改VBA啦
//截面几何特性计算类
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <math.h>
class cross //截面类
{
class nodexy //边界点
{
public:
int i;
float x,y; //点坐标
nodexy *next;
nodexy(int m)
{
i=m;
x=0.0;
y=0.0;
next=NULL;
}
};
int n; //边界点总数
nodexy *head; //边界点链
float Xmin;int ixi;
float Xmax;int ixa;
float Ymin;int iyi;
float Ymax;int iya;
float A; //横截面面积
float X0; //形心坐标X
float Y0; //形心坐标Y
float Sx; //静矩
float Sy; //静矩
float Ix; //惯性矩
float Iy; //惯性矩
float Ko; //上核心距
float Ku; //下核心距
public:
void createnodexy(int);
void nodevaluein(char *);
nodexy *nodevalue(int);
void getproperty();
void show();
void getboundarynode();
cross(int i,char *data)
{
n=i;
createnodexy(i);
nodevaluein(data);
getboundarynode();
getproperty();
}
};
void cross::createnodexy(int m)
{
int i;
nodexy *p;
p=head=new nodexy(1);
for(i=2;i<=m;i++)
{
p->next=new nodexy(i);
p=p->next;
}
}
void cross::nodevaluein(char *data)
{
int i,j;
FILE *file=fopen(data,"rb");
if(file==NULL) cout<<"fail\n";
float x,y;
char num[10],tmp;
for(i=1;i<=n;i++)
{
//READ data
for(j=0;;j++)
{
if((tmp=fgetc(file))==',') {num[j]=0;break;}
num[j]=tmp;
}
x=(float)atof(num);
for(j=0;;j++)
{
if((tmp=fgetc(file))==0x0d) {num[j]=0;fgetc(file);break;}
num[j]=tmp;
}
y=(float)atof(num);
nodevalue(i)->x=x;
nodevalue(i)->y=y;
}
fclose(file);
}
cross::nodexy *cross::nodevalue(int m)
{
int i;
nodexy *p=head;
if(m>n) return NULL;
for(i=1;i<m;i++)
p=p->next;
return p;
}
void cross::getboundarynode()
{
float xin,yin;
int i;
Xmax=Xmin=nodevalue(1)->x;
Ymax=Ymin=nodevalue(1)->y;
ixa=ixi=iya=iyi=1;
for(i=1;i<n;i++)
{
xin=nodevalue(i)->x;
yin=nodevalue(i)->y;
if(xin>Xmax) {Xmax=xin;ixa=i;}
if(xin<Xmin) {Xmin=xin;ixi=i;}
if(yin>Ymax) {Ymax=yin;iya=i;}
if(yin<Ymin) {Ymin=yin;iyi=i;}
}
}
void cross::getproperty()
{
int i;
float tmp=0.0,A0=0.0,Sex=0.0,Sey=0.0,Iex=0.0,Iey=0.0;
float xi,yi,xj,yj;
for(i=1;i<=n-1;i++)
{
xi=nodevalue(i)->x;
yi=nodevalue(i)->y;
xj=nodevalue(i+1)->x;
yj=nodevalue(i+1)->y;
tmp=(xi*yj-xj*yi)/2;
A0+=tmp;
Sex+=tmp*(yi+yj)/3;
Sey+=tmp*(xi+xj)/3;
Iex+=tmp*(yi*yi+yi*yj+yj*yj)/6;
Iey+=tmp*(xi*xi+xi*xj+xj*xj)/6;
}
A=A0;
Sx=Sex;
Sy=Sey;
X0=Sy/A;
Y0=Sx/A;
Ix=Iex-A*Y0*Y0;
Iy=Iey-A*X0*X0;
Ko=Ix/(Y0-Ymin)/A;
Ku=Ix/(Ymax-Y0)/A;
}
void cross::show()
{
cout<<"A="<<A<<endl;
cout<<"X0="<<X0<<endl;
cout<<"Y0="<<Y0<<endl;
cout<<"Sx="<<Sx<<endl;
cout<<"Sy="<<Sy<<endl;
cout<<"Ix="<<Ix<<endl;
cout<<"Iy="<<Iy<<endl;
cout<<"Ko="<<Ko<<endl;
cout<<"Ku="<<Ku<<endl;
cout<<"Xmax="<<Xmax<<endl;
cout<<"Xmin="<<Xmin<<endl;
cout<<"Ymax="<<Ymax<<endl;
cout<<"Ymin="<<Ymin<<endl;
} |
|