rotate.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:4k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* 
  2.  * MODULE NAME: rotate.c
  3.  *
  4.  * FUNCTION:
  5.  * This module contains three different routines that compute rotation
  6.  * matricies and load them into GL.
  7.  * Detailed description is provided below.
  8.  *
  9.  * DEPENDENCIES:
  10.  * The routines call GL matrix routines.
  11.  *
  12.  * HISTORY:
  13.  * Developed & written, Linas Vepstas, Septmeber 1991
  14.  * Double precision port, March 1993
  15.  *
  16.  * DETAILED DESCRIPTION:
  17.  * This module contains three routines:
  18.  * --------------------------------------------------------------------
  19.  *
  20.  * void urot_about_axis (float m[4][4],      --- returned
  21.  *                       float angle,        --- input 
  22.  *                       float axis[3])      --- input
  23.  * Computes a rotation matrix.
  24.  * The rotation is around the the direction specified by the argument
  25.  * argument axis[3].  User may specify vector which is not of unit
  26.  * length.  The angle of rotation is specified in degrees, and is in the
  27.  * right-handed direction.
  28.  *
  29.  * void rot_about_axis (float angle,        --- input 
  30.  *                      float axis[3])      --- input
  31.  * Same as above routine, except that the matrix is multiplied into the
  32.  * GL matrix stack.
  33.  *
  34.  * --------------------------------------------------------------------
  35.  *
  36.  * void urot_axis (float m[4][4],      --- returned
  37.  *                 float omega,        --- input
  38.  *                 float axis[3])      --- input
  39.  * Same as urot_about_axis(), but angle specified in radians.
  40.  * It is assumed that the argument axis[3] is a vector of unit length.
  41.  * If it is not of unit length, the returned matrix will not be correct.
  42.  *
  43.  * void rot_axis (float omega,        --- input
  44.  *                float axis[3])      --- input
  45.  * Same as above routine, except that the matrix is multiplied into the
  46.  * GL matrix stack.
  47.  *
  48.  * --------------------------------------------------------------------
  49.  *
  50.  * void urot_omega (float m[4][4],       --- returned
  51.  *                  float omega[3])      --- input
  52.  * same as urot_axis(), but the angle is taken as the length of the
  53.  * vector omega[3]
  54.  *
  55.  * void rot_omega (float omega[3])      --- input
  56.  * Same as above routine, except that the matrix is multiplied into the
  57.  * GL matrix stack.
  58.  *
  59.  * --------------------------------------------------------------------
  60.  */
  61. #include <GL/tube.h>
  62. #include "port.h"
  63. #include "gutil.h"
  64.    
  65. /* ========================================================== */
  66. #ifdef __GUTIL_DOUBLE
  67. void rot_axis_d (double omega,  /* input */
  68.                double axis[3]) /* input */
  69. {
  70.    double m[4][4];
  71.    (void) urot_axis_d (m, omega, axis);
  72.    MULTMATRIX_D (m);
  73. }
  74. #else 
  75. void rot_axis_f (float omega,  /* input */
  76.                float axis[3]) /* input */
  77. {
  78.    float m[4][4];
  79.    (void) urot_axis_f (m, omega, axis);
  80.    MULTMATRIX_F (m);
  81. }
  82. #endif 
  83. /* ========================================================== */
  84. #ifdef __GUTIL_DOUBLE
  85. void rot_about_axis_d (double angle,  /* input */
  86.                        double axis[3]) /* input */
  87. {
  88.    double m[4][4];
  89.    (void) urot_about_axis_d (m, angle, axis);
  90.    MULTMATRIX_D (m);
  91. }
  92. #else
  93. void rot_about_axis_f (float angle,  /* input */
  94.                        float axis[3]) /* input */
  95. {
  96.    float m[4][4];
  97.    (void) urot_about_axis_f (m, angle, axis);
  98.    MULTMATRIX_F (m);
  99. }
  100. #endif
  101. /* ========================================================== */
  102. #ifdef __GUTIL_DOUBLE
  103. void rot_omega_d (double axis[3]) /* input */
  104. {
  105.    double m[4][4];
  106.    (void) urot_omega_d (m, axis);
  107.    MULTMATRIX_D(m);
  108. }
  109. #else
  110. void rot_omega_f (float axis[3]) /* input */
  111. {
  112.    float m[4][4];
  113.    (void) urot_omega_f (m, axis);
  114.    MULTMATRIX_F(m);
  115. }
  116. #endif
  117. /* ========================================================== */