00001 #ifndef __AIRealMath__
00002 #define __AIRealMath__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef __AITypes__
00031 #include "AITypes.h"
00032 #endif
00033
00034 #include <math.h>
00035 #include <float.h>
00036
00037 #include "AIHeaderBegin.h"
00038
00042
00043
00044
00045
00046
00047
00048 #define kAIRealMathSuite "AI Real Math Suite"
00049 #define kAIRealMathSuiteVersion AIAPI_VERSION(4)
00050 #define kAIRealMathVersion kAIRealMathSuiteVersion
00051
00052
00053
00054
00055
00056
00057 #define kAIRealMax ((AIReal)(DBL_MAX / 10.0F))
00058 #define kAIRealMin ((AIReal)-(DBL_MAX / 10.0F))
00059 #define kAIRealUnknown ((AIReal)DBL_MAX)
00060
00061 #define kAIFloatUnknown ((AIFloat)FLT_MAX)
00062
00063 #ifndef kAIRealOne
00064 #define kAIRealOne ((AIReal) 1.0)
00065 #endif
00066 #ifndef kAIRealZero
00067 #define kAIRealZero ((AIReal) 0.0)
00068 #endif
00069
00070 #ifndef kAIFloatOne
00071 #define kAIFloatOne (1.0f)
00072 #endif
00073
00074 #ifndef kAIFloatZero
00075 #define kAIFloatZero (0.0f)
00076 #endif
00077
00078 #define kAIRealHundredth ((AIReal) 0.01)
00079 #define kAIRealSixteenth ((AIReal) (1.0/16.0))
00080 #define kAIRealTenth ((AIReal) 0.1)
00081 #define kAIRealEighth ((AIReal) 0.125)
00082
00083 #ifndef kAIRealQuarter
00084 #define kAIRealQuarter ((AIReal) 0.25)
00085 #endif
00086
00087 #ifndef kAIRealHalf
00088 #define kAIRealHalf ((AIReal) 0.5)
00089 #endif
00090
00091 #define kAIRealSevenEighths ((AIReal) 0.875)
00092 #define kAIRealOneThird ((AIReal) (1.0/3.0))
00093 #define kAIRealTwoThirds ((AIReal) (2.0/3.0))
00094 #define kAIRealFourThirds ((AIReal) (4.0/3.0))
00095 #define kAIRealThreeHalves ((AIReal) 1.5)
00096
00097 #define kAIPi 3.141592653589793238462643383279502884197169399375
00098 #define kAIDoublePi ((double) kAIPi)
00099 #define kAIRealPi ((AIReal) kAIPi)
00100 #define kAIRealPi4 ((AIReal) (kAIPi/4.0))
00101 #define kAIRealPi2 ((AIReal) (kAIPi/2.0))
00102 #define kAIReal3PiOver2 ((AIReal) (kAIRealThreeHalves*kAIPi))
00103 #define kAIRealTwoPi ((AIReal) (kAIPi*2.0))
00104
00105 #define kAIRealSquareRootOfTwo ((AIReal) 1.4142135623)
00106 #define kAIRealSquareRootOfThree ((AIReal) 1.7320508075688772935274463415059)
00107 #define kAIRealAvogadrosOther ((AIReal) 0.5522847498)
00108 #define kAIRealGolden ((AIReal) 1.6180339888)
00109
00110 #define kSmallestFixedNumberEquivalent_Tolerance ((AIReal) (1.0 / (1 << 16)) ) // 1 / 2^16
00111 #define kAIRealTolerance kSmallestFixedNumberEquivalent_Tolerance
00112
00113
00114
00115
00116
00117
00118
00119
00120 #if __BUILD_PLUGIN__
00121
00122
00123
00124
00125 #define _AIRealMIN(x, y) ((x) > (y) ? (y) : (x))
00126 #define _AIRealMAX(x, y) ((x) > (y) ? (x) : (y))
00127 #define _AIRealAbs(x) ((x) >= kAIRealZero ? (x) : -(x))
00128
00129 #define _AIRealRound( x) (AIReal)( (x) > 0 ? floor((x) + 0.5) : ceil((x) - 0.5))
00130
00131 #define _AIRealTrunc( x) (AIReal)( (x) > 0 ? floor((x)) : ceil((x)))
00132 #define _AIRealFloor( x) (AIReal)floor( x)
00133
00134 #if 0 // Formerly #ifndef WIN_ENV
00135 #define _AIRealMIN( x, y) fmin( (x), (y))
00136 #define _AIRealMAX( x, y) fmax( (x), (y))
00137
00138 #define _AIRealRound( x) (AIReal)round( x)
00139 #define _AIRealFloor( x) (AIReal)floor( x)
00140 #define _AIRealTrunc( x) (AIReal)trunc( x)
00141 #endif
00142
00143
00144 #define _ShortToAIReal(a) ((AIReal) (a))
00145 #define _AIRealRoundToShort(a) ((ai::int16) _AIRealRound(a))
00146 #define _AIRealTruncToShort(a) ((ai::int16) _AIRealTrunc(a))
00147
00148
00149
00150 #define _AIRealFraction(a) ((AIReal) ((a) - _AIRealTrunc(a)))
00151 #define _AIRealAverage(a, b) ((AIReal) (((a) + (b)) / 2.0))
00152 #define _AIRealHalf(a) ((AIReal) ((a) / 2.0))
00153 #define _AIRealOverflow(a) ((a) == kAIRealMax || (a) == kAIRealMin)
00154
00155 #define _AIRealSign(a) ((AIReal) ((a) > 0 ? +1 : ((a) < 0 ? -1 : 0)))
00156
00157
00158
00159
00160
00161
00162 #endif
00163
00164
00165
00166
00167
00168
00169
00170
00190 typedef struct {
00191
00198 AIAPI AIReal (*AIRealAdd) ( AIReal a, AIReal b );
00199
00206 AIAPI AIReal (*AIRealMul) ( AIReal a, AIReal b );
00207
00214 AIAPI AIReal (*AIRealDiv) ( AIReal a, AIReal b );
00215
00222 AIAPI AIReal (*ShortRatio) ( ai::int16 a, ai::int16 b );
00223
00230 AIAPI AIReal (*AIRealRatio) ( AIReal a, AIReal b );
00231
00240 AIAPI AIReal (*AIRealMulAdd) ( AIReal a, AIReal b, AIReal c, AIReal d );
00241
00253 AIAPI AIReal (*AIRealMultiple) (AIReal a, AIReal multiple, AIBoolean ceiling );
00254
00259 AIAPI AIReal (*AIRealSin) ( AIReal a );
00260
00265 AIAPI AIReal (*AIRealCos) ( AIReal a );
00266
00273 AIAPI AIReal (*AIRealATan) ( AIReal a, AIReal b );
00274
00279 AIAPI AIReal (*DegreeToRadian) ( AIReal degree );
00280
00285 AIAPI AIReal (*RadianToDegree) ( AIReal radian );
00286
00291 AIAPI AIReal (*AIRealSqrt) ( AIReal a );
00292
00299 AIAPI AIReal (*AIRealLength) ( AIReal a, AIReal b );
00300
00310 AIAPI AIReal (*AIRealInterpolate) ( AIReal a, AIReal b, AIReal t );
00311
00318 AIAPI void (*AIRealPointAdd) ( const AIRealPoint *a, const AIRealPoint *b, AIRealPoint *result );
00319
00326 AIAPI void (*AIRealPointSubtract) ( const AIRealPoint *a, const AIRealPoint *b, AIRealPoint *result );
00327
00334 AIAPI AIBoolean (*AIRealPointEqual) ( const AIRealPoint *a, const AIRealPoint *b );
00335
00346 AIAPI AIBoolean (*AIRealPointClose) ( const AIRealPoint *a, const AIRealPoint *b, AIReal tolerance );
00347
00353 AIAPI AIReal (*AIRealPointAngle) ( const AIRealPoint *a, const AIRealPoint *b );
00354
00360 AIAPI AIReal (*AIRealPointLength) ( const AIRealPoint *a, const AIRealPoint *b );
00361
00367 AIAPI void (*AIRealPointLengthAngle) ( AIReal length, AIReal angle, AIRealPoint *result );
00368
00377 AIAPI void (*AIRealPointInterpolate) ( const AIRealPoint *a, const AIRealPoint *b, AIReal t, AIRealPoint *result );
00378
00388 AIAPI void (*AIRealRectSet) ( AIRealRect *a, AIReal left, AIReal top, AIReal right, AIReal bottom );
00389
00396 AIAPI AIBoolean (*AIRealRectEqual) ( const AIRealRect *a, const AIRealRect *b );
00397
00405 AIAPI AIBoolean (*AIRealRectEmpty) ( const AIRealRect *a );
00406
00414 AIAPI void (*AIRealRectInset) ( AIRealRect *a, AIReal h, AIReal v );
00415
00423 AIAPI void (*AIRealRectOffset) ( AIRealRect *a, AIReal h, AIReal v );
00424
00430 AIAPI void (*AIRealRectUnion) ( const AIRealRect *a, const AIRealRect *b, AIRealRect *result );
00431
00437 AIAPI void (*AIRealPointUnion) ( const AIRealPoint *a, const AIRealRect *b, AIRealRect *result );
00438
00444 AIAPI AIBoolean (*AIRealRectOverlap) ( const AIRealRect *a, const AIRealRect *b );
00445
00452 AIAPI AIBoolean (*AIRealRectIntersect) ( const AIRealRect *a, const AIRealRect *b, AIRealRect *result );
00453
00460 AIAPI AIBoolean (*AIRealRectInAIRealRect) ( const AIRealRect *a, const AIRealRect *b );
00461
00468 AIAPI AIBoolean (*AIRealPointInAIRealRect) ( const AIRealPoint *a, const AIRealRect *b );
00469
00477 AIAPI void (*AIRealRectAlign) ( const AIRealRect *a, AIRealRect *result );
00478
00488 AIAPI void (*AIRealMatrixSet) ( AIRealMatrix *m, AIReal a, AIReal b, AIReal c, AIReal d, AIReal tx, AIReal ty );
00489
00493 AIAPI void (*AIRealMatrixSetIdentity) ( AIRealMatrix *m );
00494
00500 AIAPI AIBoolean (*AIRealMatrixEqual) ( const AIRealMatrix *m, const AIRealMatrix *n );
00501
00506 AIAPI AIBoolean (*AIRealMatrixIdentity) ( const AIRealMatrix *m );
00507
00512 AIAPI AIBoolean (*AIRealMatrixSingular) ( const AIRealMatrix *m );
00513
00519 AIAPI void (*AIRealMatrixSetTranslate) ( AIRealMatrix *m, AIReal tx, AIReal ty );
00520
00526 AIAPI void (*AIRealMatrixSetScale) ( AIRealMatrix *m, AIReal h, AIReal v );
00527
00532 AIAPI void (*AIRealMatrixSetRotate) ( AIRealMatrix *m, AIReal angle );
00533
00540 AIAPI void (*AIRealMatrixConcatTranslate) ( AIRealMatrix *m, AIReal tx, AIReal ty );
00541
00548 AIAPI void (*AIRealMatrixConcatScale) ( AIRealMatrix *m, AIReal h, AIReal v );
00549
00555 AIAPI void (*AIRealMatrixConcatRotate) ( AIRealMatrix *m, AIReal angle );
00556
00562 AIAPI void (*AIRealMatrixConcat) (const AIRealMatrix *m, const AIRealMatrix *n, AIRealMatrix *result );
00563
00568 AIAPI ai::int16 (*AIRealMatrixInvert) (AIRealMatrix *m );
00569
00575 AIAPI void (*AIRealMatrixXformPoint) ( const AIRealMatrix *m, const AIRealPoint *a, AIRealPoint *result );
00576
00581 AIAPI AIFixed (*AIRealToAIFixed) ( AIReal r );
00582
00587 AIAPI AIReal (*AIFixedToAIReal) ( AIFixed f );
00588
00593 AIAPI void (*AIRealPointToAIFixedPoint) ( const AIRealPoint *r, AIFixedPoint *f );
00594
00599 AIAPI void (*AIFixedPointToAIRealPoint) ( const AIFixedPoint *f, AIRealPoint *r );
00600
00605 AIAPI void (*AIRealRectToAIFixedRect) ( const AIRealRect *r, AIFixedRect *f );
00606
00611 AIAPI void (*AIFixedRectToAIRealRect) ( const AIFixedRect *f, AIRealRect *r );
00612
00617 AIAPI void (*AIRealMatrixToAIFixedMatrix) ( const AIRealMatrix *r, AIFixedMatrix *f );
00618
00623 AIAPI void (*AIFixedMatrixToAIRealMatrix) ( const AIFixedMatrix *f, AIRealMatrix *r );
00624
00625
00626
00627
00628 AIAPI void (*AIFloatMatrixToAIRealMatrix) ( const AIFloatMatrix *f, AIRealMatrix *r );
00629
00630
00631 AIAPI void (*AIFloatPointToAIRealPoint) ( const AIFloatPoint *f, AIRealPoint *r );
00632
00633
00634
00644 AIAPI AIBoolean (*IsAIRealUnknown) ( AIReal r );
00645
00651 AIAPI AIBoolean (*AIRealIsNAN) ( AIReal r );
00652
00660 AIAPI AIBoolean (*AlmostEqual) (const AIReal a, const AIReal b, const AIReal percent);
00661
00668 AIAPI AIBoolean (*EqualWithinTol) (const AIReal a, const AIReal b, const AIReal tolerance);
00669
00675 AIAPI void (*AIRealMatrixGetTranslate) ( const AIRealMatrix *m, AIReal *tx, AIReal *ty );
00676
00682 AIAPI void (*AIRealMatrixGetScale) ( const AIRealMatrix *m, AIReal *h, AIReal *v );
00683
00688 AIAPI void (*AIRealMatrixGetRotate) ( const AIRealMatrix *m, AIReal *angle );
00689
00696 AIAPI void (*AIDoubleRectUnion) ( const AIDoubleRect *a, const AIDoubleRect *b, AIDoubleRect *result );
00697
00704 AIAPI AIReal(*RestrictAngleToRange)(AIReal angle, AIReal startAngle);
00705 } AIRealMathSuite;
00706
00707
00708 #include "AIHeaderEnd.h"
00709
00710
00711 #endif