118 lines
3.9 KiB
C++
118 lines
3.9 KiB
C++
|
|
#ifndef __TRIANGLE_HPP
|
|
#define __TRIANGLE_HPP
|
|
|
|
#include "plane.hpp"
|
|
#include <string.h>
|
|
|
|
typedef Vector Triangle[3];
|
|
|
|
/*******************************************************************************
|
|
** TriangleCopy
|
|
*******************************************************************************/
|
|
inline void
|
|
TriangleCopy(Triangle dst, Triangle src)
|
|
{
|
|
memcpy(dst, src, sizeof(Triangle));
|
|
}
|
|
/*******************************************************************************
|
|
** TrianglesAreEqual
|
|
*******************************************************************************/
|
|
inline int
|
|
TrianglesAreEqual(Triangle a, Triangle b)
|
|
{
|
|
return
|
|
VectorsAreEqual(a[0], b[0]) &&
|
|
VectorsAreEqual(a[1], b[1]) &&
|
|
VectorsAreEqual(a[2], b[2]);
|
|
}
|
|
/*******************************************************************************
|
|
** TriangleNormal
|
|
*******************************************************************************/
|
|
inline void
|
|
TriangleNormal(Vector normal, Triangle triangle)
|
|
{
|
|
Vector A, B;
|
|
|
|
VectorSubtract(A, triangle[1], triangle[0]);
|
|
VectorSubtract(B, triangle[2], triangle[1]);
|
|
VectorCrossProduct(normal, A, B);
|
|
VectorNormalize(normal, normal);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
** TrianglePlane
|
|
*******************************************************************************/
|
|
inline void
|
|
TrianglePlane(Triangle dst, Plane plane)
|
|
{
|
|
Vector normal;
|
|
|
|
TriangleNormal(normal, dst);
|
|
|
|
PlaneInit(plane, normal, dst[0]);
|
|
}
|
|
/*******************************************************************************
|
|
** TriangleTransform
|
|
*******************************************************************************/
|
|
inline void
|
|
TriangleTransform(Triangle dst, Triangle src, Matrix matrix)
|
|
{
|
|
VectorTransform(dst[0], src[0], matrix);
|
|
VectorTransform(dst[1], src[1], matrix);
|
|
VectorTransform(dst[2], src[2], matrix);
|
|
}
|
|
/*******************************************************************************
|
|
** TriangleEdges
|
|
*******************************************************************************/
|
|
inline void
|
|
TriangleEdges(Triangle dst, Triangle src)
|
|
{
|
|
VectorSubtract(dst[0], src[1], src[0]);
|
|
VectorSubtract(dst[1], src[2], src[1]);
|
|
VectorSubtract(dst[2], src[0], src[2]);
|
|
}
|
|
/*******************************************************************************
|
|
** TriangleHull
|
|
*******************************************************************************/
|
|
inline void
|
|
TriangleHull(Plane hull[3], Triangle triangle)
|
|
{
|
|
Vector normal, v;
|
|
Triangle edges;
|
|
|
|
VectorSubtract(edges[0], triangle[1], triangle[0]);
|
|
VectorSubtract(edges[1], triangle[2], triangle[1]);
|
|
VectorSubtract(edges[2], triangle[0], triangle[2]);
|
|
|
|
VectorCrossProduct(normal, edges[0], edges[1]);
|
|
|
|
VectorCrossProduct(v, edges[0], normal); PlaneInit(hull[0], v, triangle[0]);
|
|
VectorCrossProduct(v, edges[1], normal); PlaneInit(hull[1], v, triangle[1]);
|
|
VectorCrossProduct(v, edges[2], normal); PlaneInit(hull[2], v, triangle[2]);
|
|
}
|
|
/*******************************************************************************
|
|
** TriangleScan
|
|
*******************************************************************************/
|
|
inline int
|
|
TriangleScan(Triangle dst, FILE* fp)
|
|
{
|
|
return fscanf(fp, "%f %f %f %f %f %f %f %f %f",
|
|
&dst[0][0], &dst[0][1], &dst[0][2],
|
|
&dst[1][0], &dst[1][1], &dst[1][2],
|
|
&dst[2][0], &dst[2][1], &dst[2][2]) == 9;
|
|
}
|
|
/*******************************************************************************
|
|
** TrianglePrint
|
|
*******************************************************************************/
|
|
inline int
|
|
TrianglePrint(Triangle dst, FILE* fp)
|
|
{
|
|
return fprintf(fp, "%f %f %f %f %f %f %f %f %f\n",
|
|
&dst[0][0], &dst[0][1], &dst[0][2],
|
|
&dst[1][0], &dst[1][1], &dst[1][2],
|
|
&dst[2][0], &dst[2][1], &dst[2][2]) > 0;
|
|
}
|
|
|
|
#endif
|
|
|