1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-03 17:56:21 +03:00
occt/src/BRepMesh/BRepMesh_Classifier.cxx
dpasukhi 8082b955bd Coding - Reorganize code with constexpr #68
After rework Precision.hxx some local
  variables can be marked as constexpr
2024-09-22 12:46:46 +00:00

138 lines
4.0 KiB
C++

// Created on: 2016-07-07
// Copyright (c) 2016 OPEN CASCADE SAS
// Created by: Oleg AGASHIN
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <BRepMesh_Classifier.hxx>
#include <Precision.hxx>
#include <gp_Pnt2d.hxx>
#include <CSLib_Class2d.hxx>
#include <TColgp_Array1OfPnt2d.hxx>
IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_Classifier, Standard_Transient)
//=======================================================================
//function : Constructor
//purpose :
//=======================================================================
BRepMesh_Classifier::BRepMesh_Classifier()
{
}
//=======================================================================
//function : Destructor
//purpose :
//=======================================================================
BRepMesh_Classifier::~BRepMesh_Classifier()
{
}
//=======================================================================
//function : Perform
//purpose :
//=======================================================================
TopAbs_State BRepMesh_Classifier::Perform(const gp_Pnt2d& thePoint) const
{
Standard_Boolean isOut = Standard_False;
Standard_Integer aNb = myTabClass.Length();
for (Standard_Integer i = 0; i < aNb; i++)
{
const Standard_Integer aCur = myTabClass(i)->SiDans(thePoint);
if (aCur == 0)
{
// Point is ON, but mark it as OUT
isOut = Standard_True;
}
else
{
isOut = myTabOrient(i) ? (aCur == -1) : (aCur == 1);
}
if (isOut)
{
return TopAbs_OUT;
}
}
return TopAbs_IN;
}
//=======================================================================
//function : RegisterWire
//purpose :
//=======================================================================
void BRepMesh_Classifier::RegisterWire(
const NCollection_Sequence<const gp_Pnt2d*>& theWire,
const std::pair<Standard_Real, Standard_Real>& theTolUV,
const std::pair<Standard_Real, Standard_Real>& theRangeU,
const std::pair<Standard_Real, Standard_Real>& theRangeV)
{
const Standard_Integer aNbPnts = theWire.Length();
if (aNbPnts < 2)
{
return;
}
// Accumulate angle
TColgp_Array1OfPnt2d aPClass(1, aNbPnts);
Standard_Real anAngle = 0.0;
const gp_Pnt2d *p1 = theWire(1), *p2 = theWire(2), *p3;
aPClass(1) = *p1;
aPClass(2) = *p2;
constexpr Standard_Real aAngTol = Precision::Angular();
constexpr Standard_Real aSqConfusion =
Precision::PConfusion() * Precision::PConfusion();
for (Standard_Integer i = 1; i <= aNbPnts; i++)
{
Standard_Integer ii = i + 2;
if (ii > aNbPnts)
{
p3 = &aPClass(ii - aNbPnts);
}
else
{
p3 = theWire.Value(ii);
aPClass(ii) = *p3;
}
const gp_Vec2d A(*p1,*p2), B(*p2,*p3);
if (A.SquareMagnitude() > aSqConfusion &&
B.SquareMagnitude() > aSqConfusion)
{
const Standard_Real aCurAngle = A.Angle(B);
const Standard_Real aCurAngleAbs = Abs(aCurAngle);
// Check if vectors are opposite
if (aCurAngleAbs > aAngTol && (M_PI - aCurAngleAbs) > aAngTol)
{
anAngle += aCurAngle;
p1 = p2;
}
}
p2 = p3;
}
// Check for zero angle - treat self intersecting wire as outer
if (Abs(anAngle) < aAngTol)
anAngle = 0.0;
myTabClass.Append(new CSLib_Class2d(
aPClass, theTolUV.first, theTolUV.second,
theRangeU.first, theRangeV.first,
theRangeU.second, theRangeV.second));
myTabOrient.Append( !(anAngle < 0.0) );
}