+ rename methods in Vector3 class

+ add convenience methods Cross and Dot to Vector3 class
+ fix bug in DistanceToLineSegment in Vector3 class
This commit is contained in:
wmayer
2016-07-30 15:14:47 +02:00
parent 5c095de599
commit 1e2e24b652
18 changed files with 241 additions and 212 deletions

View File

@@ -252,7 +252,7 @@ bool MeshGeomFacet::IsPointOf (const Base::Vector3f &rclPoint, float fDistance)
float fLP, fLE;
clNorm.Normalize();
clProjPt.ProjToPlane(_aclPoints[0], clNorm);
clProjPt.ProjectToPlane(_aclPoints[0], clNorm);
// Kante P0 --> P1
@@ -351,7 +351,7 @@ bool MeshGeomFacet::Weights(const Base::Vector3f& rclP, float& w0, float& w1, fl
void MeshGeomFacet::ProjectPointToPlane (Base::Vector3f &rclPoint) const
{
rclPoint.ProjToPlane(_aclPoints[0], GetNormal());
rclPoint.ProjectToPlane(_aclPoints[0], GetNormal());
}
void MeshGeomFacet::ProjectFacetToPlane (MeshGeomFacet &rclFacet) const

View File

@@ -81,8 +81,8 @@ bool MeshOrientationCollector::Visit (const MeshFacet &rclFacet, const MeshFacet
// mark this facet as false oriented
rclFacet.SetFlag(MeshFacet::TMP0);
_aulIndices.push_back( ulFInd );
}
else
}
else
_aulComplement.push_back( ulFInd );
}
else {
@@ -93,8 +93,8 @@ bool MeshOrientationCollector::Visit (const MeshFacet &rclFacet, const MeshFacet
rclFacet.SetFlag(MeshFacet::TMP0);
_aulIndices.push_back(ulFInd);
}
else
_aulComplement.push_back( ulFInd );
else
_aulComplement.push_back( ulFInd );
}
return true;
@@ -129,26 +129,26 @@ MeshEvalOrientation::~MeshEvalOrientation()
bool MeshEvalOrientation::Evaluate ()
{
const MeshFacetArray& rFAry = _rclMesh.GetFacets();
MeshFacetArray::_TConstIterator iBeg = rFAry.begin();
MeshFacetArray::_TConstIterator iEnd = rFAry.end();
for (MeshFacetArray::_TConstIterator it = iBeg; it != iEnd; ++it) {
for (int i = 0; i < 3; i++) {
if (it->_aulNeighbours[i] != ULONG_MAX) {
const MeshFacet& rclFacet = iBeg[it->_aulNeighbours[i]];
for (int j = 0; j < 3; j++) {
if (it->_aulPoints[i] == rclFacet._aulPoints[j]) {
if ((it->_aulPoints[(i+1)%3] == rclFacet._aulPoints[(j+1)%3]) ||
(it->_aulPoints[(i+2)%3] == rclFacet._aulPoints[(j+2)%3])) {
return false; // adjacent face with wrong orientation
}
}
}
}
}
}
return true;
const MeshFacetArray& rFAry = _rclMesh.GetFacets();
MeshFacetArray::_TConstIterator iBeg = rFAry.begin();
MeshFacetArray::_TConstIterator iEnd = rFAry.end();
for (MeshFacetArray::_TConstIterator it = iBeg; it != iEnd; ++it) {
for (int i = 0; i < 3; i++) {
if (it->_aulNeighbours[i] != ULONG_MAX) {
const MeshFacet& rclFacet = iBeg[it->_aulNeighbours[i]];
for (int j = 0; j < 3; j++) {
if (it->_aulPoints[i] == rclFacet._aulPoints[j]) {
if ((it->_aulPoints[(i+1)%3] == rclFacet._aulPoints[(j+1)%3]) ||
(it->_aulPoints[(i+2)%3] == rclFacet._aulPoints[(j+2)%3])) {
return false; // adjacent face with wrong orientation
}
}
}
}
}
}
return true;
}
unsigned long MeshEvalOrientation::HasFalsePositives(const std::vector<unsigned long>& inds) const
@@ -159,26 +159,26 @@ unsigned long MeshEvalOrientation::HasFalsePositives(const std::vector<unsigned
// a false positive.
// False-positives can occur if the mesh structure has some defects which let the region-grow
// algorithm fail to detect the faces with wrong orientation.
const MeshFacetArray& rFAry = _rclMesh.GetFacets();
MeshFacetArray::_TConstIterator iBeg = rFAry.begin();
for (std::vector<unsigned long>::const_iterator it = inds.begin(); it != inds.end(); ++it) {
const MeshFacet& f = iBeg[*it];
for (int i = 0; i < 3; i++) {
if (f._aulNeighbours[i] != ULONG_MAX) {
const MeshFacet& n = iBeg[f._aulNeighbours[i]];
if (f.IsFlag(MeshFacet::TMP0) && !n.IsFlag(MeshFacet::TMP0)) {
for (int j = 0; j < 3; j++) {
if (f.HasSameOrientation(n)) {
// adjacent face with same orientation => false positive
return f._aulNeighbours[i];
}
}
}
}
}
}
return ULONG_MAX;
const MeshFacetArray& rFAry = _rclMesh.GetFacets();
MeshFacetArray::_TConstIterator iBeg = rFAry.begin();
for (std::vector<unsigned long>::const_iterator it = inds.begin(); it != inds.end(); ++it) {
const MeshFacet& f = iBeg[*it];
for (int i = 0; i < 3; i++) {
if (f._aulNeighbours[i] != ULONG_MAX) {
const MeshFacet& n = iBeg[f._aulNeighbours[i]];
if (f.IsFlag(MeshFacet::TMP0) && !n.IsFlag(MeshFacet::TMP0)) {
for (int j = 0; j < 3; j++) {
if (f.HasSameOrientation(n)) {
// adjacent face with same orientation => false positive
return f._aulNeighbours[i];
}
}
}
}
}
}
return ULONG_MAX;
}
std::vector<unsigned long> MeshEvalOrientation::GetIndices() const
@@ -204,19 +204,19 @@ std::vector<unsigned long> MeshEvalOrientation::GetIndices() const
MeshOrientationCollector clHarmonizer(uIndices, uComplement);
while (ulStartFacet != ULONG_MAX) {
unsigned long wrongFacets = uIndices.size();
uComplement.clear();
unsigned long wrongFacets = uIndices.size();
uComplement.clear();
uComplement.push_back( ulStartFacet );
ulVisited = _rclMesh.VisitNeighbourFacets(clHarmonizer, ulStartFacet) + 1;
// In the currently visited component we have found less than 40% as correct
// oriented and the rest as false oriented. So, we decide that it should be the other
// way round and swap the indices of this component.
if (uComplement.size() < (unsigned long)(0.4f*(float)ulVisited)) {
uIndices.erase(uIndices.begin()+wrongFacets, uIndices.end());
uIndices.insert(uIndices.end(), uComplement.begin(), uComplement.end());
}
// In the currently visited component we have found less than 40% as correct
// oriented and the rest as false oriented. So, we decide that it should be the other
// way round and swap the indices of this component.
if (uComplement.size() < (unsigned long)(0.4f*(float)ulVisited)) {
uIndices.erase(uIndices.begin()+wrongFacets, uIndices.end());
uIndices.insert(uIndices.end(), uComplement.begin(), uComplement.end());
}
// if the mesh consists of several topologic independent components
// We can search from position 'iTri' on because all elements _before_ are already visited
@@ -240,14 +240,14 @@ std::vector<unsigned long> MeshEvalOrientation::GetIndices() const
MeshSameOrientationCollector coll(falsePos);
_rclMesh.VisitNeighbourFacets(coll, ulStartFacet);
std::sort(uIndices.begin(), uIndices.end());
std::sort(falsePos.begin(), falsePos.end());
std::vector<unsigned long> diff;
std::back_insert_iterator<std::vector<unsigned long> > biit(diff);
std::set_difference(uIndices.begin(), uIndices.end(), falsePos.begin(), falsePos.end(), biit);
uIndices = diff;
std::sort(uIndices.begin(), uIndices.end());
std::sort(falsePos.begin(), falsePos.end());
std::vector<unsigned long> diff;
std::back_insert_iterator<std::vector<unsigned long> > biit(diff);
std::set_difference(uIndices.begin(), uIndices.end(), falsePos.begin(), falsePos.end(), biit);
uIndices = diff;
cAlg.ResetFacetFlag(MeshFacet::TMP0);
cAlg.SetFacetsFlag(uIndices, MeshFacet::TMP0);
unsigned long current = ulStartFacet;
@@ -299,32 +299,32 @@ bool MeshEvalSolid::Evaluate ()
}
// ----------------------------------------------------
namespace MeshCore {
struct Edge_Index
{
unsigned long p0, p1, f;
};
struct Edge_Less : public std::binary_function<const Edge_Index&,
const Edge_Index&, bool>
{
bool operator()(const Edge_Index& x, const Edge_Index& y) const
{
if (x.p0 < y.p0)
return true;
else if (x.p0 > y.p0)
return false;
else if (x.p1 < y.p1)
return true;
else if (x.p1 > y.p1)
return false;
return false;
}
};
}
namespace MeshCore {
struct Edge_Index
{
unsigned long p0, p1, f;
};
struct Edge_Less : public std::binary_function<const Edge_Index&,
const Edge_Index&, bool>
{
bool operator()(const Edge_Index& x, const Edge_Index& y) const
{
if (x.p0 < y.p0)
return true;
else if (x.p0 > y.p0)
return false;
else if (x.p1 < y.p1)
return true;
else if (x.p1 > y.p1)
return false;
return false;
}
};
}
bool MeshEvalTopology::Evaluate ()
{
@@ -463,29 +463,29 @@ bool MeshEvalPointManifolds::Evaluate ()
this->nonManifoldPoints.clear();
this->facetsOfNonManifoldPoints.clear();
MeshCore::MeshRefPointToPoints vv_it(_rclMesh);
MeshCore::MeshRefPointToFacets vf_it(_rclMesh);
unsigned long ctPoints = _rclMesh.CountPoints();
for (unsigned long index=0; index < ctPoints; index++) {
// get the local neighbourhood of the point
const std::set<unsigned long>& nf = vf_it[index];
const std::set<unsigned long>& np = vv_it[index];
std::set<unsigned long>::size_type sp, sf;
sp = np.size();
sf = nf.size();
// for an inner point the number of adjacent points is equal to the number of shared faces
// for a boundary point the number of adjacent points is higher by one than the number of shared faces
// for a non-manifold point the number of adjacent points is higher by more than one than the number of shared faces
if (sp > sf + 1) {
nonManifoldPoints.push_back(index);
std::vector<unsigned long> faces;
faces.insert(faces.end(), nf.begin(), nf.end());
this->facetsOfNonManifoldPoints.push_back(faces);
}
}
MeshCore::MeshRefPointToPoints vv_it(_rclMesh);
MeshCore::MeshRefPointToFacets vf_it(_rclMesh);
unsigned long ctPoints = _rclMesh.CountPoints();
for (unsigned long index=0; index < ctPoints; index++) {
// get the local neighbourhood of the point
const std::set<unsigned long>& nf = vf_it[index];
const std::set<unsigned long>& np = vv_it[index];
std::set<unsigned long>::size_type sp, sf;
sp = np.size();
sf = nf.size();
// for an inner point the number of adjacent points is equal to the number of shared faces
// for a boundary point the number of adjacent points is higher by one than the number of shared faces
// for a non-manifold point the number of adjacent points is higher by more than one than the number of shared faces
if (sp > sf + 1) {
nonManifoldPoints.push_back(index);
std::vector<unsigned long> faces;
faces.insert(faces.end(), nf.begin(), nf.end());
this->facetsOfNonManifoldPoints.push_back(faces);
}
}
return this->nonManifoldPoints.empty();
}
@@ -658,8 +658,8 @@ bool MeshEvalSelfIntersection::Evaluate ()
return true;
}
void MeshEvalSelfIntersection::GetIntersections(const std::vector<std::pair<unsigned long, unsigned long> >& indices,
std::vector<std::pair<Base::Vector3f, Base::Vector3f> >& intersection) const
void MeshEvalSelfIntersection::GetIntersections(const std::vector<std::pair<unsigned long, unsigned long> >& indices,
std::vector<std::pair<Base::Vector3f, Base::Vector3f> >& intersection) const
{
intersection.reserve(indices.size());
MeshFacetIterator cMF1(_rclMesh);
@@ -682,7 +682,7 @@ void MeshEvalSelfIntersection::GetIntersections(const std::vector<std::pair<unsi
}
}
void MeshEvalSelfIntersection::GetIntersections(std::vector<std::pair<unsigned long, unsigned long> >& intersection) const
void MeshEvalSelfIntersection::GetIntersections(std::vector<std::pair<unsigned long, unsigned long> >& intersection) const
{
// Contains bounding boxes for every facet
std::vector<Base::BoundBox3f> boxes;
@@ -751,8 +751,8 @@ void MeshEvalSelfIntersection::GetIntersections(std::vector<std::pair<unsigned l
}
}
}
std::vector<unsigned long> MeshFixSelfIntersection::GetFacets() const
std::vector<unsigned long> MeshFixSelfIntersection::GetFacets() const
{
std::vector<unsigned long> indices;
const MeshFacetArray& rFaces = _rclMesh.GetFacets();
@@ -780,9 +780,9 @@ std::vector<unsigned long> MeshFixSelfIntersection::GetFacets() const
indices.erase(std::unique(indices.begin(), indices.end()), indices.end());
return indices;
}
}
bool MeshFixSelfIntersection::Fixup()
bool MeshFixSelfIntersection::Fixup()
{
_rclMesh.DeleteFacets(GetFacets());
return true;
@@ -942,9 +942,9 @@ bool MeshFixNeighbourhood::Fixup()
_rclMesh.RebuildNeighbours();
return true;
}
void MeshKernel::RebuildNeighbours (unsigned long index)
{
void MeshKernel::RebuildNeighbours (unsigned long index)
{
std::vector<Edge_Index> edges;
edges.reserve(3 * (this->_aclFacetArray.size() - index));
@@ -1012,13 +1012,13 @@ void MeshKernel::RebuildNeighbours (unsigned long index)
unsigned short side = rFace.Side(p0,p1);
rFace._aulNeighbours[side] = ULONG_MAX;
}
}
void MeshKernel::RebuildNeighbours (void)
{
// complete rebuild
RebuildNeighbours(0);
}
}
void MeshKernel::RebuildNeighbours (void)
{
// complete rebuild
RebuildNeighbours(0);
}
// ----------------------------------------------------------------
@@ -1070,7 +1070,7 @@ bool MeshEigensystem::Evaluate()
for (MeshPointArray::_TConstIterator it = aclPoints.begin(); it!=aclPoints.end(); ++it) {
// u-Richtung
clVect = *it - _cC;
clProj.ProjToLine(clVect, _cU);
clProj.ProjectToLine(clVect, _cU);
clVect = clVect + clProj;
fH = clVect.Length();
@@ -1083,7 +1083,7 @@ bool MeshEigensystem::Evaluate()
// v-Richtung
clVect = *it - _cC;
clProj.ProjToLine(clVect, _cV);
clProj.ProjectToLine(clVect, _cV);
clVect = clVect + clProj;
fH = clVect.Length();
@@ -1096,7 +1096,7 @@ bool MeshEigensystem::Evaluate()
// w-Richtung
clVect = *it - _cC;
clProj.ProjToLine(clVect, _cW);
clProj.ProjectToLine(clVect, _cW);
clVect = clVect + clProj;
fH = clVect.Length();

View File

@@ -303,7 +303,7 @@ bool MeshProjection::isPointInsideDistance (const Base::Vector3f& p1,
// project point on line
Base::Vector3f proj, dir(p2 - p1);
Base::Vector3f move(pt - p1);
proj.ProjToLine(move, dir);
proj.ProjectToLine(move, dir);
proj = pt + proj;
return (((p1 - proj) * (p2 - proj)) < 0.0f);
}

View File

@@ -3537,8 +3537,8 @@ bool findFilletCenter(const GeomLineSegment *lineSeg1, const GeomLineSegment *li
// Just project the given reference points onto the lines, just in case they are not already lying on
Base::Vector3d normPnt1, normPnt2;
normPnt1.ProjToLine(refPnt1-l1p1, l1p2-l1p1);
normPnt2.ProjToLine(refPnt2-l2p1, l2p2-l2p1);
normPnt1.ProjectToLine(refPnt1-l1p1, l1p2-l1p1);
normPnt2.ProjectToLine(refPnt2-l2p1, l2p2-l2p1);
normPnt1 += refPnt1;
normPnt2 += refPnt2;
@@ -3587,8 +3587,8 @@ double suggestFilletRadius(const GeomLineSegment *lineSeg1, const GeomLineSegmen
Base::Vector3d dirBisect = (dir1.Normalize() + dir2.Normalize()).Normalize();
Base::Vector3d projPnt1, projPnt2;
projPnt1.ProjToLine(refPnt1-corner, dir1);
projPnt2.ProjToLine(refPnt2-corner, dir2);
projPnt1.ProjectToLine(refPnt1-corner, dir1);
projPnt2.ProjectToLine(refPnt2-corner, dir2);
projPnt1 += refPnt1;
projPnt2 += refPnt2;
@@ -3617,8 +3617,8 @@ GeomArcOfCircle *createFilletGeometry(const GeomLineSegment *lineSeg1, const Geo
Base::Vector3d dir2 = lineSeg2->getEndPoint() - lineSeg2->getStartPoint();
Base::Vector3d radDir1, radDir2;
radDir1.ProjToLine(center - corner, dir1);
radDir2.ProjToLine(center - corner, dir2);
radDir1.ProjectToLine(center - corner, dir1);
radDir2.ProjectToLine(center - corner, dir2);
// Angle Variables
double startAngle, endAngle, range;

View File

@@ -89,7 +89,7 @@ bool ViewProviderMirror::setEdit(int ModNum)
Base::Vector3d base = mf->Base.getValue();
Base::Vector3d norm = mf->Normal.getValue();
Base::Vector3d cent = bbox.GetCenter();
base = cent.ProjToPlane(base, norm);
base = cent.ProjectToPlane(base, norm);
// setup the graph for editing the mirror plane
SoTransform* trans = new SoTransform;

View File

@@ -702,7 +702,7 @@ void ParameterCorrection::ProjectControlPointsOnPlane()
for (unsigned k=0;k<_usVCtrlpoints;k++) {
gp_Pnt pole = _vCtrlPntsOfSurf(j,k);
Base::Vector3d pnt(pole.X(), pole.Y(), pole.Z());
pnt.ProjToPlane(base, _clW);
pnt.ProjectToPlane(base, _clW);
pole.SetX(pnt.x);
pole.SetY(pnt.y);
pole.SetZ(pnt.z);

View File

@@ -962,8 +962,8 @@ int SketchObject::fillet(int GeoId1, int GeoId2,
delete arc;
return -1;
}
dist1.ProjToLine(arc->getStartPoint(/*emulateCCW=*/true)-intersection, dir1);
dist2.ProjToLine(arc->getStartPoint(/*emulateCCW=*/true)-intersection, dir2);
dist1.ProjectToLine(arc->getStartPoint(/*emulateCCW=*/true)-intersection, dir1);
dist2.ProjectToLine(arc->getStartPoint(/*emulateCCW=*/true)-intersection, dir2);
Part::Geometry *newgeo = dynamic_cast<Part::Geometry* >(arc);
filletId = addGeometry(newgeo);
if (filletId < 0) {

View File

@@ -759,7 +759,7 @@ public:
EditCurve[EditCurve.size()-1] = onSketchPos;
if (TransitionMode == TRANSITION_MODE_Tangent) {
Base::Vector2D Tangent(dirVec.x,dirVec.y);
EditCurve[1].ProjToLine(EditCurve[2] - EditCurve[0], Tangent);
EditCurve[1].ProjectToLine(EditCurve[2] - EditCurve[0], Tangent);
if (EditCurve[1] * Tangent < 0) {
EditCurve[1] = EditCurve[2];
suppressTransition = true;
@@ -770,7 +770,7 @@ public:
else if (TransitionMode == TRANSITION_MODE_Perpendicular_L ||
TransitionMode == TRANSITION_MODE_Perpendicular_R) {
Base::Vector2D Perpendicular(-dirVec.y,dirVec.x);
EditCurve[1].ProjToLine(EditCurve[2] - EditCurve[0], Perpendicular);
EditCurve[1].ProjectToLine(EditCurve[2] - EditCurve[0], Perpendicular);
EditCurve[1] = EditCurve[0] + EditCurve[1];
}
@@ -2452,7 +2452,7 @@ private:
Base::Vector2D cursor = Base::Vector2D(onSketchPos - f); // vector from f to cursor pos
// decompose cursor with a projection, then length of w_2 will give us b
Base::Vector2D w_1 = cursor;
w_1.ProjToLine(cursor, (periapsis - apoapsis)); // projection of cursor line onto apse line
w_1.ProjectToLine(cursor, (periapsis - apoapsis)); // projection of cursor line onto apse line
Base::Vector2D w_2 = (cursor - w_1);
b = w_2.Length();
@@ -2512,7 +2512,7 @@ private:
Base::Vector2D cursor = Base::Vector2D(onSketchPos - centroid); // vector from centroid to cursor pos
// decompose cursor with a projection, then length of w_2 will give us b
Base::Vector2D w_1 = cursor;
w_1.ProjToLine(cursor, (fixedAxis - centroid)); // projection of cursor line onto fixed axis line
w_1.ProjectToLine(cursor, (fixedAxis - centroid)); // projection of cursor line onto fixed axis line
Base::Vector2D w_2 = (cursor - w_1);
if (w_2.Length() > fixedAxisLength) {
// b is fixed, we are seeking a

View File

@@ -263,7 +263,7 @@ int DrawSketchHandler::seekAutoConstraint(std::vector<AutoConstraint> &suggested
continue;
Base::Vector3d projPnt(0.f, 0.f, 0.f);
projPnt = projPnt.ProjToLine(center - tmpPos, tmpDir);
projPnt = projPnt.ProjectToLine(center - tmpPos, tmpDir);
double projDist = std::abs(projPnt.Length() - radius);
// Find if nearest
@@ -311,7 +311,7 @@ int DrawSketchHandler::seekAutoConstraint(std::vector<AutoConstraint> &suggested
continue;
Base::Vector3d projPnt(0.f, 0.f, 0.f);
projPnt = projPnt.ProjToLine(center - tmpPos, tmpDir);
projPnt = projPnt.ProjectToLine(center - tmpPos, tmpDir);
double projDist = std::abs(projPnt.Length() - radius);
if (projDist < tangDeviation) {

View File

@@ -1204,7 +1204,7 @@ void ViewProviderSketch::moveConstraint(int constNum, const Base::Vector2D &toPo
Base::Vector3d l2p1 = lineSeg->getStartPoint();
Base::Vector3d l2p2 = lineSeg->getEndPoint();
// calculate the projection of p1 onto line2
p2.ProjToLine(p1-l2p1, l2p2-l2p1);
p2.ProjectToLine(p1-l2p1, l2p2-l2p1);
p2 += p1;
} else
return;
@@ -3516,7 +3516,7 @@ Restart:
Base::Vector3d l2p1 = lineSeg->getStartPoint();
Base::Vector3d l2p2 = lineSeg->getEndPoint();
// calculate the projection of p1 onto line2
pnt2.ProjToLine(pnt1-l2p1, l2p2-l2p1);
pnt2.ProjectToLine(pnt1-l2p1, l2p2-l2p1);
pnt2 += pnt1;
} else
break;

View File

@@ -164,7 +164,7 @@ App::DocumentObjectExecReturn *DrawViewSection::execute(void)
// Project each bounding box point onto projection plane and find larges u,v values
Base::Vector3d pnt = (*it);
pnt.ProjToPlane(plnPnt, plnNorm);
pnt.ProjectToPlane(plnPnt, plnNorm);
uMax = std::max(uMax, std::abs(plnPnt[0] - pnt[0]));
vMax = std::max(vMax, std::abs(plnPnt[1] - pnt[1]));

View File

@@ -1190,8 +1190,8 @@ void QGIViewDimension::draw()
Base::Vector3d avg = (norm1 + norm2) / 2.;
norm1 = norm1.ProjToLine(avg, norm1);
norm2 = norm2.ProjToLine(avg, norm2);
norm1 = norm1.ProjectToLine(avg, norm1);
norm2 = norm2.ProjectToLine(avg, norm2);
ar1->setPos(ar1Pos.x,ar1Pos.y );
ar2->setPos(ar2Pos.x,ar2Pos.y );