//#####################################################################
// Copyright 2009, Jon Gretarsson.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Namespace INTERSECTION
//##################################################################### 
#include <Core/Intersections/SEGMENT_2D_SEGMENT_2D_INTERSECTION.h>
#include <Core/Basic_Geometry/RAY.h>
#include <Core/Basic_Geometry/SEGMENT_2D.h>
#include <Core/Vectors/VECTOR.h>
namespace PhysBAM{
//#####################################################################
// Function Intersects
//#####################################################################
template<class T> bool Intersects(const SEGMENT_2D<T>& segment1,const SEGMENT_2D<T>& segment2,const T thickness_over_two)
{
    RAY<VECTOR<T,2> > ray;
    T dist=ray.Set(segment2.X.x,segment2.X.y-segment2.X.x);
    return Intersects(ray,segment1,thickness_over_two).Hit(dist);
}
//#####################################################################
// Function Intersects
//#####################################################################
template<class T> bool Intersects(const SEGMENT_2D<T>& segment1,const SEGMENT_2D<T>& segment2,VECTOR<T,2>& weights1,VECTOR<T,2>& weights2,const T thickness_over_two)
{
    RAY<VECTOR<T,3> > ray;
    T dist=ray.Set(segment2.X.x,segment2.X.y-segment2.X.x);
    auto hit=Intersects(ray,segment1,thickness_over_two).Hit(dist);
    if(!hit.Hit(dist)) return false;
    weights2(0)=hit.dist/dist;
    weights2(1)=1-weights2(0);
    weights1=segment1.Barycentric_Coordinates(ray.Point(ray.t_max));
    return true;
}
//#####################################################################
template bool Intersects(const SEGMENT_2D<float>&,const SEGMENT_2D<float>&,const float);
template bool Intersects(const SEGMENT_2D<double>&,const SEGMENT_2D<double>&,const double);
}
