HalfEdge::HalfEdge()
{
_AcrossEdge = NULL;
_NextEdge = NULL;
}
FullEdge::FullEdge()
{
_Index = -1;
for(UINT i = 0; i < 2; i++)
{
_Vertices[i] = NULL;
_Triangles[i] = NULL;
}
}
FullEdge::~FullEdge()
{
}
Vec3f FullEdge::ComputeLoopSubdivisionPos()
{
if(Boundary())
{
return 0.5f * (GetVertex(0).Pos() + GetVertex(1).Pos());
}
else
{
Vertex &VOpposite0 = GetTriangle(0).GetOtherVertex(*this);
Vertex &VOpposite1 = GetTriangle(1).GetOtherVertex(*this);
return (1.0f / 8.0f) * (VOpposite0.Pos() + VOpposite1.Pos())
+ (3.0f / 8.0f) * (GetVertex(0).Pos() + GetVertex(1).Pos());
}
}
Vertex& FullEdge::GetOtherVertex(const FullEdge &FullE)
{
if(FullE.ContainsVertex(GetVertex(0)))
{
return GetVertex(1);
}
if(FullE.ContainsVertex(GetVertex(1)))
{
return GetVertex(0);
}
SignalError("FullEdge::GetOtherVertex failed");
return Vertex::Invalid;
}
Vertex& FullEdge::GetSharedVertex(const FullEdge &FullE)
{
if(FullE.ContainsVertex(GetVertex(0)))
{
return GetVertex(0);
}
if(FullE.ContainsVertex(GetVertex(1)))
{
return GetVertex(1);
}
SignalError("FullEdge::GetSharedVertex failed");
return Vertex::Invalid;
}
bool FullEdge::Boundary() const
{
return (GetTriangle(1) == Triangle::Boundary);
}
void FullEdge::OrientMatchingBoundary()
{
if(!_Triangles[0]->OrientedWith(*this))
{
Utility::Swap(_Vertices[0], _Vertices[1]);
}
}
bool FullEdge::Oriented() const
{
if(Boundary())
{
return _Triangles[0]->OrientedWith(*this);
}
else
{
bool Triangle0Oriented = _Triangles[0]->OrientedWith(*this);
bool Triangle1Oriented = _Triangles[1]->OrientedWith(*this);
return ((Triangle0Oriented && !Triangle1Oriented) ||
(!Triangle0Oriented && Triangle1Oriented));
}
}
double FullEdge::GetCotanTerm() const
{
double Angle0 = 0.0, Angle1 = 0.0;
if(_Triangles[0] != &(Triangle::Boundary))
{
Angle0 = fabs(_Triangles[0]->GetCotangent(_Triangles[0]->GetOtherVertex(*this)));
}
if(_Triangles[1] != &(Triangle::Boundary))
{
Angle1 = fabs(_Triangles[1]->GetCotangent(_Triangles[1]->GetOtherVertex(*this)));
}
Assert(Angle0 == Angle0 && Angle1 == Angle1, "Invalid cotangent");
return (Angle0 + Angle1);
}
bool FullEdge::ContainsVertex(const Vertex &VCompare) const
{
return (GetVertex(0) == VCompare || GetVertex(1) == VCompare);
}
Vertex& FullEdge::GetOtherVertex(const Vertex &VCompare)
{
if(GetVertex(0) == VCompare)
{
return GetVertex(1);
}
if(GetVertex(1) == VCompare)
{
return GetVertex(0);
}
SignalError("FullEdge::GetOtherVertex failed");
return Vertex::Invalid;
}
Triangle& FullEdge::GetOtherTriangle(const Triangle &TCompare)
{
if(GetTriangle(0) == TCompare)
{
return GetTriangle(1);
}
if(GetTriangle(1) == TCompare)
{
return GetTriangle(0);
}
SignalError("FullEdge::GetOtherTriangle failed");
return Triangle::Invalid;
}
const Triangle& FullEdge::GetOtherTriangle(const Triangle &TCompare) const
{
if(GetTriangle(0) == TCompare)
{
return GetTriangle(1);
}
if(GetTriangle(1) == TCompare)
{
return GetTriangle(0);
}
SignalError("FullEdge::GetOtherTriangle failed");
return Triangle::Invalid;
}