1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_basegfx.hxx" 30 #include <basegfx/vector/b2ivector.hxx> 31 #include <basegfx/matrix/b2dhommatrix.hxx> 32 #include <basegfx/numeric/ftools.hxx> 33 34 namespace basegfx 35 { 36 B2IVector& B2IVector::operator=( const ::basegfx::B2ITuple& rVec ) 37 { 38 mnX = rVec.getX(); 39 mnY = rVec.getY(); 40 return *this; 41 } 42 43 44 double B2IVector::getLength() const 45 { 46 return hypot( mnX, mnY ); 47 } 48 49 double B2IVector::scalar( const B2IVector& rVec ) const 50 { 51 return((mnX * rVec.mnX) + (mnY * rVec.mnY)); 52 } 53 54 double B2IVector::cross( const B2IVector& rVec ) const 55 { 56 return(mnX * rVec.getY() - mnY * rVec.getX()); 57 } 58 59 double B2IVector::angle( const B2IVector& rVec ) const 60 { 61 return atan2(double( mnX * rVec.getY() - mnY * rVec.getX()), 62 double( mnX * rVec.getX() + mnY * rVec.getY())); 63 } 64 65 const B2IVector& B2IVector::getEmptyVector() 66 { 67 return (const B2IVector&) ::basegfx::B2ITuple::getEmptyTuple(); 68 } 69 70 B2IVector& B2IVector::operator*=( const B2DHomMatrix& rMat ) 71 { 72 mnX = fround( rMat.get(0,0)*mnX + 73 rMat.get(0,1)*mnY ); 74 mnY = fround( rMat.get(1,0)*mnX + 75 rMat.get(1,1)*mnY ); 76 77 return *this; 78 } 79 80 B2IVector& B2IVector::setLength(double fLen) 81 { 82 double fLenNow(scalar(*this)); 83 84 if(!::basegfx::fTools::equalZero(fLenNow)) 85 { 86 const double fOne(10.0); 87 88 if(!::basegfx::fTools::equal(fOne, fLenNow)) 89 { 90 fLen /= sqrt(fLenNow); 91 } 92 93 mnX = fround( mnX*fLen ); 94 mnY = fround( mnY*fLen ); 95 } 96 97 return *this; 98 } 99 100 bool areParallel( const B2IVector& rVecA, const B2IVector& rVecB ) 101 { 102 double fVal(rVecA.getX() * rVecB.getY() - rVecA.getY() * rVecB.getX()); 103 return ::basegfx::fTools::equalZero(fVal); 104 } 105 106 B2VectorOrientation getOrientation( const B2IVector& rVecA, const B2IVector& rVecB ) 107 { 108 double fVal(rVecA.getX() * rVecB.getY() - rVecA.getY() * rVecB.getX()); 109 110 if(fVal > 0.0) 111 { 112 return ORIENTATION_POSITIVE; 113 } 114 115 if(fVal < 0.0) 116 { 117 return ORIENTATION_NEGATIVE; 118 } 119 120 return ORIENTATION_NEUTRAL; 121 } 122 123 B2IVector getPerpendicular( const B2IVector& rNormalizedVec ) 124 { 125 B2IVector aPerpendicular(-rNormalizedVec.getY(), rNormalizedVec.getX()); 126 return aPerpendicular; 127 } 128 129 B2IVector operator*( const B2DHomMatrix& rMat, const B2IVector& rVec ) 130 { 131 B2IVector aRes( rVec ); 132 return aRes*=rMat; 133 } 134 135 B2VectorContinuity getContinuity(const B2IVector& rBackVector, const B2IVector& rForwardVector ) 136 { 137 B2VectorContinuity eRetval(CONTINUITY_NONE); 138 139 if(!rBackVector.equalZero() && !rForwardVector.equalZero()) 140 { 141 const B2IVector aInverseForwardVector(-rForwardVector.getX(), -rForwardVector.getY()); 142 143 if(rBackVector == aInverseForwardVector) 144 { 145 // same direction and same length -> C2 146 eRetval = CONTINUITY_C2; 147 } 148 else if(areParallel(rBackVector, aInverseForwardVector)) 149 { 150 // same direction -> C1 151 eRetval = CONTINUITY_C1; 152 } 153 } 154 155 return eRetval; 156 } 157 } // end of namespace basegfx 158 159 // eof 160