programming-examples/c++/Computational_Geometry/C++ Program to Compute the Volume of a Tetrahedron Using Determinants.cpp

133 lines
3.7 KiB
C++
Raw Normal View History

2019-11-15 12:59:38 +01:00
/*This is a C++ Program to find the volume of tetrahedron.
Call the four vertices of the tetrahedron (a, b, c), (d, e, f), (g, h, i), and (p, q, r). Now create a 4-by-4 matrix in which the coordinate triples form the colums of the matrix, with a row of 1s appended at the bottom:
a d g p
b e h q
c f i r
1 1 1 1
The volume of the tetrahedron is 1/6 times the absolute value of the matrix determinant. For any 4-by-4 matrix that has a row of 1s along the bottom, you can compute the determinant with a simplification formula that reduces the problem to a 3-by-3 matrix
a-p d-p g-p
b-q e-q h-q
c-r f-r i-r*/
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<math.h>
using namespace std;
double det(int n, double mat[3][3])
{
double submat[3][3];
float d;
for (int c = 0; c < n; c++)
{
int subi = 0; //submatrix's i value
for (int i = 1; i < n; i++)
{
int subj = 0;
for (int j = 0; j < n; j++)
{
if (j == c)
continue;
submat[subi][subj] = mat[i][j];
subj++;
}
subi++;
}
d = d + (pow(-1, c) * mat[0][c] * det(n - 1, submat));
}
return d;
}
int main(int argc, char **argv)
{
cout << "Enter the points of the triangle:\n";
int x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4;
cin >> x1;
cin >> x2;
cin >> x3;
cin >> x4;
cin >> y1;
cin >> y2;
cin >> y3;
cin >> y4;
cin >> z1;
cin >> z2;
cin >> z3;
cin >> z4;
double mat[4][4];
mat[0][0] = x1;
mat[0][1] = x2;
mat[0][2] = x3;
mat[0][3] = x4;
mat[1][0] = y1;
mat[1][1] = y2;
mat[1][2] = y3;
mat[1][3] = y4;
mat[2][0] = z1;
mat[2][1] = z2;
mat[2][2] = z3;
mat[2][3] = z4;
mat[3][0] = 1;
mat[3][1] = 1;
mat[3][2] = 1;
mat[3][3] = 1;
cout << "\nMatrix formed by the points: \n";
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
cout << mat[i][j] << " ";
}
cout << endl;
}
double matrix[3][3];
matrix[0][0] = x1 - x4;
matrix[0][1] = x2 - x4;
matrix[0][2] = x3 - x4;
matrix[1][0] = y1 - y4;
matrix[1][1] = y2 - y4;
matrix[1][2] = y3 - y4;
matrix[2][0] = z1 - z4;
matrix[2][1] = z2 - z4;
matrix[2][2] = z3 - z4;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
cout << matrix[i][j] << " ";
}
cout << endl;
}
float determinant = det(3, matrix) / 6;
if (determinant < 0)
cout << "The Area of the tetrahedron formed by (" << x1 << "," << y1
<< "," << z1 << "), (" << x2 << "," << y2 << "," << z2
<< "), (" << x3 << "," << y3 << "," << z3 << "), (" << x4 << ","
<< y4 << "," << z4 << ") = " << (determinant * -1);
else
cout << "The Area of the tetrahedron formed by (" << x1 << "," << y1
<< "," << z1 << "), (" << x2 << "," << y2 << "," << z2
<< "), (" << x3 << "," << y3 << "," << z3 << "), (" << x4 << ","
<< y4 << "," << z4 << ") = " << determinant;
return 0;
}
/*
Enter the points of the triangle:
0 9 6 0
4 2 1 1
3 4 7 5
Matrix formed by the points:
0 9 6 0
4 2 1 1
3 4 7 5
1 1 1 1
0 9 6
3 1 0
-2 -1 2
The Area of the tetrahedron formed by (0,4,3), (9,2,4), (6,1,7), (0,1,5) = 10.0