//#####################################################################
// Copyright 2012.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
#include <Core/Analytic_Tests/ANALYTIC_LEVELSET_ROTATE.h>
#include <Core/Matrices/ROTATION.h>
namespace PhysBAM{
//#####################################################################
// Constructor
//#####################################################################
template<class TV> ANALYTIC_LEVELSET_ROTATE<TV>::
ANALYTIC_LEVELSET_ROTATE(ANALYTIC_LEVELSET<TV>* al,const typename TV::SPIN& w,TV cc)
    :al(al),w(w),center(cc)
{
}
//#####################################################################
// Destructor
//#####################################################################
template<class TV> ANALYTIC_LEVELSET_ROTATE<TV>::
~ANALYTIC_LEVELSET_ROTATE()
{
    delete al;
}
//#####################################################################
// Function phi
//#####################################################################
template<class TV> auto ANALYTIC_LEVELSET_ROTATE<TV>::
phi(const TV& X,T t,int& c) const -> T
{
    ROTATION<TV> rot(ROTATION<TV>::From_Rotation_Vector(w*t));
    return al->phi(rot.Inverse_Rotate(X-center)+center,t,c);
}
//#####################################################################
// Constructor
//#####################################################################
template<class TV> TV ANALYTIC_LEVELSET_ROTATE<TV>::
N(const TV& X,T t,int c) const
{
    ROTATION<TV> rot(ROTATION<TV>::From_Rotation_Vector(w*t));
    return rot.Rotate(al->N(rot.Inverse_Rotate(X-center)+center,t,c));
}
//#####################################################################
// Function dist
//#####################################################################
template<class TV> auto ANALYTIC_LEVELSET_ROTATE<TV>::
dist(const TV& X,T t,int c) const -> T
{
    ROTATION<TV> rot(ROTATION<TV>::From_Rotation_Vector(w*t));
    return al->dist(rot.Inverse_Rotate(X-center)+center,t,c);
}
template struct ANALYTIC_LEVELSET_ROTATE<VECTOR<float,1> >;
template struct ANALYTIC_LEVELSET_ROTATE<VECTOR<float,2> >;
template struct ANALYTIC_LEVELSET_ROTATE<VECTOR<float,3> >;
template struct ANALYTIC_LEVELSET_ROTATE<VECTOR<double,1> >;
template struct ANALYTIC_LEVELSET_ROTATE<VECTOR<double,2> >;
template struct ANALYTIC_LEVELSET_ROTATE<VECTOR<double,3> >;
}
