blob: 5988740c08632efab5cccf063d5367d493cf7e78 [file] [log] [blame]
//#####################################################################
// Copyright 2002-2004, Robert Bridson, Ronald Fedkiw, Sergey Koltakov, Andrew Selle, Joseph Teran.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class SEGMENT_3D
//#####################################################################
#ifndef __SEGMENT_3D__
#define __SEGMENT_3D__
#include "../Matrices_And_Vectors/VECTOR_3D.h"
#include "../Matrices_And_Vectors/VECTOR_2D.h"
namespace PhysBAM
{
template<class T>
class SEGMENT_3D
{
public:
VECTOR_3D<T> x1, x2;
SEGMENT_3D()
: x1 (0, 0, 0), x2 (1, 0, 0)
{}
SEGMENT_3D (const VECTOR_3D<T>& x1_input, const VECTOR_3D<T>& x2_input)
: x1 (x1_input), x2 (x2_input)
{}
T Length() const
{
return (x2 - x1).Magnitude();
}
static VECTOR_3D<T> Clockwise_Normal (VECTOR_3D<T> x1, VECTOR_3D<T> x2, VECTOR_3D<T> x3)
{
VECTOR_3D<T> v = x2 - x1, face_normal = VECTOR_3D<T>::Cross_Product (v, x3 - x1);
return VECTOR_3D<T>::Cross_Product (face_normal, v).Normalized();
} // rotate by 90 degrees clockwise
static VECTOR_3D<T> Robust_Clockwise_Normal (VECTOR_3D<T> x1, VECTOR_3D<T> x2, VECTOR_3D<T> x3, const T tolerance = 1e-8)
{
VECTOR_3D<T> v = x2 - x1, face_normal = VECTOR_3D<T>::Cross_Product (v, x3 - x1);
return VECTOR_3D<T>::Cross_Product (face_normal, v).Robust_Normalized (tolerance);
} // rotate by 90 degrees clockwise
static VECTOR_3D<T> Clockwise_Normal_Direction (VECTOR_3D<T> x1, VECTOR_3D<T> x2, VECTOR_3D<T> x3)
{
VECTOR_3D<T> v = x2 - x1, face_normal = VECTOR_3D<T>::Cross_Product (v, x3 - x1);
return VECTOR_3D<T>::Cross_Product (face_normal, v);
} // can have any magnitude
//#####################################################################
VECTOR_3D<T> Closest_Point_On_Segment (const VECTOR_3D<T>& point) const;
T Distance_From_Point_To_Segment (const VECTOR_3D<T>& point) const;
VECTOR_3D<T> Closest_Point_On_Line (const VECTOR_3D<T>& point) const;
T Distance_From_Point_To_Line (const VECTOR_3D<T>& point) const;
VECTOR_3D<T> Shortest_Vector_Between_Segments (const SEGMENT_3D<T>& segment, VECTOR_2D<T>& weights) const;
bool Segment_Segment_Interaction (const SEGMENT_3D<T>& segment, const T interaction_distance, T& distance, VECTOR_3D<T>& normal, VECTOR_2D<T>& weights) const;
void Segment_Segment_Interaction_Data (const SEGMENT_3D<T>& segment, const VECTOR_3D<T>& v1, const VECTOR_3D<T>& v2, const VECTOR_3D<T>& v3, const VECTOR_3D<T>& v4,
T& distance, VECTOR_3D<T>& normal, const VECTOR_2D<T>& weights, const T small_number = 0, const bool verbose = true) const;
bool Segment_Segment_Interaction (const SEGMENT_3D<T>& segment, const VECTOR_3D<T>& v1, const VECTOR_3D<T>& v2, const VECTOR_3D<T>& v3, const VECTOR_3D<T>& v4,
const T interaction_distance, T& distance, VECTOR_3D<T>& normal, VECTOR_2D<T>& weights, T& relative_speed, const T small_number = 0, const bool exit_early = false, const bool verbose = true) const;
bool Segment_Segment_Collision (const SEGMENT_3D<T>& segment, const VECTOR_3D<T>& v1, const VECTOR_3D<T>& v2, const VECTOR_3D<T>& v3, const VECTOR_3D<T>& v4, const T dt,
const T collision_thickness, T& collision_time, VECTOR_3D<T>& normal, VECTOR_2D<T>& weights, T& relative_speed, const T small_number = 0, const bool exit_early = false) const;
static VECTOR_2D<T> Barycentric_Coordinates (const VECTOR_3D<T>& location, const VECTOR_3D<T>& x1, const VECTOR_3D<T>& x2);
//#####################################################################
};
}
#endif