首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

怎么求六面体体积

2012-04-21 
求助:如何求六面体体积给定八个点,求六面体体积,老师说有个公式,不过我真的没找到,我想用一个顶点然后把六

求助:如何求六面体体积
给定八个点,求六面体体积,老师说有个公式,不过我真的没找到,我想用一个顶点然后把六面体划分成6个四面体(以一个顶点依次划分不和这个点连接的面),现在我知道了四面体的体积CalculateVolume(point *points),但是如何定位八个点的位置?怎么写划分语句?
#include "StdAfx.h"

// console.cpp : 定义控制台应用程序的入口点。
//



// 计算四面体体积.cpp : Defines the entry point for the console application.
//


#include <iostream>
#include <cmath>

using namespace std;
typedef struct  
{
float x,y,z;
}point,vector;

vector ChaCheng(vector v1,vector v2)

{
vector result;
result.x=v1.y*v2.z-v2.y*v1.z;
result.y=v1.x*v2.z-v2.x*v1.z;
result.z=v1.x*v2.y-v2.x*v1.y;
return result;
}

float DianCheng(vector v1,vector v2)
{
float k;
k=v1.x*v2.x+v1.y*v2.y+v1.z*v2.z;
return k;
}

bool IsInPlan(point *points)
{
vector AB,AC,AD,temp1;
AB.x = (points[1].x-points[0].x) ;
AB.y = (points[1].y-points[0].y) ;
AB.z = (points[1].z-points[0].z) ;

AC.x = (points[2].x-points[0].x) ;
AC.y = (points[2].y-points[0].y) ;
AC.z = (points[2].z-points[0].z) ;

AD.x = (points[3].x-points[0].x) ;
AD.y = (points[3].y-points[0].y) ;
AD.z = (points[3].z-points[0].z) ;

temp1 = ChaCheng(AB,AC);

if (temp1.x*AD.x+temp1.y*AD.y+temp1.z*AD.z == 0)
{
return false;
}
else  
{
return true;
}
}


float CalculateVolume(point *points)
{
float STriangle=0,k=0;
vector BC,BD,S,BA;
BC.x=points[2].x-points[1].x;
BC.y=points[2].y-points[1].y;
BC.z=points[2].z-points[1].z;

BD.x=points[3].x-points[1].x;
BD.y=points[3].y-points[1].y;
BD.z=points[3].z-points[1].z;

BA.x=points[0].x-points[1].x;
BA.y=points[0].y-points[1].y;
BA.z=points[0].z-points[1].z;

S=ChaCheng(BC,BD);
k=DianCheng(S,BA);
STriangle =abs(k)/6;


return STriangle;

}
int _tmain(int argc, _TCHAR* argv[])
{
int i=0;
point points[4];
for (i=0;i <4;i++)
{
cout << "Input point["<<i<<"] Information : " <<endl;
cin>>points[i].x>>points[i].y>> points[i].z;
cout <<endl;
}
if (!IsInPlan(points))
{
cout << "The four points are in a plan. " <<endl;
}
cout <<CalculateVolume(points) <<endl;
getchar();
getchar();
return 0;
}
求大神帮帮忙。。

[解决办法]
确定是凸多面体,其实就好办了,其实凸多面体的体积计算可以有4面体分割法,也就是把这个多面体一块一块的削成4面体,直到最后只剩下一个4面体。最后把这些4面体的体积加起来,就是初始凸多面体的体积了。凸多面体的特征就是,相对于任何一个表面,其余多面体的顶点,都在这个面的同侧。假设8个多面体顶点为ABCDEFGH,从A点出发,另外7个点遍历,任意取2点,假设为P1P2,那么计算其余5个点与面AP1P2的位置关系,如果都在同侧,则记下,遍历之后可以找到几组(至少3组)这样 的P1P2,寻找恰好构成三角形的三组,也就是P1P2,P2P3,P3P1这样的(一定有),于是就可以分割一个四面体了,就是AP1P2P3,剩余的四面体变为P1P2P3外加其余的4个点,共7个点。继续前面的四面体分割,直到最后只剩下最后4个点。这样也就能算总体积了。
[解决办法]
三维空间上有序的四点A(x1,y1,z1),B(x2,y2,z2),C(x3,y3,z3),D(x4,y4,z4)定义面积矢量(行列式):
|x1 x2 x3 x4|
V(A,B,C,D) = |y1 y2 y3 y4|
|z1 z2 z3 z4|
| 1 1 1 1|
则四面体ABCD的体积就是|V(A,B,C,D)| / 6了。

V值若为0,说明4点共面了。
判断D和E是否在平面ABC的同侧,只要计算V(A,B,C,D)与V(A,B,C,E)的符号,同号说明在同侧,异号则在异侧。

热点排行