home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / REND.LZH / READER / VECTOR.C < prev    next >
C/C++ Source or Header  |  1996-04-22  |  3KB  |  160 lines

  1. /*
  2.         ベクトル演算関数群
  3.  
  4.         Copyright T.Kobayashi
  5. */
  6.  
  7. #ifndef    INLINE_VECTOR
  8.     #include <stdio.h>
  9.     #include <math.h>
  10.     #include "reader.h"
  11.     #define    static
  12. #endif
  13.  
  14. /*    ベクトルのコピー  */
  15. static    inline    void    v_copy( a, b )
  16. Vector    a, b ;
  17. {
  18.     int     i ;
  19.  
  20.     for( i = 0 ; i < 3 ; ++i )
  21.         a[i] = b[i] ;
  22. }
  23.  
  24. /*    ベクトルへの代入  */
  25. static    inline    void    ftov( Vector v, Float x, Float y, Float z )
  26. {
  27.     v[0] = x ;
  28.     v[1] = y ;
  29.     v[2] = z ;
  30. }
  31.  
  32. /*    ベクトルの長さを求める    */
  33. static    inline    Float    v_length( a )
  34. Vector    a ;
  35. {
  36.     extern double sqrt(double);
  37.     return( sqrt( a[0]*a[0] + a[1]*a[1] + a[2]*a[2] ) );
  38. }
  39.  
  40. /*    単位ベクトル化    */
  41. static    inline    void    v_unit( ret, a )
  42. Vector    ret, a ;
  43. {
  44.     Float    r ;
  45.  
  46.     r = v_length( a );
  47.     if ( r == 0.0 )
  48.     {
  49.         ftov( ret, 0.0, 0.0, 0.0 );
  50.         return ;
  51.     }
  52.     ret[0] = a[0] / r ;
  53.     ret[1] = a[1] / r ;
  54.     ret[2] = a[2] / r ;
  55.  
  56. }
  57.  
  58. /*    スカラー積    */
  59. static    inline    Float    s_pro( a1, a2 )
  60. Vector    a1, a2 ;
  61. {
  62.     return( a1[0]*a2[0] + a1[1]*a2[1] + a1[2]*a2[2] );
  63. }
  64.  
  65. /*    ベクトル積    */
  66. static    inline    void    v_pro( ret, a1, a2 )
  67. Vector    ret, a1, a2 ;
  68. {
  69.     ret[0] = a1[1] * a2[2] - a1[2] * a2[1] ;
  70.     ret[1] = a1[2] * a2[0] - a1[0] * a2[2] ;
  71.     ret[2] = a1[0] * a2[1] - a1[1] * a2[0] ;
  72. }
  73.  
  74. /*    各成分ごとの積    */
  75. static    inline    void    v_mult( ret, a1, a2 )
  76. Vector    ret, a1, a2 ;
  77. {
  78.     ret[0] = a1[0] * a2[0] ;
  79.     ret[1] = a1[1] * a2[1] ;
  80.     ret[2] = a1[2] * a2[2] ;
  81. }
  82.  
  83. /*    ベクトルの和  */
  84. static    inline    void    v_add( ret, a1, a2 )
  85. Vector    ret, a1, a2 ;
  86. {
  87.     ret[0] = a1[0] + a2[0] ;
  88.     ret[1] = a1[1] + a2[1] ;
  89.     ret[2] = a1[2] + a2[2] ;
  90. }
  91.  
  92. /*    ベクトルの差  */
  93. static    inline    void    v_sub( ret, a1, a2 )
  94. Vector    ret, a1, a2 ;
  95. {
  96.     ret[0] = a1[0] - a2[0] ;
  97.     ret[1] = a1[1] - a2[1] ;
  98.     ret[2] = a1[2] - a2[2] ;
  99. }
  100.  
  101. /*    ベクトルのスカラー倍    */
  102. static    inline    void    v_s_mult( Vector ret, Vector v, Float s )
  103. {
  104.     ret[0] = v[0] * s ;
  105.     ret[1] = v[1] * s ;
  106.     ret[2] = v[2] * s ;
  107. }
  108.  
  109.  
  110. /*
  111.  *        カラー
  112.  */
  113.  
  114. /*    コピー  */
  115. static    inline    void    c_copy( c1, c2 )
  116. Color    c1, c2 ;
  117. {
  118.     c1[0] = c2[0] ;
  119.     c1[1] = c2[1] ;
  120.     c1[2] = c2[2] ;
  121. }
  122.  
  123. /*    ベクトルからカラーへ変換  */
  124. static    inline    void    vtoc( c, v )
  125. Color    c ;
  126. Vector    v ;
  127. {
  128.     c[0] = (long)( v[0] * (Float)COLOR_POINT );
  129.     c[1] = (long)( v[1] * (Float)COLOR_POINT );
  130.     c[2] = (long)( v[2] * (Float)COLOR_POINT );
  131. }
  132.  
  133. /*    成分ごとの積    */
  134. static    inline    void    c_mult( ret, a1, a2 )
  135. Color    ret, a1, a2 ;
  136. {
  137.     ret[0] = a1[0] * a2[0] / COLOR_POINT ;
  138.     ret[1] = a1[1] * a2[1] / COLOR_POINT ;
  139.     ret[2] = a1[2] * a2[2] / COLOR_POINT ;
  140. }
  141.  
  142. /*    成分ごとの和  */
  143. static    inline    void    c_add( ret, a1, a2 )
  144. Color    ret, a1, a2 ;
  145. {
  146.     ret[0] = a1[0] + a2[0] ;
  147.     ret[1] = a1[1] + a2[1] ;
  148.     ret[2] = a1[2] + a2[2] ;
  149. }
  150.  
  151. /*    定数倍    */
  152. static    inline    void    c_s_mult( ret, v, s )
  153. Color    ret, v ;
  154. long    s ;
  155. {
  156.     ret[0] = v[0] * s / COLOR_POINT ;
  157.     ret[1] = v[1] * s / COLOR_POINT ;
  158.     ret[2] = v[2] * s / COLOR_POINT ;
  159. }
  160.