// Created on: 1997-05-13 // Created by: Stagiaire Francois DUMONT // Copyright (c) 1997-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 #include #include #include #include #include #include #include #include #include #include #include //======================================================================= //function :GeomLib_DenominatorMultiplier //purpose : //======================================================================= GeomLib_DenominatorMultiplier::GeomLib_DenominatorMultiplier (const Handle(Geom_BSplineSurface) & Surface, const TColStd_Array1OfReal & KnotVector):mySurface(Surface), myKnotFlatVector(1,KnotVector.Length()) {Standard_Integer i; for (i=1;i<=KnotVector.Length();i++) myKnotFlatVector.SetValue(i,KnotVector(i)); } //======================================================================= //function : value //purpose : give the value of a(UParameter,VParameter) //======================================================================= Standard_Real GeomLib_DenominatorMultiplier::Value(const Standard_Real UParameter, const Standard_Real VParameter)const {Standard_Real Dumaxv,Duminv,dDduumaxv,dDduuminv, Dv,Buv=0.0; // gp_Pnt HermPnt; gp_Pnt N; gp_Vec Nu,Nv; TColgp_Array2OfPnt surface_poles(1,mySurface->NbUPoles(), 1,mySurface->NbVPoles()) ; TColStd_Array2OfReal surface_weights(1,mySurface->NbUPoles(), 1,mySurface->NbVPoles()) ; TColStd_Array1OfReal surface_u_knots(1,mySurface->NbUKnots()) ; TColStd_Array1OfInteger surface_u_mults(1,mySurface->NbUKnots()) ; TColStd_Array1OfReal surface_v_knots(1,mySurface->NbVKnots()) ; TColStd_Array1OfInteger surface_v_mults(1,mySurface->NbVKnots()) ; Standard_Integer udegree,vdegree; mySurface->UKnots(surface_u_knots) ; mySurface->UMultiplicities(surface_u_mults) ; mySurface->Poles(surface_poles) ; mySurface->Weights(surface_weights) ; mySurface->VKnots(surface_v_knots) ; mySurface->VMultiplicities(surface_v_mults) ; udegree=mySurface->UDegree(); vdegree=mySurface->VDegree(); BSplSLib::HomogeneousD1(mySurface->UKnot(mySurface->LastUKnotIndex()),VParameter, 0,0, surface_poles, &surface_weights, surface_u_knots,surface_v_knots, &surface_u_mults,&surface_v_mults, udegree,vdegree, mySurface->IsURational(),mySurface->IsVRational(), mySurface->IsUPeriodic(),mySurface->IsVPeriodic(), N,Nu,Nv, Dumaxv, dDduumaxv, Dv); BSplSLib::HomogeneousD1(mySurface->UKnot(1),VParameter, 0,0, surface_poles, &surface_weights, surface_u_knots,surface_v_knots, &surface_u_mults,&surface_v_mults, udegree,vdegree, mySurface->IsURational(),mySurface->IsVRational(), mySurface->IsUPeriodic(),mySurface->IsVPeriodic(), N,Nu,Nv, Duminv, dDduuminv, Dv); math_Matrix BSplineBasisDeriv(1,2,1,4,0.0); Standard_Real B1prim0,Bprelastprim1, lambda=(mySurface->Weight(1,1)/mySurface->Weight(mySurface->NbUPoles(),1)); Standard_Integer index,i; BSplCLib::EvalBsplineBasis(1, 4, myKnotFlatVector, 0.0, index, BSplineBasisDeriv); B1prim0=BSplineBasisDeriv(2,2); BSplCLib::EvalBsplineBasis(1, 4, myKnotFlatVector, 1.0, index, BSplineBasisDeriv); Bprelastprim1=BSplineBasisDeriv(2,3); math_Matrix BSplineBasisValue(1,1,1,4,0.0); BSplCLib::EvalBsplineBasis(0, 4, myKnotFlatVector, UParameter, index, BSplineBasisValue); TColStd_Array1OfReal value(0,5); TColStd_Array1OfReal Polesenv(0,5); //poles of a(u,v) for (i=0;i<=5;i++) Polesenv(i)=0.0; Polesenv(0)=Duminv; Polesenv(1)=Duminv-dDduuminv/B1prim0; Polesenv(4)=lambda*lambda*(Dumaxv-dDduumaxv/Bprelastprim1); Polesenv(5)=lambda*lambda*Dumaxv; if (myKnotFlatVector.Length()==8){ value(0)=BSplineBasisValue(1,1); //values of the basic functions value(1)=BSplineBasisValue(1,2); value(2)=0.0; value(3)=0.0; value(4)=BSplineBasisValue(1,3); value(5)=BSplineBasisValue(1,4); } if (myKnotFlatVector.Length()==9){ if (index==1){ value(0)=BSplineBasisValue(1,1); value(1)=BSplineBasisValue(1,2); value(2)=BSplineBasisValue(1,3); value(3)=0.0; value(4)=BSplineBasisValue(1,4); value(5)=0.0; } else{ value(0)=0.0; value(1)=BSplineBasisValue(1,1); value(2)=BSplineBasisValue(1,2); value(3)=0.0; value(4)=BSplineBasisValue(1,3); value(5)=BSplineBasisValue(1,4); } Polesenv(2)=(0.5*(Polesenv(0)+Polesenv(5))); } if (myKnotFlatVector.Length()==10){ if (index==1){ value(0)=BSplineBasisValue(1,1); value(1)=BSplineBasisValue(1,2); value(2)=BSplineBasisValue(1,3); value(3)=BSplineBasisValue(1,4); value(4)=0.0; value(5)=0.0; } if (index==2){ value(0)=0.0; value(1)=BSplineBasisValue(1,1); value(2)=BSplineBasisValue(1,2); value(3)=BSplineBasisValue(1,3); value(4)=BSplineBasisValue(1,4); value(5)=0.0; } if (index==3){ value(0)=0.0; value(1)=0.0; value(2)=BSplineBasisValue(1,1); value(3)=BSplineBasisValue(1,2); value(4)=BSplineBasisValue(1,3); value(5)=BSplineBasisValue(1,4); } Polesenv(2)=(0.5*(Polesenv(0)+Polesenv(5))); Polesenv(3)=Polesenv(2); } for (i=0;i<=5;i++) Buv+=Polesenv(i)*value(i); return Buv; }