programming-examples/c++/Computational_Geometry/C++ Program to Compute the Volume of a Tetrahedron Using Determinants.cpp
2019-11-15 12:59:38 +01:00

133 lines
3.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*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