diff options
author | Kim Motoyoshi Kalland <kim.kalland@nokia.com> | 2009-10-02 12:29:16 (GMT) |
---|---|---|
committer | Kim Motoyoshi Kalland <kim.kalland@nokia.com> | 2009-10-02 15:57:15 (GMT) |
commit | 4f7d94ca73556f3a40631ad07f565995f6f85176 (patch) | |
tree | 6d9548d37c96e1652216a44c1d861587604236d1 | |
parent | 5d2f84dc7aa757ea70b0d84b7802feef5515b92e (diff) | |
download | Qt-4f7d94ca73556f3a40631ad07f565995f6f85176.zip Qt-4f7d94ca73556f3a40631ad07f565995f6f85176.tar.gz Qt-4f7d94ca73556f3a40631ad07f565995f6f85176.tar.bz2 |
Added qFastSin() and qFastCos() functions.
The new functions use a lookup table.
Reviewed-by: Trond
-rw-r--r-- | src/corelib/kernel/kernel.pri | 6 | ||||
-rw-r--r-- | src/corelib/kernel/qmath.cpp | 305 | ||||
-rw-r--r-- | src/corelib/kernel/qmath.h | 24 |
3 files changed, 333 insertions, 2 deletions
diff --git a/src/corelib/kernel/kernel.pri b/src/corelib/kernel/kernel.pri index 003693b..d0dad49 100644 --- a/src/corelib/kernel/kernel.pri +++ b/src/corelib/kernel/kernel.pri @@ -33,7 +33,8 @@ HEADERS += \ kernel/qsystemsemaphore.h \ kernel/qsystemsemaphore_p.h \ kernel/qfunctions_p.h \ - kernel/qguard_p.h + kernel/qguard_p.h \ + kernel/qmath.h SOURCES += \ kernel/qabstracteventdispatcher.cpp \ @@ -55,7 +56,8 @@ SOURCES += \ kernel/qcoreglobaldata.cpp \ kernel/qsharedmemory.cpp \ kernel/qsystemsemaphore.cpp \ - kernel/qpointer.cpp + kernel/qpointer.cpp \ + kernel/qmath.cpp win32 { SOURCES += \ diff --git a/src/corelib/kernel/qmath.cpp b/src/corelib/kernel/qmath.cpp new file mode 100644 index 0000000..24bec4a --- /dev/null +++ b/src/corelib/kernel/qmath.cpp @@ -0,0 +1,305 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtCore/qmath.h> + +QT_BEGIN_NAMESPACE + +Q_CORE_EXPORT const qreal qt_sine_table[QT_SINE_TABLE_SIZE] = { + 0.0, + 0.024541228522912288, + 0.049067674327418015, + 0.073564563599667426, + 0.098017140329560604, + 0.1224106751992162, + 0.14673047445536175, + 0.17096188876030122, + 0.19509032201612825, + 0.2191012401568698, + 0.24298017990326387, + 0.26671275747489837, + 0.29028467725446233, + 0.31368174039889152, + 0.33688985339222005, + 0.35989503653498811, + 0.38268343236508978, + 0.40524131400498986, + 0.42755509343028208, + 0.44961132965460654, + 0.47139673682599764, + 0.49289819222978404, + 0.51410274419322166, + 0.53499761988709715, + 0.55557023301960218, + 0.57580819141784534, + 0.59569930449243336, + 0.61523159058062682, + 0.63439328416364549, + 0.65317284295377676, + 0.67155895484701833, + 0.68954054473706683, + 0.70710678118654746, + 0.72424708295146689, + 0.74095112535495911, + 0.75720884650648446, + 0.77301045336273699, + 0.78834642762660623, + 0.80320753148064483, + 0.81758481315158371, + 0.83146961230254524, + 0.84485356524970701, + 0.85772861000027212, + 0.87008699110871135, + 0.88192126434835494, + 0.89322430119551532, + 0.90398929312344334, + 0.91420975570353069, + 0.92387953251128674, + 0.93299279883473885, + 0.94154406518302081, + 0.94952818059303667, + 0.95694033573220894, + 0.96377606579543984, + 0.97003125319454397, + 0.97570213003852857, + 0.98078528040323043, + 0.98527764238894122, + 0.98917650996478101, + 0.99247953459870997, + 0.99518472667219682, + 0.99729045667869021, + 0.99879545620517241, + 0.99969881869620425, + 1.0, + 0.99969881869620425, + 0.99879545620517241, + 0.99729045667869021, + 0.99518472667219693, + 0.99247953459870997, + 0.98917650996478101, + 0.98527764238894122, + 0.98078528040323043, + 0.97570213003852857, + 0.97003125319454397, + 0.96377606579543984, + 0.95694033573220894, + 0.94952818059303667, + 0.94154406518302081, + 0.93299279883473885, + 0.92387953251128674, + 0.91420975570353069, + 0.90398929312344345, + 0.89322430119551521, + 0.88192126434835505, + 0.87008699110871146, + 0.85772861000027212, + 0.84485356524970723, + 0.83146961230254546, + 0.81758481315158371, + 0.80320753148064494, + 0.78834642762660634, + 0.7730104533627371, + 0.75720884650648468, + 0.74095112535495899, + 0.72424708295146689, + 0.70710678118654757, + 0.68954054473706705, + 0.67155895484701855, + 0.65317284295377664, + 0.63439328416364549, + 0.61523159058062693, + 0.59569930449243347, + 0.57580819141784545, + 0.55557023301960218, + 0.53499761988709715, + 0.51410274419322177, + 0.49289819222978415, + 0.47139673682599786, + 0.44961132965460687, + 0.42755509343028203, + 0.40524131400498992, + 0.38268343236508989, + 0.35989503653498833, + 0.33688985339222033, + 0.31368174039889141, + 0.29028467725446239, + 0.26671275747489848, + 0.24298017990326407, + 0.21910124015687005, + 0.19509032201612861, + 0.17096188876030122, + 0.1467304744553618, + 0.12241067519921635, + 0.098017140329560826, + 0.073564563599667732, + 0.049067674327417966, + 0.024541228522912326, + 0.0, + -0.02454122852291208, + -0.049067674327417724, + -0.073564563599667496, + -0.09801714032956059, + -0.1224106751992161, + -0.14673047445536158, + -0.17096188876030097, + -0.19509032201612836, + -0.2191012401568698, + -0.24298017990326382, + -0.26671275747489825, + -0.29028467725446211, + -0.31368174039889118, + -0.33688985339222011, + -0.35989503653498811, + -0.38268343236508967, + -0.40524131400498969, + -0.42755509343028181, + -0.44961132965460665, + -0.47139673682599764, + -0.49289819222978393, + -0.51410274419322155, + -0.53499761988709693, + -0.55557023301960196, + -0.57580819141784534, + -0.59569930449243325, + -0.61523159058062671, + -0.63439328416364527, + -0.65317284295377653, + -0.67155895484701844, + -0.68954054473706683, + -0.70710678118654746, + -0.72424708295146678, + -0.74095112535495888, + -0.75720884650648423, + -0.77301045336273666, + -0.78834642762660589, + -0.80320753148064505, + -0.81758481315158382, + -0.83146961230254524, + -0.84485356524970701, + -0.85772861000027201, + -0.87008699110871135, + -0.88192126434835494, + -0.89322430119551521, + -0.90398929312344312, + -0.91420975570353047, + -0.92387953251128652, + -0.93299279883473896, + -0.94154406518302081, + -0.94952818059303667, + -0.95694033573220882, + -0.96377606579543984, + -0.97003125319454397, + -0.97570213003852846, + -0.98078528040323032, + -0.98527764238894111, + -0.9891765099647809, + -0.99247953459871008, + -0.99518472667219693, + -0.99729045667869021, + -0.99879545620517241, + -0.99969881869620425, + -1.0, + -0.99969881869620425, + -0.99879545620517241, + -0.99729045667869021, + -0.99518472667219693, + -0.99247953459871008, + -0.9891765099647809, + -0.98527764238894122, + -0.98078528040323043, + -0.97570213003852857, + -0.97003125319454397, + -0.96377606579543995, + -0.95694033573220894, + -0.94952818059303679, + -0.94154406518302092, + -0.93299279883473907, + -0.92387953251128663, + -0.91420975570353058, + -0.90398929312344334, + -0.89322430119551532, + -0.88192126434835505, + -0.87008699110871146, + -0.85772861000027223, + -0.84485356524970723, + -0.83146961230254546, + -0.81758481315158404, + -0.80320753148064528, + -0.78834642762660612, + -0.77301045336273688, + -0.75720884650648457, + -0.74095112535495911, + -0.724247082951467, + -0.70710678118654768, + -0.68954054473706716, + -0.67155895484701866, + -0.65317284295377709, + -0.63439328416364593, + -0.61523159058062737, + -0.59569930449243325, + -0.57580819141784523, + -0.55557023301960218, + -0.53499761988709726, + -0.51410274419322188, + -0.49289819222978426, + -0.47139673682599792, + -0.44961132965460698, + -0.42755509343028253, + -0.40524131400499042, + -0.38268343236509039, + -0.359895036534988, + -0.33688985339222, + -0.31368174039889152, + -0.2902846772544625, + -0.26671275747489859, + -0.24298017990326418, + -0.21910124015687016, + -0.19509032201612872, + -0.17096188876030177, + -0.14673047445536239, + -0.12241067519921603, + -0.098017140329560506, + -0.073564563599667412, + -0.049067674327418091, + -0.024541228522912448 +}; + +QT_END_NAMESPACE diff --git a/src/corelib/kernel/qmath.h b/src/corelib/kernel/qmath.h index b521323..a9e4378 100644 --- a/src/corelib/kernel/qmath.h +++ b/src/corelib/kernel/qmath.h @@ -52,6 +52,10 @@ QT_BEGIN_NAMESPACE QT_MODULE(Core) +#define QT_SINE_TABLE_SIZE 256 + +extern Q_CORE_EXPORT const qreal qt_sine_table[QT_SINE_TABLE_SIZE]; + inline int qCeil(qreal v) { #ifdef QT_USE_MATH_H_FLOATS @@ -136,6 +140,26 @@ inline qreal qPow(qreal x, qreal y) #define M_PI (3.14159265358979323846) #endif +inline qreal qFastSin(qreal x) +{ + int si = int(x * (0.5 * QT_SINE_TABLE_SIZE / M_PI)); // Would be more accurate with qRound, but slower. + qreal d = x - si * (2.0 * M_PI / QT_SINE_TABLE_SIZE); + int ci = si + QT_SINE_TABLE_SIZE / 4; + si &= QT_SINE_TABLE_SIZE - 1; + ci &= QT_SINE_TABLE_SIZE - 1; + return qt_sine_table[si] + (qt_sine_table[ci] - 0.5 * qt_sine_table[si] * d) * d; +} + +inline qreal qFastCos(qreal x) +{ + int ci = int(x * (0.5 * QT_SINE_TABLE_SIZE / M_PI)); // Would be more accurate with qRound, but slower. + qreal d = x - ci * (2.0 * M_PI / QT_SINE_TABLE_SIZE); + int si = ci + QT_SINE_TABLE_SIZE / 4; + si &= QT_SINE_TABLE_SIZE - 1; + ci &= QT_SINE_TABLE_SIZE - 1; + return qt_sine_table[si] - (qt_sine_table[ci] + 0.5 * qt_sine_table[si] * d) * d; +} + QT_END_NAMESPACE QT_END_HEADER |