MyException - 我的异常网
当前位置:我的异常网» 数据结构与算法 » 怎么求六面体体积

怎么求六面体体积

www.MyException.Cn  网友分享于:2013-04-22  浏览:190次
求助:如何求六面体体积
给定八个点,求六面体体积,老师说有个公式,不过我真的没找到,我想用一个顶点然后把六面体划分成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)的符号,同号说明在同侧,异号则在异侧。

文章评论

60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
10个调试和排错的小建议
10个调试和排错的小建议
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
一个程序员的时间管理
一个程序员的时间管理
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
我的丈夫是个程序员
我的丈夫是个程序员
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
那些争议最大的编程观点
那些争议最大的编程观点
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员应该关注的一些事儿
程序员应该关注的一些事儿
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员的鄙视链
程序员的鄙视链
中美印日四国程序员比较
中美印日四国程序员比较
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
每天工作4小时的程序员
每天工作4小时的程序员
代码女神横空出世
代码女神横空出世
 程序员的样子
程序员的样子
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
我是如何打败拖延症的
我是如何打败拖延症的
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
漫画:程序员的工作
漫画:程序员的工作
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
编程语言是女人
编程语言是女人
程序员都该阅读的书
程序员都该阅读的书
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员必看的十大电影
程序员必看的十大电影
为什么程序员都是夜猫子
为什么程序员都是夜猫子
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员和编码员之间的区别
程序员和编码员之间的区别
鲜为人知的编程真相
鲜为人知的编程真相
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
旅行,写作,编程
旅行,写作,编程
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有