1*01aa44aaSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*01aa44aaSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*01aa44aaSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*01aa44aaSAndrew Rist * distributed with this work for additional information 6*01aa44aaSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*01aa44aaSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*01aa44aaSAndrew Rist * "License"); you may not use this file except in compliance 9*01aa44aaSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*01aa44aaSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*01aa44aaSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*01aa44aaSAndrew Rist * software distributed under the License is distributed on an 15*01aa44aaSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*01aa44aaSAndrew Rist * KIND, either express or implied. See the License for the 17*01aa44aaSAndrew Rist * specific language governing permissions and limitations 18*01aa44aaSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*01aa44aaSAndrew Rist *************************************************************/ 21*01aa44aaSAndrew Rist 22*01aa44aaSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #ifndef _MCVMATH_HXX 25cdf0e10cSrcweir #define _MCVMATH_HXX 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <tools/solar.h> 28cdf0e10cSrcweir 29cdf0e10cSrcweir class FixCpx; 30cdf0e10cSrcweir class ColWheel; 31cdf0e10cSrcweir 32cdf0e10cSrcweir // No of fractal bits 33cdf0e10cSrcweir // allowed range 0..14, must be even 34cdf0e10cSrcweir #define FIX_POST 14 35cdf0e10cSrcweir 36cdf0e10cSrcweir // scale for ...Big() -Functions 37cdf0e10cSrcweir #if (FIX_POST>=4) 38cdf0e10cSrcweir #define FIX_P2 4 39cdf0e10cSrcweir #define FIX_P3 (FIX_POST-FIX_P2) 40cdf0e10cSrcweir #else 41cdf0e10cSrcweir #define FIX_P2 0 42cdf0e10cSrcweir #define FIX_P3 FIX_POST 43cdf0e10cSrcweir #endif 44cdf0e10cSrcweir 45cdf0e10cSrcweir #if (FIX_POST>=1) 46cdf0e10cSrcweir #define FIX_ADD (1<<(FIX_POST-1)) 47cdf0e10cSrcweir #else 48cdf0e10cSrcweir #define FIX_ADD 0 49cdf0e10cSrcweir #endif 50cdf0e10cSrcweir 51cdf0e10cSrcweir #if (FIX_P2>=1) 52cdf0e10cSrcweir #define FIX_A2 (1<<(FIX_P2-1)) 53cdf0e10cSrcweir #else 54cdf0e10cSrcweir #define FIX_A2 0 55cdf0e10cSrcweir #endif 56cdf0e10cSrcweir 57cdf0e10cSrcweir #if (FIX_P3>=1) 58cdf0e10cSrcweir #define FIX_A3 (1<<(FIX_P3-1)) 59cdf0e10cSrcweir #else 60cdf0e10cSrcweir #define FIX_A3 0 61cdf0e10cSrcweir #endif 62cdf0e10cSrcweir 63cdf0e10cSrcweir // ------- 64cdf0e10cSrcweir // - Fix - 65cdf0e10cSrcweir // ------- 66cdf0e10cSrcweir 67cdf0e10cSrcweir class Fix 68cdf0e10cSrcweir { 69cdf0e10cSrcweir private: 70cdf0e10cSrcweir friend class FixCpx; 71cdf0e10cSrcweir friend class ColWheel; 72cdf0e10cSrcweir 73cdf0e10cSrcweir // friend Fix ImpMultBig2( const Fix& a, const Fix& b ); 74cdf0e10cSrcweir 75cdf0e10cSrcweir public: 76cdf0e10cSrcweir long x; 77cdf0e10cSrcweir 78cdf0e10cSrcweir public: 79cdf0e10cSrcweir Fix() { x=0; } 80cdf0e10cSrcweir Fix( int i ) { x=(long(i)<<FIX_POST); } 81cdf0e10cSrcweir Fix( short l ) { x=(long(l)<<FIX_POST); } 82cdf0e10cSrcweir Fix( sal_uInt16 l ) { x=(long(l)<<FIX_POST); } 83cdf0e10cSrcweir Fix( long l ) { x=(l<<FIX_POST); } 84cdf0e10cSrcweir Fix( long Z, long N ) { x=(Z<<FIX_POST)/N; } 85cdf0e10cSrcweir 86cdf0e10cSrcweir void SetInternVal( long nVal ) { x=nVal; } 87cdf0e10cSrcweir long GetInternVal() const { return x; } 88cdf0e10cSrcweir 89cdf0e10cSrcweir void operator+= ( const Fix& a ) { x+=a.x; } 90cdf0e10cSrcweir void operator-= ( const Fix& a ) { x-=a.x; } 91cdf0e10cSrcweir void operator*= ( const Fix& a ) { x=(x*a.x+FIX_ADD)>>FIX_POST; } 92cdf0e10cSrcweir void operator/= ( const Fix& a ) { x=(x<<FIX_POST)/a.x; } 93cdf0e10cSrcweir friend Fix operator- ( const Fix& a ); 94cdf0e10cSrcweir 95cdf0e10cSrcweir void MultBig( const Fix& a ) 96cdf0e10cSrcweir { x=((((a.x+FIX_A2)>>FIX_P2)*x+FIX_A3)>>FIX_P3); } 97cdf0e10cSrcweir void DivBig( const Fix& a ) 98cdf0e10cSrcweir { x=((x<<FIX_P3)/a.x)<<FIX_P2; } 99cdf0e10cSrcweir 100cdf0e10cSrcweir friend sal_Bool operator> ( const Fix& a, const Fix& b ) { return a.x > b.x; } 101cdf0e10cSrcweir friend sal_Bool operator< ( const Fix& a, const Fix& b ) { return a.x < b.x; } 102cdf0e10cSrcweir 103cdf0e10cSrcweir operator long() const { return (x+FIX_ADD) >> FIX_POST; } 104cdf0e10cSrcweir operator double() const { return double(x)/(1<<FIX_POST); } 105cdf0e10cSrcweir 106cdf0e10cSrcweir friend Fix operator+ ( const Fix& a, const Fix& b ); 107cdf0e10cSrcweir friend Fix operator- ( const Fix& a, const Fix& b ); 108cdf0e10cSrcweir friend Fix operator* ( const Fix& a, const Fix& b ); 109cdf0e10cSrcweir friend Fix operator/ ( const Fix& a, const Fix& b ); 110cdf0e10cSrcweir 111cdf0e10cSrcweir friend FixCpx operator-( const FixCpx& a ); 112cdf0e10cSrcweir }; 113cdf0e10cSrcweir 114cdf0e10cSrcweir // ---------- 115cdf0e10cSrcweir // - FixCpx - 116cdf0e10cSrcweir // ---------- 117cdf0e10cSrcweir 118cdf0e10cSrcweir class FixCpx 119cdf0e10cSrcweir { 120cdf0e10cSrcweir // friend FixCpx ImpMultBig2( const FixCpx& ra, const FixCpx& rb ); 121cdf0e10cSrcweir 122cdf0e10cSrcweir public: 123cdf0e10cSrcweir Fix r; 124cdf0e10cSrcweir Fix i; 125cdf0e10cSrcweir 126cdf0e10cSrcweir public: 127cdf0e10cSrcweir FixCpx() : r(), i() {} 128cdf0e10cSrcweir FixCpx( Fix a ) : r( a ), i() {} 129cdf0e10cSrcweir FixCpx( Fix a, Fix b ) : r( a ), i( b ) {} 130cdf0e10cSrcweir 131cdf0e10cSrcweir Fix& GetReal() { return r; } 132cdf0e10cSrcweir Fix& GetImag() { return i; } 133cdf0e10cSrcweir 134cdf0e10cSrcweir void operator*= ( const FixCpx& ra ); 135cdf0e10cSrcweir void MultBig( const FixCpx& ra, const FixCpx& rb ); 136cdf0e10cSrcweir 137cdf0e10cSrcweir friend FixCpx operator+ ( const FixCpx& a, const FixCpx& b ); 138cdf0e10cSrcweir friend FixCpx operator- ( const FixCpx& a, const FixCpx& b ); 139cdf0e10cSrcweir friend FixCpx operator* ( const FixCpx& a, const FixCpx& b ); 140cdf0e10cSrcweir friend FixCpx operator/ ( const FixCpx& a, const FixCpx& b ); 141cdf0e10cSrcweir friend FixCpx operator- ( const FixCpx& a ); 142cdf0e10cSrcweir }; 143cdf0e10cSrcweir 144cdf0e10cSrcweir inline Fix operator- ( const Fix& a ) 145cdf0e10cSrcweir { 146cdf0e10cSrcweir Fix f; 147cdf0e10cSrcweir f.x = -a.x; 148cdf0e10cSrcweir return f; 149cdf0e10cSrcweir } 150cdf0e10cSrcweir 151cdf0e10cSrcweir inline Fix operator+ ( const Fix& a, const Fix& b ) 152cdf0e10cSrcweir { 153cdf0e10cSrcweir long l = a.x+b.x; 154cdf0e10cSrcweir return *((Fix*)&l); 155cdf0e10cSrcweir } 156cdf0e10cSrcweir 157cdf0e10cSrcweir inline Fix operator- ( const Fix& a, const Fix& b ) 158cdf0e10cSrcweir { 159cdf0e10cSrcweir long l = a.x-b.x; 160cdf0e10cSrcweir return *((Fix*)&l); 161cdf0e10cSrcweir } 162cdf0e10cSrcweir 163cdf0e10cSrcweir inline Fix operator* ( const Fix& a, const Fix& b ) 164cdf0e10cSrcweir { 165cdf0e10cSrcweir long l=(a.x*b.x+FIX_ADD)>>FIX_POST; 166cdf0e10cSrcweir return *((Fix*)&l); 167cdf0e10cSrcweir } 168cdf0e10cSrcweir 169cdf0e10cSrcweir inline Fix operator/ ( const Fix& a, const Fix& b ) 170cdf0e10cSrcweir { 171cdf0e10cSrcweir long l=(a.x<<FIX_POST)/b.x; 172cdf0e10cSrcweir return *((Fix*)&l); 173cdf0e10cSrcweir } 174cdf0e10cSrcweir 175cdf0e10cSrcweir inline FixCpx operator- ( const FixCpx& a ) 176cdf0e10cSrcweir { 177cdf0e10cSrcweir FixCpx fc; 178cdf0e10cSrcweir 179cdf0e10cSrcweir fc.r.x = -a.r.x; 180cdf0e10cSrcweir fc.i.x = -a.i.x; 181cdf0e10cSrcweir return fc; 182cdf0e10cSrcweir } 183cdf0e10cSrcweir 184cdf0e10cSrcweir inline FixCpx operator+ ( const FixCpx& a, const FixCpx& b ) 185cdf0e10cSrcweir { 186cdf0e10cSrcweir return FixCpx( a.r+b.r, a.i+b.i ); 187cdf0e10cSrcweir } 188cdf0e10cSrcweir 189cdf0e10cSrcweir inline FixCpx operator- ( const FixCpx& a, const FixCpx& b ) 190cdf0e10cSrcweir { 191cdf0e10cSrcweir return FixCpx( a.r-b.r, a.i-b.i ); 192cdf0e10cSrcweir } 193cdf0e10cSrcweir 194cdf0e10cSrcweir inline void FixCpx::operator*= ( const FixCpx& ra ) 195cdf0e10cSrcweir { 196cdf0e10cSrcweir Fix rr = ra.r*r-ra.i*i; 197cdf0e10cSrcweir i = ra.r*i+ra.i*r; 198cdf0e10cSrcweir r = rr; 199cdf0e10cSrcweir } 200cdf0e10cSrcweir 201cdf0e10cSrcweir inline FixCpx operator* ( const FixCpx& a, const FixCpx& b ) 202cdf0e10cSrcweir { 203cdf0e10cSrcweir return FixCpx( a.r*b.r-a.i*b.i, a.r*b.i+a.i*b.r ); 204cdf0e10cSrcweir } 205cdf0e10cSrcweir 206cdf0e10cSrcweir inline FixCpx operator/ ( const FixCpx& a, const FixCpx& b ) 207cdf0e10cSrcweir { 208cdf0e10cSrcweir return FixCpx( (a.r*b.r+a.i*b.i)/(b.r*b.r+b.i*b.i), 209cdf0e10cSrcweir (b.r*a.r-a.r*b.i)/(b.r*b.r+b.i*b.i) ); 210cdf0e10cSrcweir } 211cdf0e10cSrcweir 212cdf0e10cSrcweir // ----------------------------------------------------------------------- 213cdf0e10cSrcweir 214cdf0e10cSrcweir Fix ImpMultBig2( const Fix& a, const Fix& b ); 215cdf0e10cSrcweir FixCpx ImpMultBig2( const FixCpx& ra, const FixCpx& rb ); 216cdf0e10cSrcweir 217cdf0e10cSrcweir void ImpCartToPolar( const short x, const short y, Fix& rRad, sal_uInt16& rPhi ); 218cdf0e10cSrcweir void ImpPolarToCart( const Fix& rR, const sal_uInt16 Phi, short& rX, short& rY ); 219cdf0e10cSrcweir 220cdf0e10cSrcweir sal_uInt16 ImpSqrt( sal_uLong nRadi ); 221cdf0e10cSrcweir sal_uInt16 ImpATan2( const short x, const short y ); 222cdf0e10cSrcweir FixCpx ImpExPI( sal_uInt16 nPhi ); 223cdf0e10cSrcweir 224cdf0e10cSrcweir #endif // _MCVMATH_HXX 225