1*09dbbe93SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*09dbbe93SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*09dbbe93SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*09dbbe93SAndrew Rist * distributed with this work for additional information 6*09dbbe93SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*09dbbe93SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*09dbbe93SAndrew Rist * "License"); you may not use this file except in compliance 9*09dbbe93SAndrew Rist * with the License. You may obtain a copy of the License at 10*09dbbe93SAndrew Rist * 11*09dbbe93SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*09dbbe93SAndrew Rist * 13*09dbbe93SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*09dbbe93SAndrew Rist * software distributed under the License is distributed on an 15*09dbbe93SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*09dbbe93SAndrew Rist * KIND, either express or implied. See the License for the 17*09dbbe93SAndrew Rist * specific language governing permissions and limitations 18*09dbbe93SAndrew Rist * under the License. 19*09dbbe93SAndrew Rist * 20*09dbbe93SAndrew Rist *************************************************************/ 21*09dbbe93SAndrew Rist 22*09dbbe93SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_basegfx.hxx" 26cdf0e10cSrcweir #include <basegfx/point/b2dhompoint.hxx> 27cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrix.hxx> 28cdf0e10cSrcweir #include <basegfx/numeric/ftools.hxx> 29cdf0e10cSrcweir 30cdf0e10cSrcweir namespace basegfx 31cdf0e10cSrcweir { 32cdf0e10cSrcweir bool B2DHomPoint::implIsHomogenized() const 33cdf0e10cSrcweir { 34cdf0e10cSrcweir const double fOne(1.0); 35cdf0e10cSrcweir return ::basegfx::fTools::equal(fOne, mfW); 36cdf0e10cSrcweir } 37cdf0e10cSrcweir 38cdf0e10cSrcweir void B2DHomPoint::implHomogenize() 39cdf0e10cSrcweir { 40cdf0e10cSrcweir const double fFactor(1.0 / mfW); 41cdf0e10cSrcweir maTuple.setX(maTuple.getX() * fFactor); 42cdf0e10cSrcweir maTuple.setY(maTuple.getY() * fFactor); 43cdf0e10cSrcweir mfW = 1.0; 44cdf0e10cSrcweir } 45cdf0e10cSrcweir 46cdf0e10cSrcweir void B2DHomPoint::implTestAndHomogenize() const 47cdf0e10cSrcweir { 48cdf0e10cSrcweir if(!implIsHomogenized()) 49cdf0e10cSrcweir ((B2DHomPoint*)this)->implHomogenize(); 50cdf0e10cSrcweir } 51cdf0e10cSrcweir 52cdf0e10cSrcweir B2DPoint B2DHomPoint::getB2DPoint() const 53cdf0e10cSrcweir { 54cdf0e10cSrcweir implTestAndHomogenize(); 55cdf0e10cSrcweir return B2DPoint(maTuple.getX(), maTuple.getY()); 56cdf0e10cSrcweir } 57cdf0e10cSrcweir 58cdf0e10cSrcweir double B2DHomPoint::getX() const 59cdf0e10cSrcweir { 60cdf0e10cSrcweir implTestAndHomogenize(); 61cdf0e10cSrcweir return maTuple.getX(); 62cdf0e10cSrcweir } 63cdf0e10cSrcweir 64cdf0e10cSrcweir double B2DHomPoint::getY() const 65cdf0e10cSrcweir { 66cdf0e10cSrcweir implTestAndHomogenize(); 67cdf0e10cSrcweir return maTuple.getY(); 68cdf0e10cSrcweir } 69cdf0e10cSrcweir 70cdf0e10cSrcweir void B2DHomPoint::setX(double fX) 71cdf0e10cSrcweir { 72cdf0e10cSrcweir maTuple.setX(implIsHomogenized() ? fX : fX * mfW ); 73cdf0e10cSrcweir } 74cdf0e10cSrcweir 75cdf0e10cSrcweir void B2DHomPoint::setY(double fY) 76cdf0e10cSrcweir { 77cdf0e10cSrcweir maTuple.setY(implIsHomogenized() ? fY : fY * mfW ); 78cdf0e10cSrcweir } 79cdf0e10cSrcweir 80cdf0e10cSrcweir B2DHomPoint& B2DHomPoint::operator+=( const B2DHomPoint& rPnt ) 81cdf0e10cSrcweir { 82cdf0e10cSrcweir maTuple.setX(getX() * rPnt.mfW + rPnt.getX() * mfW); 83cdf0e10cSrcweir maTuple.setY(getY() * rPnt.mfW + rPnt.getY() * mfW); 84cdf0e10cSrcweir mfW = mfW * rPnt.mfW; 85cdf0e10cSrcweir 86cdf0e10cSrcweir return *this; 87cdf0e10cSrcweir } 88cdf0e10cSrcweir 89cdf0e10cSrcweir B2DHomPoint& B2DHomPoint::operator-=( const B2DHomPoint& rPnt ) 90cdf0e10cSrcweir { 91cdf0e10cSrcweir maTuple.setX(getX() * rPnt.mfW - rPnt.getX() * mfW); 92cdf0e10cSrcweir maTuple.setY(getY() * rPnt.mfW - rPnt.getY() * mfW); 93cdf0e10cSrcweir mfW = mfW * rPnt.mfW; 94cdf0e10cSrcweir 95cdf0e10cSrcweir return *this; 96cdf0e10cSrcweir } 97cdf0e10cSrcweir 98cdf0e10cSrcweir B2DHomPoint& B2DHomPoint::operator*=(double t) 99cdf0e10cSrcweir { 100cdf0e10cSrcweir if(!::basegfx::fTools::equalZero(t)) 101cdf0e10cSrcweir { 102cdf0e10cSrcweir mfW /= t; 103cdf0e10cSrcweir } 104cdf0e10cSrcweir 105cdf0e10cSrcweir return *this; 106cdf0e10cSrcweir } 107cdf0e10cSrcweir 108cdf0e10cSrcweir B2DHomPoint& B2DHomPoint::operator*=( const B2DHomMatrix& rMat ) 109cdf0e10cSrcweir { 110cdf0e10cSrcweir const double fTempX( rMat.get(0,0)*maTuple.getX() + 111cdf0e10cSrcweir rMat.get(0,1)*maTuple.getY() + 112cdf0e10cSrcweir rMat.get(0,2)*mfW ); 113cdf0e10cSrcweir 114cdf0e10cSrcweir const double fTempY( rMat.get(1,0)*maTuple.getX() + 115cdf0e10cSrcweir rMat.get(1,1)*maTuple.getY() + 116cdf0e10cSrcweir rMat.get(1,2)*mfW ); 117cdf0e10cSrcweir 118cdf0e10cSrcweir const double fTempZ( rMat.get(2,0)*maTuple.getX() + 119cdf0e10cSrcweir rMat.get(2,1)*maTuple.getY() + 120cdf0e10cSrcweir rMat.get(2,2)*mfW ); 121cdf0e10cSrcweir maTuple.setX( fTempX ); 122cdf0e10cSrcweir maTuple.setY( fTempY ); 123cdf0e10cSrcweir mfW = fTempZ; 124cdf0e10cSrcweir 125cdf0e10cSrcweir return *this; 126cdf0e10cSrcweir } 127cdf0e10cSrcweir 128cdf0e10cSrcweir B2DHomPoint& B2DHomPoint::operator/=(double t) 129cdf0e10cSrcweir { 130cdf0e10cSrcweir mfW *= t; 131cdf0e10cSrcweir return *this; 132cdf0e10cSrcweir } 133cdf0e10cSrcweir 134cdf0e10cSrcweir B2DHomPoint& B2DHomPoint::operator-(void) 135cdf0e10cSrcweir { 136cdf0e10cSrcweir mfW = -mfW; 137cdf0e10cSrcweir return *this; 138cdf0e10cSrcweir } 139cdf0e10cSrcweir 140cdf0e10cSrcweir bool B2DHomPoint::operator==( const B2DHomPoint& rPnt ) const 141cdf0e10cSrcweir { 142cdf0e10cSrcweir implTestAndHomogenize(); 143cdf0e10cSrcweir return (maTuple == rPnt.maTuple); 144cdf0e10cSrcweir } 145cdf0e10cSrcweir 146cdf0e10cSrcweir bool B2DHomPoint::operator!=( const B2DHomPoint& rPnt ) const 147cdf0e10cSrcweir { 148cdf0e10cSrcweir implTestAndHomogenize(); 149cdf0e10cSrcweir return (maTuple != rPnt.maTuple); 150cdf0e10cSrcweir } 151cdf0e10cSrcweir 152cdf0e10cSrcweir B2DHomPoint& B2DHomPoint::operator=( const B2DHomPoint& rPnt ) 153cdf0e10cSrcweir { 154cdf0e10cSrcweir maTuple = rPnt.maTuple; 155cdf0e10cSrcweir mfW = rPnt.mfW; 156cdf0e10cSrcweir return *this; 157cdf0e10cSrcweir } 158cdf0e10cSrcweir 159cdf0e10cSrcweir B2DHomPoint minimum(const B2DHomPoint& rVecA, const B2DHomPoint& rVecB) 160cdf0e10cSrcweir { 161cdf0e10cSrcweir B2DHomPoint aMin( 162cdf0e10cSrcweir (rVecB.getX() < rVecA.getX()) ? rVecB.getX() : rVecA.getX(), 163cdf0e10cSrcweir (rVecB.getY() < rVecA.getY()) ? rVecB.getY() : rVecA.getY()); 164cdf0e10cSrcweir return aMin; 165cdf0e10cSrcweir } 166cdf0e10cSrcweir 167cdf0e10cSrcweir B2DHomPoint maximum(const B2DHomPoint& rVecA, const B2DHomPoint& rVecB) 168cdf0e10cSrcweir { 169cdf0e10cSrcweir B2DHomPoint aMax( 170cdf0e10cSrcweir (rVecB.getX() > rVecA.getX()) ? rVecB.getX() : rVecA.getX(), 171cdf0e10cSrcweir (rVecB.getY() > rVecA.getY()) ? rVecB.getY() : rVecA.getY()); 172cdf0e10cSrcweir return aMax; 173cdf0e10cSrcweir } 174cdf0e10cSrcweir B2DHomPoint absolute(const B2DHomPoint& rVec) 175cdf0e10cSrcweir { 176cdf0e10cSrcweir B2DHomPoint aAbs( 177cdf0e10cSrcweir (0.0 > rVec.getX()) ? -rVec.getX() : rVec.getX(), 178cdf0e10cSrcweir (0.0 > rVec.getY()) ? -rVec.getY() : rVec.getY()); 179cdf0e10cSrcweir return aAbs; 180cdf0e10cSrcweir } 181cdf0e10cSrcweir 182cdf0e10cSrcweir B2DHomPoint interpolate(B2DHomPoint& rOld1, B2DHomPoint& rOld2, double t) 183cdf0e10cSrcweir { 184cdf0e10cSrcweir B2DHomPoint aInt( 185cdf0e10cSrcweir ((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(), 186cdf0e10cSrcweir ((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY()); 187cdf0e10cSrcweir return aInt; 188cdf0e10cSrcweir } 189cdf0e10cSrcweir 190cdf0e10cSrcweir B2DHomPoint average(B2DHomPoint& rOld1, B2DHomPoint& rOld2) 191cdf0e10cSrcweir { 192cdf0e10cSrcweir B2DHomPoint aAvg( 193cdf0e10cSrcweir (rOld1.getX() + rOld2.getX()) * 0.5, 194cdf0e10cSrcweir (rOld1.getY() + rOld2.getY()) * 0.5); 195cdf0e10cSrcweir return aAvg; 196cdf0e10cSrcweir } 197cdf0e10cSrcweir 198cdf0e10cSrcweir B2DHomPoint average(B2DHomPoint& rOld1, B2DHomPoint& rOld2, B2DHomPoint& rOld3) 199cdf0e10cSrcweir { 200cdf0e10cSrcweir B2DHomPoint aAvg( 201cdf0e10cSrcweir (rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0), 202cdf0e10cSrcweir (rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0)); 203cdf0e10cSrcweir return aAvg; 204cdf0e10cSrcweir } 205cdf0e10cSrcweir 206cdf0e10cSrcweir B2DHomPoint operator+(const B2DHomPoint& rVecA, const B2DHomPoint& rVecB) 207cdf0e10cSrcweir { 208cdf0e10cSrcweir B2DHomPoint aSum(rVecA); 209cdf0e10cSrcweir aSum += rVecB; 210cdf0e10cSrcweir return aSum; 211cdf0e10cSrcweir } 212cdf0e10cSrcweir 213cdf0e10cSrcweir B2DHomPoint operator-(const B2DHomPoint& rVecA, const B2DHomPoint& rVecB) 214cdf0e10cSrcweir { 215cdf0e10cSrcweir B2DHomPoint aSub(rVecA); 216cdf0e10cSrcweir aSub -= rVecB; 217cdf0e10cSrcweir return aSub; 218cdf0e10cSrcweir } 219cdf0e10cSrcweir 220cdf0e10cSrcweir B2DHomPoint operator*(const B2DHomPoint& rVec, double t) 221cdf0e10cSrcweir { 222cdf0e10cSrcweir B2DHomPoint aNew(rVec); 223cdf0e10cSrcweir aNew *= t; 224cdf0e10cSrcweir return aNew; 225cdf0e10cSrcweir } 226cdf0e10cSrcweir 227cdf0e10cSrcweir B2DHomPoint operator*(double t, const B2DHomPoint& rVec) 228cdf0e10cSrcweir { 229cdf0e10cSrcweir B2DHomPoint aNew(rVec); 230cdf0e10cSrcweir aNew *= t; 231cdf0e10cSrcweir return aNew; 232cdf0e10cSrcweir } 233cdf0e10cSrcweir 234cdf0e10cSrcweir B2DHomPoint operator*( const B2DHomMatrix& rMat, const B2DHomPoint& rPoint ) 235cdf0e10cSrcweir { 236cdf0e10cSrcweir B2DHomPoint aNew(rPoint); 237cdf0e10cSrcweir return aNew*=rMat; 238cdf0e10cSrcweir } 239cdf0e10cSrcweir 240cdf0e10cSrcweir B2DHomPoint operator/(const B2DHomPoint& rVec, double t) 241cdf0e10cSrcweir { 242cdf0e10cSrcweir B2DHomPoint aNew(rVec); 243cdf0e10cSrcweir aNew /= t; 244cdf0e10cSrcweir return aNew; 245cdf0e10cSrcweir } 246cdf0e10cSrcweir 247cdf0e10cSrcweir B2DHomPoint operator/(double t, const B2DHomPoint& rVec) 248cdf0e10cSrcweir { 249cdf0e10cSrcweir B2DHomPoint aNew(rVec); 250cdf0e10cSrcweir aNew /= t; 251cdf0e10cSrcweir return aNew; 252cdf0e10cSrcweir } 253cdf0e10cSrcweir } // end of namespace basegfx 254cdf0e10cSrcweir 255cdf0e10cSrcweir // eof 256