因為是近似的可能有誤差,我沒證明。
數學原理:
一.假設出上下兩面四邊形八個點
二.先把上下兩個面點的高平均
三.用海龍公式求出四邊形等於兩個三角形加起來
四.梯形公式上底加下底乘高把體積算出來
double TrangleArea(double a, double b, double c)
{
double s = (a+b+c)*0.5;
return sqrt(s*(s-a)*(s-b)*(s-c));
}
double Distance(double *p1, double *p2)
{
double p[3];
for (int i=0;i<3;i++)
p[i]= p1[i]-p2[i];
return sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);
}
double TrangleArea(double *p1, double *p2, double *p3)
{
double a, b, c;
a = Distance(p1, p2);
b = Distance(p2, p3);
c = Distance(p1, p3);
return TrangleArea(a, b, c);
}
double QuadrilateralArea(double *p1, double *p2, double *p3, double *p4)
{
return TrangleArea(p1, p2, p3) + TrangleArea(p3, p4, p1);
}
double ColumnVolumeOf2Quadrilateral(double *p1, double *p2, double *p3, double *p4, double *p5, double *p6, double *p7, double *p8)
{
double up_y = (p1[2]+p2[2]+p3[2]+p4[2])*0.25;
double down_y = (p5[2]+p6[2]+p7[2]+p8[2])*0.25;
double pa[8][3];
memcpy(pa[0], p1, sizeof(double)*3);
memcpy(pa[1], p2, sizeof(double)*3);
memcpy(pa[2], p3, sizeof(double)*3);
memcpy(pa[3], p4, sizeof(double)*3);
memcpy(pa[4], p5, sizeof(double)*3);
memcpy(pa[5], p6, sizeof(double)*3);
memcpy(pa[6], p7, sizeof(double)*3);
memcpy(pa[7], p8, sizeof(double)*3);
for (int i=0;i < 4;i++)
pa[i][2] = up_y;
for (int i=4;i < 8;i++)
pa[i][2] = down_y;
double up_area = QuadrilateralArea(pa[0], pa[1], pa[2], pa[3]),
down_area = QuadrilateralArea(pa[4], pa[5], pa[6], pa[7]);
double height = fabs(up_y-down_y);
return (up_area+down_area)*height*0.5;
}