因為是近似的可能有誤差,我沒證明。
數學原理:
一.假設出上下兩面四邊形八個點
二.先把上下兩個面點的高平均
三.用海龍公式求出四邊形等於兩個三角形加起來
四.梯形公式上底加下底乘高把體積算出來

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;
}

讓地獄深紅的天亮 發表在 痞客邦 PIXNET 留言(0) 人氣()