xref: /AOO41X/main/basegfx/source/numeric/ftools.cxx (revision 2a27d9ca92002687c22a80f87b4827f1c65aad4c)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_basegfx.hxx"
26 #include <basegfx/numeric/ftools.hxx>
27 #include <algorithm>
28 
29 namespace basegfx
30 {
31     // init static member of class fTools
32     double ::basegfx::fTools::mfSmallValue = 0.000000001;
33 
snapToNearestMultiple(double v,const double fStep)34     double snapToNearestMultiple(double v, const double fStep)
35     {
36         if(fTools::equalZero(fStep))
37         {
38             // with a zero step, all snaps to 0.0
39             return 0.0;
40         }
41         else
42         {
43             const double fHalfStep(fStep * 0.5);
44             const double fChange(fHalfStep - fmod(v + fHalfStep, fStep));
45 
46             if(basegfx::fTools::equal(fabs(v), fabs(fChange)))
47             {
48                 return 0.0;
49             }
50             else
51             {
52                 return v + fChange;
53             }
54         }
55     }
56 
snapToZeroRange(double v,double fWidth)57     double snapToZeroRange(double v, double fWidth)
58     {
59         if(fTools::equalZero(fWidth))
60         {
61             // with no range all snaps to range bound
62             return 0.0;
63         }
64         else
65         {
66             if(v < 0.0 || v > fWidth)
67             {
68                 double fRetval(fmod(v, fWidth));
69 
70                 if(fRetval < 0.0)
71                 {
72                     fRetval += fWidth;
73                 }
74 
75                 return fRetval;
76             }
77             else
78             {
79                 return v;
80             }
81         }
82     }
83 
snapToRange(double v,double fLow,double fHigh)84     double snapToRange(double v, double fLow, double fHigh)
85     {
86         if(fTools::equal(fLow, fHigh))
87         {
88             // with no range all snaps to range bound
89             return 0.0;
90         }
91         else
92         {
93             if(fLow > fHigh)
94             {
95                 // correct range order. Evtl. assert this (?)
96                 std::swap(fLow, fHigh);
97             }
98 
99             if(v < fLow || v > fHigh)
100             {
101                 return snapToZeroRange(v - fLow, fHigh - fLow) + fLow;
102             }
103             else
104             {
105                 return v;
106             }
107         }
108     }
109 } // end of namespace basegfx
110 
111 // eof
112