50 lines
1.3 KiB
Go
50 lines
1.3 KiB
Go
/*
|
|
Copyright (c) 2012, Jan Schlicht <jan.schlicht@gmail.com>
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any purpose
|
|
with or without fee is hereby granted, provided that the above copyright notice
|
|
and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
|
THIS SOFTWARE.
|
|
*/
|
|
|
|
package resize
|
|
|
|
import (
|
|
"math"
|
|
)
|
|
|
|
var (
|
|
epsilon = math.Nextafter(1.0, 2.0) - 1.0 // machine epsilon
|
|
taylor2bound = math.Sqrt(epsilon)
|
|
taylorNbound = math.Sqrt(taylor2bound)
|
|
)
|
|
|
|
// unnormalized sinc function
|
|
func Sinc1(x float64) (y float64) {
|
|
if math.Abs(x) >= taylorNbound {
|
|
y = math.Sin(x) / x
|
|
} else {
|
|
y = 1.0
|
|
if math.Abs(x) >= epsilon {
|
|
x2 := x * x
|
|
y -= x2 / 6.0
|
|
if math.Abs(x) >= taylor2bound {
|
|
y += (x2 * x2) / 120.0
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// normalized sinc function
|
|
func Sinc(x float64) float64 {
|
|
return Sinc1(x * math.Pi)
|
|
}
|