1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/HLRBRep/HLRBRep_Surface.cxx
dpasukhi a5a7b3185b Coding - Apply .clang-format formatting #286
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

289 lines
8.0 KiB
C++

// Created on: 1992-03-13
// Created by: Christophe MARION
// Copyright (c) 1992-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 <gp_Vec.hxx>
#include <GProp_PEquation.hxx>
#include <HLRAlgo_Projector.hxx>
#include <HLRBRep_Surface.hxx>
#include <TColgp_Array1OfPnt.hxx>
#include <TColStd_Array2OfReal.hxx>
#include <TopoDS_Face.hxx>
//=================================================================================================
HLRBRep_Surface::HLRBRep_Surface()
: myType(GeomAbs_OtherSurface),
myProj(NULL)
{
}
//=================================================================================================
void HLRBRep_Surface::Surface(const TopoDS_Face& F)
{
// mySurf.Initialize(F,Standard_False);
mySurf.Initialize(F, Standard_True);
GeomAbs_SurfaceType typ = HLRBRep_BSurfaceTool::GetType(mySurf);
switch (typ)
{
case GeomAbs_Plane:
case GeomAbs_Cylinder:
case GeomAbs_Cone:
case GeomAbs_Sphere:
case GeomAbs_Torus:
// unchanged type
myType = typ;
break;
case GeomAbs_BezierSurface:
if (HLRBRep_BSurfaceTool::UDegree(mySurf) == 1 && HLRBRep_BSurfaceTool::VDegree(mySurf) == 1)
{
myType = GeomAbs_Plane;
}
else
myType = typ;
break;
default:
myType = GeomAbs_OtherSurface;
break;
}
}
//=================================================================================================
Standard_Boolean HLRBRep_Surface::SideRowsOfPoles(const Standard_Real tol,
const Standard_Integer nbuPoles,
const Standard_Integer nbvPoles,
TColgp_Array2OfPnt& Pnt) const
{
Standard_Integer iu, iv;
Standard_Real x0, y0, x, y, z;
Standard_Boolean result;
Standard_Real tole = (Standard_Real)tol;
const gp_Trsf& T = myProj->Transformation();
for (iu = 1; iu <= nbuPoles; iu++)
{
for (iv = 1; iv <= nbvPoles; iv++)
Pnt(iu, iv).Transform(T);
}
result = Standard_True;
for (iu = 1; iu <= nbuPoles && result; iu++)
{ // Side iso u ?
Pnt(iu, 1).Coord(x0, y0, z);
for (iv = 2; iv <= nbvPoles && result; iv++)
{
Pnt(iu, iv).Coord(x, y, z);
result = Abs(x - x0) < tole && Abs(y - y0) < tole;
}
}
if (result)
return result;
result = Standard_True;
for (iv = 1; iv <= nbvPoles && result; iv++)
{ // Side iso v ?
Pnt(1, iv).Coord(x0, y0, z);
for (iu = 2; iu <= nbuPoles && result; iu++)
{
Pnt(iu, iv).Coord(x, y, z);
result = Abs(x - x0) < tole && Abs(y - y0) < tole;
}
}
if (result)
return result;
// Are the Poles in a Side Plane ?
TColgp_Array1OfPnt p(1, nbuPoles * nbvPoles);
Standard_Integer i = 0;
for (iu = 1; iu <= nbuPoles; iu++)
{
for (iv = 1; iv <= nbvPoles; iv++)
{
i++;
p(i) = Pnt(iu, iv);
}
}
GProp_PEquation Pl(p, (Standard_Real)tol);
if (Pl.IsPlanar())
result = Abs(Pl.Plane().Axis().Direction().Z()) < 0.0001;
return result;
}
//=================================================================================================
Standard_Boolean HLRBRep_Surface::IsSide(const Standard_Real tolF, const Standard_Real toler) const
{
gp_Pnt Pt;
gp_Vec D;
Standard_Real r;
if (myType == GeomAbs_Plane)
{
gp_Pln Pl = Plane();
gp_Ax1 A = Pl.Axis();
Pt = A.Location();
D = A.Direction();
Pt.Transform(myProj->Transformation());
D.Transform(myProj->Transformation());
if (myProj->Perspective())
{
r = D.Z() * myProj->Focus() - (D.X() * Pt.X() + D.Y() * Pt.Y() + D.Z() * Pt.Z());
}
else
r = D.Z();
return Abs(r) < toler;
}
else if (myType == GeomAbs_Cylinder)
{
if (myProj->Perspective())
return Standard_False;
gp_Cylinder Cyl = HLRBRep_BSurfaceTool::Cylinder(mySurf);
gp_Ax1 A = Cyl.Axis();
D = A.Direction();
D.Transform(myProj->Transformation());
r = Sqrt(D.X() * D.X() + D.Y() * D.Y());
return r < toler;
}
else if (myType == GeomAbs_Cone)
{
if (!myProj->Perspective())
return Standard_False;
gp_Cone Con = HLRBRep_BSurfaceTool::Cone(mySurf);
Pt = Con.Apex();
Pt.Transform(myProj->Transformation());
Standard_Real tol = 0.001;
return Pt.IsEqual(gp_Pnt(0, 0, myProj->Focus()), tol);
}
else if (myType == GeomAbs_BezierSurface)
{
if (myProj->Perspective())
return Standard_False;
Standard_Integer nu = HLRBRep_BSurfaceTool::NbUPoles(mySurf);
Standard_Integer nv = HLRBRep_BSurfaceTool::NbVPoles(mySurf);
TColgp_Array2OfPnt Pnt(1, nu, 1, nv);
HLRBRep_BSurfaceTool::Bezier(mySurf)->Poles(Pnt);
return SideRowsOfPoles(tolF, nu, nv, Pnt);
}
else if (myType == GeomAbs_BSplineSurface)
{
if (myProj->Perspective())
return Standard_False;
Standard_Integer nu = HLRBRep_BSurfaceTool::NbUPoles(mySurf);
Standard_Integer nv = HLRBRep_BSurfaceTool::NbVPoles(mySurf);
TColgp_Array2OfPnt Pnt(1, nu, 1, nv);
TColStd_Array2OfReal W(1, nu, 1, nv);
HLRBRep_BSurfaceTool::BSpline(mySurf)->Poles(Pnt);
HLRBRep_BSurfaceTool::BSpline(mySurf)->Weights(W);
return SideRowsOfPoles(tolF, nu, nv, Pnt);
}
else
return Standard_False;
}
//=================================================================================================
Standard_Boolean HLRBRep_Surface::IsAbove(const Standard_Boolean back,
const HLRBRep_Curve* A,
const Standard_Real tol) const
{
Standard_Boolean planar = (myType == GeomAbs_Plane);
if (planar)
{
gp_Pln Pl = Plane();
Standard_Real a, b, c, d;
Pl.Coefficients(a, b, c, d);
Standard_Real u, u1, u2, dd, x, y, z;
gp_Pnt P;
u1 = A->Parameter3d(A->FirstParameter());
u2 = A->Parameter3d(A->LastParameter());
u = u1;
A->D0(u, P);
P.Coord(x, y, z);
dd = a * x + b * y + c * z + d;
if (back)
dd = -dd;
if (dd < -tol)
return Standard_False;
if (A->GetType() != GeomAbs_Line)
{
Standard_Integer nbPnt = 30;
Standard_Real step = (u2 - u1) / (nbPnt + 1);
for (Standard_Integer i = 1; i <= nbPnt; i++)
{
u += step;
A->D0(u, P);
P.Coord(x, y, z);
dd = a * x + b * y + c * z + d;
if (back)
dd = -dd;
if (dd < -tol)
return Standard_False;
}
}
u = u2;
A->D0(u, P);
P.Coord(x, y, z);
dd = a * x + b * y + c * z + d;
if (back)
dd = -dd;
if (dd < -tol)
return Standard_False;
return Standard_True;
}
else
return Standard_False;
}
//=================================================================================================
gp_Pnt HLRBRep_Surface::Value(const Standard_Real U, const Standard_Real V) const
{
gp_Pnt P;
D0(U, V, P);
return P;
}
//=================================================================================================
gp_Pln HLRBRep_Surface::Plane() const
{
GeomAbs_SurfaceType typ = HLRBRep_BSurfaceTool::GetType(mySurf);
switch (typ)
{
case GeomAbs_BezierSurface: {
gp_Pnt P;
gp_Vec D1U;
gp_Vec D1V;
D1(0.5, 0.5, P, D1U, D1V);
return gp_Pln(P, gp_Dir(D1U.Crossed(D1V)));
}
default:
return HLRBRep_BSurfaceTool::Plane(mySurf);
}
}