Some error corrections, some additions to polygon stuff, making PolyPolygonCutter work

This commit is contained in:
Armin Weiss 2003-11-10 10:45:52 +00:00
parent e7fb8a71b6
commit ff3c6dbe35
16 changed files with 203 additions and 88 deletions

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b3dhompoint.hxx,v $
*
* $Revision: 1.3 $
* $Revision: 1.4 $
*
* last change: $Author: aw $ $Date: 2003-11-06 16:30:24 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:47 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -375,9 +375,9 @@ namespace basegfx
inline B3DHomPoint interpolate(B3DHomPoint& rOld1, B3DHomPoint& rOld2, double t)
{
B3DHomPoint aInt(
((rOld2.getX() - rOld1.getX()) + t) + rOld1.getX(),
((rOld2.getY() - rOld1.getY()) + t) + rOld1.getY(),
((rOld2.getZ() - rOld1.getZ()) + t) + rOld1.getZ());
((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(),
((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY(),
((rOld2.getZ() - rOld1.getZ()) * t) + rOld1.getZ());
return aInt;
}

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dpolygon.hxx,v $
*
* $Revision: 1.3 $
* $Revision: 1.4 $
*
* last change: $Author: aw $ $Date: 2003-11-06 16:30:24 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:47 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -157,10 +157,6 @@ namespace basegfx
// remove double points, at the begin/end and follow-ups, too
void removeDoublePoints();
// isInside tests for B2dPoint and other B2dPolygon. On border is not inside.
sal_Bool isInside(const ::basegfx::point::B2DPoint& rPoint);
sal_Bool isInside(const B2DPolygon& rPolygon);
};
} // end of namespace polygon
} // end of namespace basegfx

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dpolygontools.hxx,v $
*
* $Revision: 1.3 $
* $Revision: 1.4 $
*
* last change: $Author: aw $ $Date: 2003-11-06 16:30:24 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:47 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -120,9 +120,10 @@ namespace basegfx
// Get orientation of Polygon
::basegfx::vector::B2DVectorOrientation getOrientation(const ::basegfx::polygon::B2DPolygon& rCandidate);
// isInside tests for B2dPoint and other B2dPolygon. On border is not inside.
sal_Bool isInside(const ::basegfx::polygon::B2DPolygon& rCandidate, const ::basegfx::point::B2DPoint& rPoint);
sal_Bool isInside(const ::basegfx::polygon::B2DPolygon& rCandidate, const ::basegfx::polygon::B2DPolygon& rPolygon);
// isInside tests for B2dPoint and other B2dPolygon. On border is not inside as long as
// not sal_True is given in bWithBorder flag.
sal_Bool isInside(const ::basegfx::polygon::B2DPolygon& rCandidate, const ::basegfx::point::B2DPoint& rPoint, sal_Bool bWithBorder = sal_False);
sal_Bool isInside(const ::basegfx::polygon::B2DPolygon& rCandidate, const ::basegfx::polygon::B2DPolygon& rPolygon, sal_Bool bWithBorder = sal_False);
// get size of polygon
::basegfx::range::B2DRange getRange(const ::basegfx::polygon::B2DPolygon& rCandidate);
@ -149,6 +150,9 @@ namespace basegfx
// get orientation at given polygon point
::basegfx::vector::B2DVectorOrientation getPointOrientation(const ::basegfx::polygon::B2DPolygon& rCandidate, sal_uInt32 nIndex);
// Continuity check for point with given index
::basegfx::vector::B2DVectorContinuity getContinuityInPoint(const ::basegfx::polygon::B2DPolygon& rCandidate, sal_uInt32 nIndex);
// Definitions for the cut flags used from the findCut methods
typedef sal_uInt16 CutFlagValue;

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dpolypolygon.hxx,v $
*
* $Revision: 1.3 $
* $Revision: 1.4 $
*
* last change: $Author: aw $ $Date: 2003-11-06 16:30:25 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:48 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -110,6 +110,9 @@ namespace basegfx
B2DPolygon getPolygon(sal_uInt32 nIndex) const;
void setPolygon(sal_uInt32 nIndex, const B2DPolygon& rPolygon);
// test for curve
sal_Bool areControlPointsUsed() const;
// insert/append single polygon
void insert(sal_uInt32 nIndex, const B2DPolygon& rPolygon, sal_uInt32 nCount = 1);
void append(const B2DPolygon& rPolygon, sal_uInt32 nCount = 1);

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dpolypolygoncutter.hxx,v $
*
* $Revision: 1.1 $
* $Revision: 1.2 $
*
* last change: $Author: aw $ $Date: 2003-11-06 16:28:48 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:48 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -125,8 +125,10 @@ namespace basegfx
void swapOrientation();
::basegfx::range::B2DRange getRange() const;
sal_Bool isInside(const ::basegfx::point::B2DPoint& rPnt) const;
sal_Bool isPolygonInside(B2DPolygonNode* pPoly) const;
// isInside tests for B2dPoint and other B2DPolygonNode Polygon. On border is not inside as long as
// not sal_True is given in bWithBorder flag.
sal_Bool isInside(const ::basegfx::point::B2DPoint& rPnt, sal_Bool bWithBorder = sal_False) const;
sal_Bool isPolygonInside(B2DPolygonNode* pPoly, sal_Bool bWithBorder = sal_False) const;
};
// a type definition to have a vector of pointers to B2DPolygonNodes

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dtuple.hxx,v $
*
* $Revision: 1.2 $
* $Revision: 1.3 $
*
* last change: $Author: aw $ $Date: 2003-11-05 12:25:45 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:48 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -290,8 +290,8 @@ namespace basegfx
inline B2DTuple interpolate(const B2DTuple& rOld1, const B2DTuple& rOld2, double t)
{
B2DTuple aInt(
((rOld2.getX() - rOld1.getX()) + t) + rOld1.getX(),
((rOld2.getY() - rOld1.getY()) + t) + rOld1.getY());
((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(),
((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY());
return aInt;
}

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b3dtuple.hxx,v $
*
* $Revision: 1.2 $
* $Revision: 1.3 $
*
* last change: $Author: aw $ $Date: 2003-11-05 12:25:46 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:49 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -374,9 +374,9 @@ namespace basegfx
inline B3DTuple interpolate(const B3DTuple& rOld1, const B3DTuple& rOld2, double t)
{
B3DTuple aInt(
((rOld2.getX() - rOld1.getX()) + t) + rOld1.getX(),
((rOld2.getY() - rOld1.getY()) + t) + rOld1.getY(),
((rOld2.getZ() - rOld1.getZ()) + t) + rOld1.getZ());
((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(),
((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY(),
((rOld2.getZ() - rOld1.getZ()) * t) + rOld1.getZ());
return aInt;
}

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dvector.hxx,v $
*
* $Revision: 1.3 $
* $Revision: 1.4 $
*
* last change: $Author: aw $ $Date: 2003-11-06 16:30:26 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:49 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -90,6 +90,20 @@ namespace basegfx
ORIENTATION_NEUTRAL
};
/** Descriptor for the mathematical continuity of two 2D Vectors
*/
enum B2DVectorContinuity
{
/// none
CONTINUITY_NONE = 0,
/// mathematically negative oriented
CONTINUITY_C1,
/// mathematically neutral, thus parallel
CONTINUITY_C2
};
/** Base Point class with two double values
This class derives all operators and common handling for
@ -244,6 +258,14 @@ namespace basegfx
matrix are disregarded.
*/
B2DVector operator*( const matrix::B2DHomMatrix& rMat, const B2DVector& rVec );
/** Test continuity between given vectors.
The two given vectors are assumed to describe control points on a
common point. Calculate if there is a continuity between them.
*/
::basegfx::vector::B2DVectorContinuity getContinuity( const B2DVector& rBackVector, const B2DVector& rForwardVector );
} // end of namespace vector
} // end of namespace basegfx

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dhompoint.cxx,v $
*
* $Revision: 1.3 $
* $Revision: 1.4 $
*
* last change: $Author: aw $ $Date: 2003-11-05 12:25:53 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:49 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -228,8 +228,8 @@ namespace basegfx
B2DHomPoint interpolate(B2DHomPoint& rOld1, B2DHomPoint& rOld2, double t)
{
B2DHomPoint aInt(
((rOld2.getX() - rOld1.getX()) + t) + rOld1.getX(),
((rOld2.getY() - rOld1.getY()) + t) + rOld1.getY());
((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(),
((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY());
return aInt;
}

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dpolygon.cxx,v $
*
* $Revision: 1.4 $
* $Revision: 1.5 $
*
* last change: $Author: aw $ $Date: 2003-11-06 16:30:29 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:50 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -118,6 +118,10 @@ public:
{
}
~CoordinateDataArray2D()
{
}
sal_uInt32 count() const
{
return maVector.size();
@ -182,7 +186,7 @@ public:
{
const sal_uInt32 nHalfSize(maVector.size() >> 1L);
CoordinateData2DVector::iterator aStart(maVector.begin());
CoordinateData2DVector::iterator aEnd(maVector.end());
CoordinateData2DVector::iterator aEnd(maVector.end() - 1L);
for(sal_uInt32 a(0); a < nHalfSize; a++)
{
@ -290,6 +294,10 @@ public:
}
}
~ControlVectorArray2D()
{
}
sal_uInt32 count() const
{
return maVector.size();
@ -1137,7 +1145,7 @@ namespace basegfx
void B2DPolygon::remove(sal_uInt32 nIndex, sal_uInt32 nCount)
{
DBG_ASSERT(nIndex + nCount > mpPolygon->count(), "B2DPolygon Remove outside range (!)");
DBG_ASSERT(nIndex + nCount <= mpPolygon->count(), "B2DPolygon Remove outside range (!)");
if(nCount)
{

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dpolygontools.cxx,v $
*
* $Revision: 1.4 $
* $Revision: 1.5 $
*
* last change: $Author: aw $ $Date: 2003-11-06 16:30:29 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:50 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -86,15 +86,11 @@ namespace basegfx
// B2DPolygon tools
void checkClosed(polygon::B2DPolygon& rCandidate)
{
while(rCandidate.count() > 1L)
while(rCandidate.count() > 1L
&& rCandidate.getB2DPoint(0L).equal(rCandidate.getB2DPoint(rCandidate.count() - 1L)))
{
sal_Bool bFirstLastPointEqual(rCandidate.getB2DPoint(0L).equal(rCandidate.getB2DPoint(rCandidate.count() - 1L)));
if(bFirstLastPointEqual)
{
rCandidate.setClosed(sal_True);
rCandidate.remove(rCandidate.count() - 1L);
}
rCandidate.setClosed(sal_True);
rCandidate.remove(rCandidate.count() - 1L);
}
}
@ -134,6 +130,8 @@ namespace basegfx
// is none. Same for successor.
sal_uInt32 getIndexOfPredecessor(sal_uInt32 nIndex, const ::basegfx::polygon::B2DPolygon& rCandidate)
{
DBG_ASSERT(nIndex < rCandidate.count(), "getIndexOfPredecessor: Access to polygon out of range (!)");
if(nIndex)
{
return nIndex - 1L;
@ -150,6 +148,8 @@ namespace basegfx
sal_uInt32 getIndexOfSuccessor(sal_uInt32 nIndex, const ::basegfx::polygon::B2DPolygon& rCandidate)
{
DBG_ASSERT(nIndex < rCandidate.count(), "getIndexOfPredecessor: Access to polygon out of range (!)");
if(nIndex + 1L < rCandidate.count())
{
return nIndex + 1L;
@ -162,9 +162,12 @@ namespace basegfx
sal_uInt32 getIndexOfDifferentPredecessor(sal_uInt32 nIndex, const ::basegfx::polygon::B2DPolygon& rCandidate)
{
sal_uInt32 nNewIndex(nIndex);
DBG_ASSERT(nIndex < rCandidate.count(), "getIndexOfPredecessor: Access to polygon out of range (!)");
if(rCandidate.count() > 1)
{
sal_uInt32 nNewIndex = getIndexOfPredecessor(nIndex, rCandidate);
nNewIndex = getIndexOfPredecessor(nIndex, rCandidate);
::basegfx::point::B2DPoint aPoint(rCandidate.getB2DPoint(nIndex));
while(nNewIndex != nIndex
@ -174,14 +177,17 @@ namespace basegfx
}
}
return nIndex;
return nNewIndex;
}
sal_uInt32 getIndexOfDifferentSuccessor(sal_uInt32 nIndex, const ::basegfx::polygon::B2DPolygon& rCandidate)
{
sal_uInt32 nNewIndex(nIndex);
DBG_ASSERT(nIndex < rCandidate.count(), "getIndexOfPredecessor: Access to polygon out of range (!)");
if(rCandidate.count() > 1)
{
sal_uInt32 nNewIndex = getIndexOfSuccessor(nIndex, rCandidate);
nNewIndex = getIndexOfSuccessor(nIndex, rCandidate);
::basegfx::point::B2DPoint aPoint(rCandidate.getB2DPoint(nIndex));
while(nNewIndex != nIndex
@ -191,7 +197,7 @@ namespace basegfx
}
}
return nIndex;
return nNewIndex;
}
::basegfx::vector::B2DVectorOrientation getOrientation(const ::basegfx::polygon::B2DPolygon& rCandidate)
@ -207,7 +213,24 @@ namespace basegfx
return eRetval;
}
sal_Bool isInside(const ::basegfx::polygon::B2DPolygon& rCandidate, const ::basegfx::point::B2DPoint& rPoint)
::basegfx::vector::B2DVectorContinuity getContinuityInPoint(const ::basegfx::polygon::B2DPolygon& rCandidate, sal_uInt32 nIndex)
{
DBG_ASSERT(nIndex < rCandidate.count(), "getIndexOfPredecessor: Access to polygon out of range (!)");
::basegfx::vector::B2DVectorContinuity eRetval(::basegfx::vector::CONTINUITY_NONE);
if(rCandidate.count() > 1L && rCandidate.areControlPointsUsed())
{
sal_uInt32 nPrevInd(getIndexOfPredecessor(nIndex, rCandidate));
const ::basegfx::vector::B2DVector aForwardVector(rCandidate.getControlVectorA(nIndex));
const ::basegfx::vector::B2DVector aBackVector(rCandidate.getControlVectorB(nPrevInd));
eRetval = ::basegfx::vector::getContinuity(aBackVector, aForwardVector);
}
return eRetval;
}
sal_Bool isInside(const ::basegfx::polygon::B2DPolygon& rCandidate, const ::basegfx::point::B2DPoint& rPoint, sal_Bool bWithBorder)
{
sal_Bool bRetval(sal_False);
const sal_uInt32 nPointCount(rCandidate.count());
@ -215,9 +238,14 @@ namespace basegfx
for(sal_uInt32 a(0L); a < nPointCount; a++)
{
const ::basegfx::point::B2DPoint aCurrentPoint(rCandidate.getB2DPoint(a));
const ::basegfx::point::B2DPoint aPreviousPoint(rCandidate.getB2DPoint((!a) ? nPointCount - 1L : a - 1L));
if(bWithBorder && aCurrentPoint.equal(rPoint))
{
return sal_True;
}
// cross-over in Y?
const ::basegfx::point::B2DPoint aPreviousPoint(rCandidate.getB2DPoint((!a) ? nPointCount - 1L : a - 1L));
const sal_Bool bCompYA(::basegfx::numeric::fTools::more(aPreviousPoint.getY(), rPoint.getY()));
const sal_Bool bCompYB(::basegfx::numeric::fTools::more(aCurrentPoint.getY(), rPoint.getY()));
@ -240,7 +268,11 @@ namespace basegfx
(aPreviousPoint.getX() - aCurrentPoint.getX()) /
(aPreviousPoint.getY() - aCurrentPoint.getY());
if(::basegfx::numeric::fTools::more(fCompare, rPoint.getX()))
if(bWithBorder && ::basegfx::numeric::fTools::more(fCompare, rPoint.getX()))
{
bRetval = !bRetval;
}
else if(::basegfx::numeric::fTools::moreOrEqual(fCompare, rPoint.getX()))
{
bRetval = !bRetval;
}
@ -251,7 +283,7 @@ namespace basegfx
return bRetval;
}
sal_Bool isInside(const ::basegfx::polygon::B2DPolygon& rCandidate, const ::basegfx::polygon::B2DPolygon& rPolygon)
sal_Bool isInside(const ::basegfx::polygon::B2DPolygon& rCandidate, const ::basegfx::polygon::B2DPolygon& rPolygon, sal_Bool bWithBorder)
{
const sal_uInt32 nPointCount(rPolygon.count());
@ -259,7 +291,7 @@ namespace basegfx
{
const ::basegfx::point::B2DPoint aTestPoint(rPolygon.getB2DPoint(a));
if(!isInside(rCandidate, aTestPoint))
if(!isInside(rCandidate, aTestPoint, bWithBorder))
{
return sal_False;
}
@ -313,6 +345,7 @@ namespace basegfx
double getEdgeLength(const ::basegfx::polygon::B2DPolygon& rCandidate, sal_uInt32 nIndex)
{
DBG_ASSERT(nIndex < rCandidate.count(), "getIndexOfPredecessor: Access to polygon out of range (!)");
double fRetval(0.0);
const sal_uInt32 nPointCount(rCandidate.count());
@ -476,6 +509,7 @@ namespace basegfx
::basegfx::vector::B2DVectorOrientation getPointOrientation(const ::basegfx::polygon::B2DPolygon& rCandidate, sal_uInt32 nIndex)
{
DBG_ASSERT(nIndex < rCandidate.count(), "getIndexOfPredecessor: Access to polygon out of range (!)");
::basegfx::vector::B2DVectorOrientation eRetval(::basegfx::vector::ORIENTATION_NEUTRAL);
if(rCandidate.count() > 2)

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dpolypolygon.cxx,v $
*
* $Revision: 1.4 $
* $Revision: 1.5 $
*
* last change: $Author: aw $ $Date: 2003-11-06 16:30:29 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:50 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -312,6 +312,21 @@ namespace basegfx
}
}
sal_Bool B2DPolyPolygon::areControlPointsUsed() const
{
for(sal_uInt32 a(0L); a < mpPolyPolygon->count(); a++)
{
const ::basegfx::polygon::B2DPolygon& rPolygon = mpPolyPolygon->getPolygon(a);
if(rPolygon.areControlPointsUsed())
{
return sal_True;
}
}
return sal_False;
}
void B2DPolyPolygon::insert(sal_uInt32 nIndex, const B2DPolygon& rPolygon, sal_uInt32 nCount)
{
DBG_ASSERT(nIndex <= mpPolyPolygon->count(), "B2DPolyPolygon Insert outside range (!)");
@ -354,7 +369,7 @@ namespace basegfx
void B2DPolyPolygon::remove(sal_uInt32 nIndex, sal_uInt32 nCount)
{
DBG_ASSERT(nIndex + nCount > mpPolyPolygon->count(), "B2DPolyPolygon Remove outside range (!)");
DBG_ASSERT(nIndex + nCount <= mpPolyPolygon->count(), "B2DPolyPolygon Remove outside range (!)");
if(nCount)
{

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dpolypolygoncutter.cxx,v $
*
* $Revision: 1.1 $
* $Revision: 1.2 $
*
* last change: $Author: aw $ $Date: 2003-11-06 16:29:33 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:51 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -242,21 +242,26 @@ namespace basegfx
return aRetval;
}
sal_Bool B2DPolygonNode::isInside(const ::basegfx::point::B2DPoint& rPnt) const
sal_Bool B2DPolygonNode::isInside(const ::basegfx::point::B2DPoint& rPoint, sal_Bool bWithBorder) const
{
sal_Bool bInside(sal_False);
const B2DPolygonNode* pCurrent = this;
do
{
if(bWithBorder && pCurrent->getPosition().equal(rPoint))
{
return sal_True;
}
B2DPolygonNode* pNext = pCurrent->getNext();
const sal_Bool bCompYA(::basegfx::numeric::fTools::more(pCurrent->getPosition().getY(), rPnt.getY()));
const sal_Bool bCompYB(::basegfx::numeric::fTools::more(pNext->getPosition().getY(), rPnt.getY()));
const sal_Bool bCompYA(::basegfx::numeric::fTools::more(pCurrent->getPosition().getY(), rPoint.getY()));
const sal_Bool bCompYB(::basegfx::numeric::fTools::more(pNext->getPosition().getY(), rPoint.getY()));
if(bCompYA != bCompYB)
{
const sal_Bool bCompXA(::basegfx::numeric::fTools::more(pCurrent->getPosition().getX(), rPnt.getX()));
const sal_Bool bCompXB(::basegfx::numeric::fTools::more(pNext->getPosition().getX(), rPnt.getX()));
const sal_Bool bCompXA(::basegfx::numeric::fTools::more(pCurrent->getPosition().getX(), rPoint.getX()));
const sal_Bool bCompXB(::basegfx::numeric::fTools::more(pNext->getPosition().getX(), rPoint.getX()));
if(bCompXA == bCompXB)
{
@ -268,11 +273,15 @@ namespace basegfx
else
{
double fCmp =
pNext->getPosition().getX() - (pNext->getPosition().getY() - rPnt.getY()) *
pNext->getPosition().getX() - (pNext->getPosition().getY() - rPoint.getY()) *
(pCurrent->getPosition().getX() - pNext->getPosition().getX()) /
(pCurrent->getPosition().getY() - pNext->getPosition().getY());
if(::basegfx::numeric::fTools::more(fCmp, rPnt.getX()))
if(bWithBorder && ::basegfx::numeric::fTools::more(fCmp, rPoint.getX()))
{
bInside = !bInside;
}
else if(::basegfx::numeric::fTools::moreOrEqual(fCmp, rPoint.getX()))
{
bInside = !bInside;
}
@ -287,13 +296,13 @@ namespace basegfx
return bInside;
}
sal_Bool B2DPolygonNode::isPolygonInside(B2DPolygonNode* pPoly) const
sal_Bool B2DPolygonNode::isPolygonInside(B2DPolygonNode* pPoly, sal_Bool bWithBorder) const
{
B2DPolygonNode* pTest = pPoly;
sal_Bool bAllAInside(sal_True);
do {
bAllAInside = isInside(pTest->getPosition());
bAllAInside = isInside(pTest->getPosition(), bWithBorder);
pTest = pTest->getNext();
} while(bAllAInside && pTest != pPoly);
@ -397,8 +406,8 @@ namespace basegfx
if(a != b && doRangesInclude(rInfoA.getRange(), rInfoB.getRange()))
{
// volume B in A, test pA, pB for inclusion
if(maPolygonList[a]->isPolygonInside(maPolygonList[b]))
// volume B in A, test pA, pB for inclusion, with border
if(maPolygonList[a]->isPolygonInside(maPolygonList[b], sal_True))
{
// pB is inside pA
rInfoB.changeDepth(rInfoA.getOrientation());
@ -567,10 +576,9 @@ namespace basegfx
if(nCount > 2L)
{
B2DPolygon aNewPolygon;
nCount = 0L;
do {
aNewPolygon.setB2DPoint(nCount++, pAct->getPosition());
aNewPolygon.append(pAct->getPosition());
pAct = pAct->getNext();
} while(pAct != pCand);

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dtuple.cxx,v $
*
* $Revision: 1.3 $
* $Revision: 1.4 $
*
* last change: $Author: aw $ $Date: 2003-11-05 12:25:56 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:51 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -72,7 +72,7 @@ namespace basegfx
namespace tuple
{
// initialize static member
B2DTuple B2DTuple::maEmptyTuple(0.0, 0.0);
::basegfx::tuple::B2DTuple B2DTuple::maEmptyTuple(0.0, 0.0);
sal_Bool B2DTuple::equalZero() const
{

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b3dtuple.cxx,v $
*
* $Revision: 1.2 $
* $Revision: 1.3 $
*
* last change: $Author: aw $ $Date: 2003-10-31 10:14:00 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:51 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -68,7 +68,7 @@ namespace basegfx
namespace tuple
{
// initialize static member
B3DTuple B3DTuple::maEmptyTuple(0.0, 0.0, 0.0);
::basegfx::tuple::B3DTuple B3DTuple::maEmptyTuple(0.0, 0.0, 0.0);
} // end of namespace tuple
} // end of namespace basegfx

View file

@ -2,9 +2,9 @@
*
* $RCSfile: b2dvector.cxx,v $
*
* $Revision: 1.4 $
* $Revision: 1.5 $
*
* last change: $Author: aw $ $Date: 2003-11-06 16:30:30 $
* last change: $Author: aw $ $Date: 2003-11-10 11:45:52 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -163,13 +163,13 @@ namespace basegfx
sal_Bool areParallel( const B2DVector& rVecA, const B2DVector& rVecB )
{
double fVal(rVecA.getX() * rVecB.getY() - rVecA.getY() * rVecA.getX());
double fVal(rVecA.getX() * rVecB.getY() - rVecA.getY() * rVecB.getX());
return ::basegfx::numeric::fTools::equalZero(fVal);
}
B2DVectorOrientation getOrientation( const B2DVector& rVecA, const B2DVector& rVecB )
{
double fVal(rVecA.getX() * rVecB.getY() - rVecA.getY() * rVecA.getX());
double fVal(rVecA.getX() * rVecB.getY() - rVecA.getY() * rVecB.getX());
if(fVal > 0.0)
{
@ -195,6 +195,29 @@ namespace basegfx
B2DVector aRes( rVec );
return aRes*=rMat;
}
::basegfx::vector::B2DVectorContinuity getContinuity(const B2DVector& rBackVector, const B2DVector& rForwardVector )
{
::basegfx::vector::B2DVectorContinuity eRetval(::basegfx::vector::CONTINUITY_NONE);
if(!rBackVector.equalZero() && !rForwardVector.equalZero())
{
const B2DVector aInverseForwardVector(-rForwardVector.getX(), -rForwardVector.getY());
if(rBackVector.equal(aInverseForwardVector))
{
// same direction and same length -> C2
eRetval = ::basegfx::vector::CONTINUITY_C2;
}
else if(areParallel(rBackVector, aInverseForwardVector))
{
// same direction -> C1
eRetval = ::basegfx::vector::CONTINUITY_C1;
}
}
return eRetval;
}
} // end of namespace vector
} // end of namespace basegfx