|
|
@ -1,4 +1,5 @@ |
|
|
|
#pragma once |
|
|
|
#include "discretization_helpers.hpp" |
|
|
|
#include "FillBoundary_fwd.hpp" |
|
|
|
#include "KDTree.hpp" |
|
|
|
#include "KDTreeMutable.hpp" |
|
|
@ -28,6 +29,7 @@ namespace meshless { |
|
|
|
std::cout << "该面法线需反向\n"; |
|
|
|
reverseNormal = true; |
|
|
|
} |
|
|
|
DomainDiscretization<Eigen::Vector2d> domainParamLocalPatch(shape); |
|
|
|
|
|
|
|
//开始离散化每个wire
|
|
|
|
auto outerWire = BRepTools::OuterWire(face); |
|
|
@ -39,10 +41,6 @@ namespace meshless { |
|
|
|
if(wire == outerWire) { |
|
|
|
std::cout << "此wire为外环\n"; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
DomainDiscretization<Eigen::Vector2d> domainParamLocalPatch(shape); |
|
|
|
|
|
|
|
TopExp_Explorer expEdge(wire, TopAbs_EDGE); |
|
|
|
int numEdge = 0; |
|
|
|
int genPoints = 0; |
|
|
@ -113,7 +111,7 @@ namespace meshless { |
|
|
|
|
|
|
|
int curNode = domainParamLocalPatch.size() - 1; |
|
|
|
int endNode = domainParamLocalPatch.size(); |
|
|
|
while(curNode < endNode && endNode < shape.max_points) { |
|
|
|
while(curNode < endNode && endNode < shape.max_points_boundary) { |
|
|
|
genPoints++; |
|
|
|
//std::cout << "curNode / endNode : " << curNode << '/' << endNode << '\n';
|
|
|
|
auto param = domainParamLocalPatch.pos(curNode); |
|
|
@ -123,31 +121,33 @@ namespace meshless { |
|
|
|
gp_Pnt pt; |
|
|
|
gp_Vec der; |
|
|
|
geomCurve->D1(t, pt, der); |
|
|
|
std::cout << "pt: " << pt.X() << "," << pt.Y() << "," << pt.Z() << '\n'; |
|
|
|
std::cout << "der: " << der.X() << "," << der.Y() << "," << der.Z() << '\n'; |
|
|
|
|
|
|
|
|
|
|
|
std::cout << "der.Mag:" << der.Magnitude() << '\n'; |
|
|
|
//std::cout << "pt: " << pt.X() << "," << pt.Y() << "," << pt.Z() << '\n';
|
|
|
|
//std::cout << "der: " << der.X() << "," << der.Y() << "," << der.Z() << '\n';
|
|
|
|
//std::cout << "der.Mag:" << der.Magnitude() << '\n';
|
|
|
|
double alpha = h(transPnt(pt)) / der.Magnitude(); |
|
|
|
for(const auto& uCan : candidates) { |
|
|
|
//参数点必须在规定的参数域内
|
|
|
|
double tNew = t + alpha * uCan; |
|
|
|
if(tNew > pCurveLastParam || tNew < pCurveFirstParam) { |
|
|
|
std::cout << "排除\n"; |
|
|
|
//std::cout << "排除\n";
|
|
|
|
continue; |
|
|
|
} |
|
|
|
std::cout << "tNew:" << tNew << "\n"; |
|
|
|
//std::cout << "tNew:" << tNew << "\n";
|
|
|
|
gp_Pnt2d tNewSeedInPCurve; |
|
|
|
geomPCurve->D0(tNew, tNewSeedInPCurve); |
|
|
|
gp_Pnt ptNew; |
|
|
|
geomCurve->D0(tNew, ptNew); |
|
|
|
gp_Pnt ptNew2; |
|
|
|
geomSurface->D0(tNewSeedInPCurve.X(), tNewSeedInPCurve.Y(), ptNew2); |
|
|
|
std::cout << "ptNew: " << ptNew.X() << "," << ptNew.Y() << "," << ptNew.Z() << '\n'; |
|
|
|
std::cout << "ptNew2: " << ptNew2.X() << "," << ptNew2.Y() << "," << ptNew2.Z() << '\n'; |
|
|
|
//std::cout << "ptNew: " << ptNew.X() << "," << ptNew.Y() << "," << ptNew.Z() << '\n';
|
|
|
|
//std::cout << "ptNew2: " << ptNew2.X() << "," << ptNew2.Y() << "," << ptNew2.Z() << '\n';
|
|
|
|
double checkradius = pt.SquareDistance(ptNew); |
|
|
|
std::cout << "CheckRadius: " << checkradius << '\n'; |
|
|
|
//std::cout << "CheckRadius: " << checkradius << '\n';
|
|
|
|
|
|
|
|
|
|
|
|
//距离已有的点不能太近
|
|
|
|
double d_sq_loc = treeLocal.query(transPnt(ptNew)).second[0]; |
|
|
|
std::cout << "d_sq_loc: " << d_sq_loc << '\n'; |
|
|
|
//std::cout << "d_sq_loc: " << d_sq_loc << '\n';
|
|
|
|
if(d_sq_loc >= (shape.zeta * shape.zeta * checkradius)) { |
|
|
|
domainParamLocalPatch.addInternalNodeWithT(transPnt2d(tNewSeedInPCurve), tNew, 1); |
|
|
|
treeLocal.insert(transPnt(ptNew)); |
|
|
@ -166,10 +166,10 @@ namespace meshless { |
|
|
|
domainGlobal.addBoundaryNode(transPnt(ptNew), type, transVec(tSeedNormalNew)); |
|
|
|
treeGlobal.insert(transPnt(ptNew)); |
|
|
|
} else { |
|
|
|
std::cout << "全局不添加点\n"; |
|
|
|
//std::cout << "全局不添加点\n";
|
|
|
|
} |
|
|
|
} else { |
|
|
|
std::cout << "局部不添加点\n"; |
|
|
|
//std::cout << "局部不添加点\n";
|
|
|
|
} |
|
|
|
} |
|
|
|
curNode++; |
|
|
@ -177,17 +177,79 @@ namespace meshless { |
|
|
|
std::cout << "该边已经生成:" << genPoints << "个点\n"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//fill boundary surface!
|
|
|
|
KDTree paramBoundarySearch; |
|
|
|
int curNode = 0, endNode = domainParamLocalPatch.size(); |
|
|
|
while(curNode < endNode && endNode < shape.max_points_boundary) { |
|
|
|
auto paramPoint = domainParamLocalPatch.pos(curNode); |
|
|
|
gp_Pnt initPt; |
|
|
|
gp_Vec derU, derV; |
|
|
|
//geomSurface->D0(paramPoint.x(), paramPoint.y(), initPt);
|
|
|
|
geomSurface->D1(paramPoint.x(), paramPoint.y(), initPt, derU, derV); |
|
|
|
Eigen::MatrixXd jacobMat; |
|
|
|
jacobMat.resize(3, 2); |
|
|
|
jacobMat(0, 0) = derU.X(); |
|
|
|
jacobMat(0, 1) = derV.X(); |
|
|
|
jacobMat(1, 0) = derU.Y(); |
|
|
|
jacobMat(1, 1) = derV.Y(); |
|
|
|
jacobMat(2, 0) = derU.Z(); |
|
|
|
jacobMat(2, 1) = derV.Z(); |
|
|
|
|
|
|
|
auto unitCandidates = SphereDiscretization<double, 2>::construct(1, shape.n_samples, gen); |
|
|
|
|
|
|
|
for(auto& uCand : unitCandidates) { |
|
|
|
double alpha = h(transPnt(initPt)) / (jacobMat * uCand).norm(); |
|
|
|
auto node = paramPoint + alpha * uCand; |
|
|
|
gp_Pnt2d nodePnt(node.x(), node.y()); |
|
|
|
|
|
|
|
//该参数点必须在参数域内
|
|
|
|
BRepClass_FaceClassifier brepF; |
|
|
|
brepF.Perform(face, nodePnt, 1e-6); |
|
|
|
if(brepF.State() == TopAbs_State::TopAbs_IN) { |
|
|
|
//std::cout << "TopAbs_IN\n";
|
|
|
|
} |
|
|
|
if(brepF.State() == TopAbs_State::TopAbs_ON) { |
|
|
|
//std::cout << "TopAbs_ON\n";
|
|
|
|
continue; |
|
|
|
} |
|
|
|
if(brepF.State() == TopAbs_State::TopAbs_OUT) { |
|
|
|
//std::cout << "TopAbs_OUT\n";
|
|
|
|
continue; |
|
|
|
} |
|
|
|
if(brepF.State() == TopAbs_State::TopAbs_UNKNOWN) { |
|
|
|
//std::cout << "TopAbs_UNKNOWN\n";
|
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
gp_Pnt newPt; |
|
|
|
gp_Vec derU, derV; |
|
|
|
geomSurface->D1(node.x(), node.y(), newPt, derU, derV); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double d_sq = treeGlobal.query(transPnt(newPt)).second[0]; |
|
|
|
double checkradius = newPt.SquareDistance(initPt); |
|
|
|
if(d_sq < (shape.zeta * shape.zeta * checkradius)) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
domainParamLocalPatch.addInternalNode(node, 1); |
|
|
|
treeGlobal.insert(transPnt(newPt)); |
|
|
|
gp_Dir normal; |
|
|
|
auto retStatus = GeomLib::NormEstim(geomSurface, nodePnt, 1e-6, normal); |
|
|
|
if(retStatus >= 2) { |
|
|
|
std::cout << "calculate wrong!\n"; |
|
|
|
exit(-1); |
|
|
|
} |
|
|
|
if(reverseNormal) { |
|
|
|
normal = -normal; |
|
|
|
} |
|
|
|
domainGlobal.addBoundaryNode(transPnt(newPt), type, transVec(normal)); |
|
|
|
endNode++; |
|
|
|
} |
|
|
|
curNode++; |
|
|
|
} |
|
|
|
if(endNode >= shape.max_points_boundary) { |
|
|
|
std::cerr << "Maximum number of points reached, fill may be incomplete." << std::endl; |
|
|
|
} |
|
|
|
} |
|
|
|
return domainGlobal; |
|
|
|
} |
|
|
|
|
|
|
|
}; |