mirror of
https://github.com/Open-Cascade-SAS/OCCT.git
synced 2026-05-10 09:30:48 +08:00
Modeling - Add optimized point-to-plane projection helper for batch processing (#959)
- Adds a new `PlaneProjector` struct that caches plane origin and direction components - Replaces two instances of `ElSLib::Parameters` calls with the optimized projector for batch pole projection
This commit is contained in:
@@ -51,6 +51,49 @@
|
|||||||
// static Standard_Boolean AffichValue = Standard_False;
|
// static Standard_Boolean AffichValue = Standard_False;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
|
//! Helper for optimized point-to-plane projection without gp_Trsf overhead.
|
||||||
|
//! Pre-computes plane basis for efficient batch projection of multiple points.
|
||||||
|
struct PlaneProjector
|
||||||
|
{
|
||||||
|
double OX, OY, OZ; //!< Plane origin
|
||||||
|
double DXx, DXy, DXz; //!< X direction components
|
||||||
|
double DYx, DYy, DYz; //!< Y direction components
|
||||||
|
|
||||||
|
//! Initialize from plane position.
|
||||||
|
PlaneProjector(const gp_Ax3& thePos)
|
||||||
|
{
|
||||||
|
const gp_Pnt& aLoc = thePos.Location();
|
||||||
|
OX = aLoc.X();
|
||||||
|
OY = aLoc.Y();
|
||||||
|
OZ = aLoc.Z();
|
||||||
|
|
||||||
|
const gp_Dir& aXDir = thePos.XDirection();
|
||||||
|
DXx = aXDir.X();
|
||||||
|
DXy = aXDir.Y();
|
||||||
|
DXz = aXDir.Z();
|
||||||
|
|
||||||
|
const gp_Dir& aYDir = thePos.YDirection();
|
||||||
|
DYx = aYDir.X();
|
||||||
|
DYy = aYDir.Y();
|
||||||
|
DYz = aYDir.Z();
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Project point onto plane.
|
||||||
|
//! @return 2D point where X = (P - Origin) x XDirection, Y = (P - Origin) x YDirection
|
||||||
|
gp_Pnt2d Project(const gp_Pnt& theP) const
|
||||||
|
{
|
||||||
|
const double dX = theP.X() - OX;
|
||||||
|
const double dY = theP.Y() - OY;
|
||||||
|
const double dZ = theP.Z() - OZ;
|
||||||
|
return gp_Pnt2d(dX * DXx + dY * DXy + dZ * DXz, dX * DYx + dY * DYy + dZ * DYz);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
//=================================================================================================
|
//=================================================================================================
|
||||||
|
|
||||||
// OFV:
|
// OFV:
|
||||||
@@ -1106,12 +1149,12 @@ void ProjLib_ComputeApprox::Perform(const Handle(Adaptor3d_Curve)& C,
|
|||||||
if (BS->IsRational())
|
if (BS->IsRational())
|
||||||
BS->Weights(Weights);
|
BS->Weights(Weights);
|
||||||
BS->Poles(P3d);
|
BS->Poles(P3d);
|
||||||
gp_Pln Plane = S->Plane();
|
|
||||||
Standard_Real U, V;
|
// Project poles onto plane using optimized projector (avoids gp_Trsf per point)
|
||||||
|
const PlaneProjector aProj(S->Plane().Position());
|
||||||
for (Standard_Integer i = 1; i <= NbPoles; i++)
|
for (Standard_Integer i = 1; i <= NbPoles; i++)
|
||||||
{
|
{
|
||||||
ElSLib::Parameters(Plane, P3d(i), U, V);
|
Poles.SetValue(i, aProj.Project(P3d(i)));
|
||||||
Poles.SetValue(i, gp_Pnt2d(U, V));
|
|
||||||
}
|
}
|
||||||
NbKnots = BS->NbKnots();
|
NbKnots = BS->NbKnots();
|
||||||
TColStd_Array1OfReal Knots(1, NbKnots);
|
TColStd_Array1OfReal Knots(1, NbKnots);
|
||||||
@@ -1144,14 +1187,11 @@ void ProjLib_ComputeApprox::Perform(const Handle(Adaptor3d_Curve)& C,
|
|||||||
}
|
}
|
||||||
BezierCurvePtr->Poles(P3d);
|
BezierCurvePtr->Poles(P3d);
|
||||||
|
|
||||||
// project the 3D-Poles on the plane
|
// Project poles onto plane using optimized projector (avoids gp_Trsf per point)
|
||||||
|
const PlaneProjector aProj(S->Plane().Position());
|
||||||
gp_Pln Plane = S->Plane();
|
|
||||||
Standard_Real U, V;
|
|
||||||
for (Standard_Integer i = 1; i <= NbPoles; i++)
|
for (Standard_Integer i = 1; i <= NbPoles; i++)
|
||||||
{
|
{
|
||||||
ElSLib::Parameters(Plane, P3d(i), U, V);
|
Poles.SetValue(i, aProj.Project(P3d(i)));
|
||||||
Poles.SetValue(i, gp_Pnt2d(U, V));
|
|
||||||
}
|
}
|
||||||
if (BezierCurvePtr->IsRational())
|
if (BezierCurvePtr->IsRational())
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user