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