home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / fontutils-0.6-base.tgz / fontutils-0.6-base.tar / fsf / fontutils / include / vector.h < prev    next >
C/C++ Source or Header  |  1992-03-27  |  4KB  |  104 lines

  1. /* vector.h: operations on vectors and points.
  2.  
  3. Copyright (C) 1992 Free Software Foundation, Inc.
  4.  
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2, or (at your option)
  8. any later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  18.  
  19. #ifndef VECTOR_H
  20. #define VECTOR_H
  21.  
  22. #include "types.h"
  23.  
  24.  
  25. /* Our vectors are represented as displacements along the x and y axes.  */
  26.  
  27. typedef struct
  28. {
  29.   real dx, dy;
  30. } vector_type;
  31.  
  32.  
  33. /* Consider a point as a vector from the origin.  */
  34. extern const vector_type make_vector (const real_coordinate_type);
  35.  
  36. /* And a vector as a point, i.e., a displacement from the origin.  */
  37. extern const real_coordinate_type vector_to_point (const vector_type);
  38.  
  39.  
  40. /* Definitions for these common operations can be found in any decent
  41.    linear algebra book, and most calculus books.  */
  42.  
  43. extern const real magnitude (const vector_type);
  44. extern const vector_type normalize (const vector_type);
  45.  
  46. extern const vector_type Vadd (const vector_type, const vector_type);
  47. extern const real Vdot (const vector_type, const vector_type);
  48. extern const vector_type Vmult_scalar (const vector_type, const real);
  49. extern const real Vangle (const vector_type in, const vector_type out);
  50.  
  51. /* These operations could have been named `P..._vector' just as well as
  52.    V..._point, so we may as well allow both names.  */
  53. #define Padd_vector Vadd_point
  54. extern const real_coordinate_type Vadd_point
  55.   (const real_coordinate_type, const vector_type);
  56.  
  57. #define Psubtract_vector Vsubtract_point
  58. extern const real_coordinate_type Vsubtract_point
  59.   (const real_coordinate_type, const vector_type);
  60.  
  61. /* This returns the rounded sum.  */
  62. #define IPadd_vector Vadd_int_point
  63. extern const coordinate_type Vadd_int_point
  64.   (const coordinate_type, const vector_type);
  65.  
  66. /* Take the absolute value of both components.  */
  67. extern const vector_type Vabs (const vector_type);
  68.  
  69.  
  70.  
  71. /* Operations on points with real coordinates.  It is not orthogonal,
  72.    but more convenient, to have the subtraction operator return a
  73.    vector, and the addition operator return a point.  */
  74. extern const vector_type Psubtract
  75.   (const real_coordinate_type, const real_coordinate_type);
  76.  
  77. /* These are heavily used in spline fitting, so we define them as macros
  78.    instead of functions.  */
  79. #define Padd(rc1, rc2)                            \
  80.   ((real_coordinate_type) { (rc1).x + (rc2).x, (rc1).y + (rc2).y })
  81. #define Pmult_scalar(rc, r)                        \
  82.   ((real_coordinate_type) { (rc).x * (r), (rc).y * (r) })
  83.  
  84. #if 0
  85. extern const real_coordinate_type Padd (real_coordinate_type,
  86.                                         real_coordinate_type);
  87. extern const real_coordinate_type Pmult_scalar (real_coordinate_type, real);
  88. #endif
  89.  
  90. /* Similarly, for points with integer coordinates; here, a subtraction
  91.    operator that does return another point is useful.  */
  92. extern const vector_type IPsubtract
  93.   (const coordinate_type, const coordinate_type);
  94. extern const coordinate_type IPsubtractP
  95.   (const coordinate_type, const coordinate_type);
  96. extern const coordinate_type IPadd
  97.   (const coordinate_type, const coordinate_type);
  98. extern const coordinate_type IPmult_scalar (const coordinate_type, const int);
  99. extern const real_coordinate_type IPmult_real
  100.   (const coordinate_type, const real);
  101. extern const boolean IPequal (const coordinate_type, const coordinate_type);
  102.  
  103. #endif /* not VECTOR_H */
  104.