⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tool.h

📁 This contains Graphic gems code
💻 H
字号:
/* ------------------------------------------------------------------------- *\   TOOL.H :   Basic definitions (based on A. Glassner in Graphics Gems I)   by Christophe Schlick (1 June 1992)   "A Toolbox of Macro Functions for Computer Graphics"   in Graphics Gems V (edited by A. Paeth), Academic Press\* ------------------------------------------------------------------------- */#ifndef _TOOL_#define _TOOL_#include <stdio.h>#include <stdlib.h>#include <math.h>/* ------------------------------------------------------------------------- *\                             TYPES AND CONSTANTS\* ------------------------------------------------------------------------- *//*** Type definitions (boolean, byte and file)*/typedef unsigned int  bool;typedef unsigned char byte;typedef FILE *file;/*** Boolean constants*/#define TRUE    (1)#define FALSE   (0)#define ON      (1)#define OFF     (0)/*** Mathematical constants*/#ifdef SINGLE_REAL#define LO_TOL      ((float) 0.000010)#define TOL         ((float) 0.000100)#define HI_TOL      ((float) 0.001000)#define E           ((float) 2.718282)#define PI          ((float) 3.141593)#define HALF_PI     ((float) 1.570796)#define DBLE_PI     ((float) 6.283185)#define SQRT2       ((float) 1.414214)#define HALF_SQRT2  ((float) 0.707107)#define DBLE_SQRT2  ((float) 2.828427)#define SQRT3       ((float) 1.732051)#define HALF_SQRT3  ((float) 0.860254)#define DBLE_SQRT3  ((float) 3.464102)#define GOLD_RATIO  ((float) 1.618340)#define DEG_TO_RAD  ((float) 0.017453)#define RAD_TO_DEG  ((float) 57.29578)#else#define LO_TOL      ((double) 0.0000000000000010)#define TOL         ((double) 0.0000000000000100)#define HI_TOL      ((double) 0.0000000000001000)#define E           ((double) 2.7182818284590498)#define PI          ((double) 3.1415926535897929)#define HALF_PI     ((double) 1.5707963267948965)#define DBLE_PI     ((double) 6.2831853071795858)#define SQRT2       ((double) 1.4142135623730951)#define HALF_SQRT2  ((double) 0.7071067811865476)#define DBLE_SQRT2  ((double) 2.8284271248461902)#define SQRT3       ((double) 1.7320508075688772)#define HALF_SQRT3  ((double) 0.8602540378443859)#define DBLE_SQRT3  ((double) 3.4641016151377544)#define GOLD_RATIO  ((double) 1.6183398874989489)#define DEG_TO_RAD  ((double) 0.0174532925199433)#define RAD_TO_DEG  ((double) 57.295779513082322)#endif/* ------------------------------------------------------------------------- *\                               MATHEMATICAL MACROS\* ------------------------------------------------------------------------- *//*** ABS(t) = Absolute value of 't'** SGN(t) = Sign value of 't'** FLOOR(t) = Map 't' to the default integer** ROUND(t) = Map 't' to the nearest integer*/#define ABS(t)          ((t) < 0 ? -(t) : (t))#define SGN(t)          ((t) < 0 ? -1 : (t) > 0 ? 1 : 0)#define FLOOR(t)        ((t) < 0 ? (int) ((t)-1.0) : (int) (t))#define ROUND(t)        ((t) < 0 ? (int) ((t)-0.5) : (int) ((t)+0.5))/*** ZERO(a)    = Test if a =  0 with a given tolerance** SAME(a,b)  = Test if a =  b with a given tolerance** LESS(a,b)  = Test if a <  b with a given tolerance** MORE(a,b)  = Test if a >  b with a given tolerance** !LESS(a,b) = Test if a >= b with a given tolerance** !MORE(a,b) = Test if a <= b with a given tolerance** XXXX_TOL(a,b,t) = Same thing but with a user-provided tolerance*/#define ZERO(a)         ((a) > -TOL && (a) < TOL)#define ZERO_TOL(a,t)   ((a) > -(t) && (a) < (t))#define SAME(a,b)       ((a) > (b)-TOL && (a) < (b)+TOL)#define SAME_TOL(a,b,t) ((a) > (b)-(t) && (a) < (b)+(t))#define LESS(a,b)       ((a) < (b)-TOL)#define LESS_TOL(a,b,t) ((a) < (b)-(t))#define MORE(a,b)       ((a) > (b)+TOL)#define MORE_TOL(a,b,t) ((a) > (b)+(t))/*** IN(t,lo,hi)    = Test if t >  lo and t <  hi** !IN(t,lo,hi)   = Test if t <= lo  or t >= hi** OUT(t,lo,hi)   = Test if t <  lo  or t >  hi** !OUT(t,lo,hi)  = Test if t >= lo and t <= hi** CLAMP(t,lo,hi) = Clamp a value 't' to the range [lo,hi]*/#define IN(t,lo,hi)     ((t) > (lo) && (t) < (hi))#define OUT(t,lo,hi)    ((t) < (lo) || (t) > (hi))#define CLAMP(t,lo,hi)  ((t) < (lo) ? (lo) : (t) > (hi) ? (hi) : (t))/*** MIN(a,b) = Minimum of values 'a' and 'b'** MAX(a,b) = Maximum of values 'a' and 'b'** MINMIN(a,b,c) = Minimum of values 'a', 'b' and 'c'** MAXMAX(a,b,c) = Maximum of values 'a', 'b' and 'c'*/#define MIN(a,b)        ((a) < (b) ? (a) : (b))#define MAX(a,b)        ((a) > (b) ? (a) : (b))#define MINMIN(a,b,c)   ((a) < (b) ? MIN (a,c) : MIN (b,c))#define MAXMAX(a,b,c)   ((a) > (b) ? MAX (a,c) : MAX (b,c))/*** LERP(t,a,b) = Linear interpolation between 'a' and 'b' using 't' (0<=t<=1)** ==> LERP(0) = a, LERP(1) = b**** HERP(t,a,b) = Hermite interpolation between 'a' and 'b' using 't' (0<=t<=1)** ==> HERP(0) = a, HERP'(0) = 0, HERP(1) = b, HERP'(1) = 0**** CERP(t,a,b) = Cardinal interpolation between 'a' and 'b' using 't' (0<=t<=1)** ==> CERP(0) = a, CERP'(0) = 0.5*(b-aa), HERP(1) = b, HERP'(1) = 0.5*(bb-a)*/#define LERP(t,a,b)       ((a) + ((b)-(a))*(t))#define HERP(t,a,b)       ((a) + ((b)-(a))*(t)*(t)*(3.0-(t)-(t)))#define CERP(t,aa,a,b,bb) ((a) + 0.5*(t)*((b)-(aa)+(t)*(2.0*(aa)-5.0*(a)\                          +4.0*(b)-(bb)+(t)*((bb)-3.0*(b)+3.0*(a)-(aa)))))/*** BIAS(t,p) = Rational bias operator (0 <= t <= 1 and 0 < p < 1)** GAIN(t,p) = Rational gain operator (0 <= t <= 1 and 0 < p < 1)**** Note : For details, see the Gem given by C. Schlick in "Graphics Gems IV"*/#define BIAS(t,p)       ((p)*(t)/((p)+((p)+(p)-1.0)*((t)-1.0)))#define GAIN(t,p)       ((t)<0.5 ? (p)*(t)/((p)+((p)+(p)-1.0)*((t)+(t)-1.0)):\			 (p)*((t)-1.0)/((p)-((p)+(p)-1.0)*((t)+(t)-1.0))+1.0)/*** SWAP(a,b,t) = Swap 'a' and 'b' using 't' as temporary variable**** Warning : The Gem given by B. Wyvill in "Graphics Gems I" should not be used**           because it is compiler-dependent when using non-integer variables!*/#define SWAP(a,b,t)     ((t) = (a), (a) = (b), (b) = (t))/*** Resolution (real solutions only) of a quadratic equation: a*x^2+b*x+c = 0**** Warning : This is a hacker-like implementation of a quadratic solver. It**           is intended to be optimal in terms of floating point operations**           but warn that values of parameters a, b and c are destroyed!**** Return :  a = Smallest solution (if it exists)**           b = Greatest solution (if it exists)**           Return value = Number of solutions (0, 1, or 2)*/#define QUADRATIC(a,b,c)\        (ZERO (a) ? ZERO (b) ? 0 : (a = -c / b, b = a, 1) :\         (a = -0.5 / a, b *= a, c *= a + a, c += b * b,\         (c >  TOL) ? (c = sqrt (c), a = b - c, b = b + c, 2) :\         (c < -TOL) ? 0 : (a = b, 1)))/* ------------------------------------------------------------------------- *\                            MEMORY MANAGEMENT MACROS\* ------------------------------------------------------------------------- *//*** USR_INIT_MEM = User-provided memory allocation routine (default = malloc)** USR_EXIT_MEM = User-provided memory deallocation routine (default = free)**** Note: If you do not like standard (de)allocation routines, simply redefine**       USR_INIT_MEM and USR_EXIT_MEM with your favorite functions*/#ifndef USR_INIT_MEM#define USR_INIT_MEM  malloc#endif#ifndef USR_EXIT_MEM#define USR_EXIT_MEM  free#endif/*** INIT_MEM(Var,Type,Nbr) = Allocation for 'Nbr' elements of type 'Type'** EXIT_MEM(Var) = Deallocation of variable 'Var'** ZERO_MEM(Var,Type,Nbr) = Fill 'Nbr' elements of type 'Type' with zero** COPY_MEM(Var,Mem,Type,Nbr) = Copy 'Nbr' elements from 'Mem' to 'Var'** SAME_MEM(Var,Mem,Type,Nbr) = Test if 'Var=Mem' (only 'Nbr' first elements)** LESS_MEM(Var,Mem,Type,Nbr) = Test if 'Var<Mem' (only 'Nbr' first elements)** MORE_MEM(Var,Mem,Type,Nbr) = Test if 'Var>Mem' (only 'Nbr' first elements)*/#define INIT_MEM(Var,Type,Nbr)     (Var = (Type*) (malloc(sizeof(Type)*(Nbr))))#define EXIT_MEM(Var)              (free (Var))#define ZERO_MEM(Var,Type,Nbr)     (bzero (Var,sizeof(Type)*(Nbr)))#define COPY_MEM(Var,Mem,Type,Nbr) (bcopy (Mem,Var,sizeof(Type)*(Nbr))))#define SAME_MEM(Var,Mem,Type,Nbr) (bcmp (Var,Mem,sizeof(Type)*(Nbr)) == 0)#define LESS_MEM(Var,Mem,Type,Nbr) (bcmp (Var,Mem,sizeof(Type)*(Nbr))  < 0)#define MORE_MEM(Var,Mem,Type,Nbr) (bcmp (Var,Mem,sizeof(Type)*(Nbr))  > 0)/* ------------------------------------------------------------------------- *\                           FILE MANAGEMENT MACROS\* ------------------------------------------------------------------------- *//*** Symbolic constants for standard streams and file modes*/#define SOF stdout      /* Standard output file */#define SIF stdin       /* Standard input file */#define SEF stderr      /* Standard error file */#define RFILE "r"       /* Open an existing file in read mode */#define WFILE "a"       /* Open an existing file in write mode */#define NFILE "w"       /* Create a new file (or recreate an existing one) *//*** INIT_FILE(File,Name,Mode) = Open or create file 'Name' in a given 'Mode'** EXIT_FILE(File) = Close file 'File'** TEST_FILE(File) = Test if the file pointer is within 'File'** HEAD_FILE(File) = Set the file pointer at the head of 'File'** TAIL_FILE(File) = Set the file pointer at the tail of 'File'*/#define INIT_FILE(File,Name,Mode)       ((File) = fopen (Name, Mode))#define EXIT_FILE(File)                 (fclose (File))#define TEST_FILE(File)                 (!feof (File))#define HEAD_FILE(File)                 (fseek (File, (long)0, 0))#define TAIL_FILE(File)                 (fseek (File, (long)0, 2))/*** GET_BYTE(File,Var) = Get a byte in 'File' and put it in 'Var'** PUT_BYTE(File,Var) = Put a byte 'Var' at the current position in 'File'** GET_STR(File,Var) = Get a string (until the next blank caracter) from 'File'** PUT_STR(File,Var) = Put a null-terminated string 'Var' in 'File'** GET_LINE(File,Var,Max) = Get a line of at most 'Max' characters from 'File'** PUT_LINE(File,Var) = Put a string 'Var' ended with a newline char in 'File'*/#define GET_BYTE(File,Var)      ((Var) = getc (File))#define PUT_BYTE(File,Var)      (putc (Var, File))#define GET_STR(File,Var)       (fscanf (File, "%s\n", Var))#define PUT_STR(File,Var)       (fprintf (File, "%s", Var))#define GET_LINE(File,Var,Max)  (fgets (Var, Max, File))#define PUT_LINE(File,Var)      (fprintf (File, "%s\n", Var))/* ------------------------------------------------------------------------- *\                         ERROR MANAGEMENT MACROS\* ------------------------------------------------------------------------- *//*** ASSERT(Test) = If 'Test' is false, display a standard error message** WARN_ERROR(Test,Mesg,Name) = If 'Test' is false, display an error 'Mesg'**                              including an eventual identifier 'Name'** STOP_ERROR(Test,Mesg,Name) = If 'Test' is false, display an error 'Mesg'**                              including an identifier 'Name' and stop** CURE_ERROR(Test,Cure,Var)  = If 'Test' is false, try to 'Cure' the error*/#define ASSERT(Test)\        ((Test) ? TRUE :\         (fprintf (SEF, "Assertion \"%s\" failed in file %s at line %d\n",\          #Test, __FILE__, __LINE__), exit (0)))#define WARN_ERROR(Test,Mesg,Name) (Test ?:  fprintf (SEF,Mesg,Name))#define STOP_ERROR(Test,Mesg,Name) (Test ?: (fprintf (SEF,Mesg,Name),exit(0)))#define CURE_ERROR(Test,Cure,Var)  (Test ?: (Cure) ((void *) Var))#endif/* ------------------------------------------------------------------------- */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -