1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/IntCurvesFace/IntCurvesFace_ShapeIntersector.cxx
dpasukhi a5a7b3185b Coding - Apply .clang-format formatting
Update empty method guards to new style with regex (see PR).
Used clang-format 18.1.8.
New actions to validate code formatting is added.
Update .clang-format with disabling of include sorting.
  It is temporary changes, then include will be sorted.
Apply formatting for /src and /tools folder.
The files with .hxx,.cxx,.lxx,.h,.pxx,.hpp,*.cpp extensions.
2025-01-26 00:43:57 +00:00

210 lines
6.6 KiB
C++

// Created on: 1998-01-27
// Created by: Laurent BUCHARD
// Copyright (c) 1998-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// 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 <IntCurvesFace_ShapeIntersector.hxx>
#include <Adaptor3d_Curve.hxx>
#include <Bnd_BoundSortBox.hxx>
#include <gp_Lin.hxx>
#include <IntCurvesFace_Intersector.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Shape.hxx>
IntCurvesFace_ShapeIntersector::IntCurvesFace_ShapeIntersector()
: myIsDone(Standard_False),
myNbFaces(0)
{
}
void IntCurvesFace_ShapeIntersector::Load(const TopoDS_Shape& theShape, const Standard_Real theTol)
{
TopExp_Explorer Ex;
Standard_Integer i;
for (myNbFaces = 0, i = 0, Ex.Init(theShape, TopAbs_FACE); Ex.More(); ++i, Ex.Next())
{
++myNbFaces;
TopoDS_Face aCurrentFace = TopoDS::Face(Ex.Current());
myIntersector.Append(new IntCurvesFace_Intersector(aCurrentFace, theTol));
}
}
void IntCurvesFace_ShapeIntersector::Perform(const gp_Lin& theL,
const Standard_Real theParMin,
const Standard_Real theParMax)
{
myIsDone = Standard_False;
for (Standard_Integer i = 1; i <= myNbFaces; ++i)
{
myIntersector.ChangeValue(i)->Perform(theL, theParMin, theParMax);
}
SortResult();
}
void IntCurvesFace_ShapeIntersector::PerformNearest(const gp_Lin& theL,
const Standard_Real theParMin,
const Standard_Real theParMax)
{
Standard_Integer i = 0;
if (myNbFaces > 2)
{
if (myPtrNums.IsEmpty())
{
myPtrNums = TColStd_HArray1OfInteger(0, myNbFaces - 1);
myPtrIndexNums = TColStd_HArray1OfInteger(0, myNbFaces - 1);
for (; i < myNbFaces; ++i)
{
myPtrNums.ChangeValue(i) = 0;
myPtrIndexNums.ChangeValue(i) = i + 1;
}
}
}
Standard_Integer anIndexFace = -1;
Standard_Real aParMax = theParMax;
myIsDone = Standard_False;
for (Standard_Integer ii = 1; ii <= myNbFaces; ++ii)
{
if (!myPtrNums.IsEmpty())
{
i = myPtrIndexNums.Value(ii - 1);
}
else
{
i = ii;
}
Handle(IntCurvesFace_Intersector) anIntersector = myIntersector.ChangeValue(i);
if (theParMin < aParMax)
{
anIntersector->Perform(theL, theParMin, aParMax);
if (anIntersector->IsDone())
{
Standard_Integer n = anIntersector->NbPnt();
for (Standard_Integer j = 1; j <= n; ++j)
{
Standard_Real w = anIntersector->WParameter(j);
if (w < aParMax)
{
aParMax = w;
anIndexFace = ii - 1;
}
}
}
else
{
myIsDone = Standard_False;
return;
}
}
}
if (!myPtrNums.IsEmpty() && anIndexFace >= 0)
{
myPtrNums.ChangeValue(anIndexFace) += 1;
Standard_Integer im1;
for (im1 = anIndexFace - 1, i = anIndexFace;
i >= 1 && myPtrNums.Value(i) > myPtrNums.Value(im1);
--i, --im1)
{
std::swap(myPtrIndexNums.ChangeValue(i), myPtrIndexNums.ChangeValue(im1));
std::swap(myPtrNums.ChangeValue(i), myPtrNums.ChangeValue(im1));
}
}
SortResult();
}
void IntCurvesFace_ShapeIntersector::Perform(const Handle(Adaptor3d_Curve)& theHCurve,
const Standard_Real theParMin,
const Standard_Real theParMax)
{
myIsDone = Standard_False;
for (Standard_Integer i = 1; i <= myNbFaces; ++i)
{
Handle(IntCurvesFace_Intersector) anIntersector = myIntersector.ChangeValue(i);
anIntersector->Perform(theHCurve, theParMin, theParMax);
}
SortResult();
}
//-- ================================================================================
//-- myIntersector : Sequence of the addresses
//-- myIndexPt : 1 2 3 .... n Points before the sorting
//-- myNumberFace : Number of the face (of the intersector) of the point myIndexPt(i)
//-- myNumberIntPnt : Number of the point myIndexPt(i) of the intersection
// myNumberFace(myIndexPt(i))
//-- myIndexPar : Parameter W of point myIndexPt(i)
//--
//-- To sum up, for each point index of K = myIndexPt(i) on a
//-- * the face to which it belongs : myNumberFace(K)
//-- * the number of the point in the intersection for FaceCurve : myNumberIntPnt(K)
//-- * the parameter W of the point on the curve : myIndexPar(K)
//--
//-- SortResult Sorts the points in ascending order of W
//-- (updating the index table TabPt(.))
//--
//-- ================================================================================
void IntCurvesFace_ShapeIntersector::SortResult()
{
myIsDone = Standard_True;
Standard_Integer aNbPnt = 0;
myIndexPt.Clear();
myIndexFace.Clear();
myIndexIntPnt.Clear();
myIndexPar.Clear();
// Retrieval of the results
for (Standard_Integer f = 1; f <= myNbFaces; ++f)
{
Handle(IntCurvesFace_Intersector) anIntersector = myIntersector.ChangeValue(f);
if (anIntersector->IsDone())
{
Standard_Integer n = anIntersector->NbPnt();
for (Standard_Integer j = 1; j <= n; ++j)
{
myIndexPt.Append(++aNbPnt);
myIndexFace.Append(f);
myIndexIntPnt.Append(j);
myIndexPar.Append(anIntersector->WParameter(j));
}
}
else
{
myIsDone = Standard_False;
return;
}
}
// Sort according to parameter w
Standard_Boolean isOK;
do
{
isOK = Standard_True;
for (Standard_Integer ind0 = 1; ind0 < aNbPnt; ind0++)
{
Standard_Integer ind = myIndexPt(ind0);
Standard_Integer indp1 = myIndexPt(ind0 + 1);
if (myIndexPar(ind) > myIndexPar(indp1))
{
myIndexPt(ind0) = indp1;
myIndexPt(ind0 + 1) = ind;
isOK = Standard_False;
}
}
} while (!isOK);
}
IntCurvesFace_ShapeIntersector::~IntCurvesFace_ShapeIntersector() {}