home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / OB3.2D2.DMS / in.adf / Module / VECTOR.mod < prev    next >
Encoding:
Text File  |  1994-08-05  |  4.4 KB  |  254 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*                                                                         *)
  3. (*  Amiga Oberon Interface Module: VECTOR             Date: 02-Nov-92      *)
  4. (*                                                                         *)
  5. (*   © 1992 by Fridtjof Siebert                                            *)
  6. (*                                                                         *)
  7. (*-------------------------------------------------------------------------*)
  8.  
  9. MODULE VECTOR;
  10.  
  11. IMPORT BT * := BasicTypes, MATHLIB;
  12.  
  13. TYPE
  14.   VECTOR * = POINTER TO VECTORDesc;
  15.  
  16.   VECTORDesc * = RECORD (BT.GROUPDesc)
  17.     elements: POINTER TO ARRAY OF LONGREAL;
  18.   END;
  19.  
  20.  
  21. PROCEDURE Create * (dim: LONGINT): VECTOR;
  22. (*
  23.  * require
  24.  *   dim>0
  25.  *
  26.  * ensure
  27.  *   Result.Dimension()=len
  28.  *)
  29.  
  30. VAR
  31.   v: VECTOR;
  32. BEGIN
  33.   NEW(v);
  34.   NEW(v.elements,dim);
  35.   RETURN v;
  36. END Create;
  37.  
  38.  
  39. PROCEDURE (v: VECTOR) Get * (n: LONGINT): LONGREAL;
  40. (*
  41.  * require
  42.  *   v.Dimension()>n;
  43.  *   n>0
  44.  *)
  45. BEGIN
  46.   RETURN v.elements[n];
  47. END Get;
  48.  
  49.  
  50. PROCEDURE (v: VECTOR) Put * (n: LONGINT; x: LONGREAL);
  51. (*
  52.  * require
  53.  *   v.Dimension()>n;
  54.  *   n>0
  55.  * ensure
  56.  *   v.Get(n)=x
  57.  *)
  58. BEGIN
  59.   v.elements[n] := x;
  60. END Put;
  61.  
  62.  
  63. PROCEDURE (v: VECTOR) Dimension * (): LONGINT;
  64.  
  65. BEGIN
  66.   RETURN LEN(v.elements^);
  67. END Dimension;
  68.  
  69.  
  70. PROCEDURE (v: VECTOR) Add   * (n: BT.GROUP): BT.GROUP;
  71. (*
  72.  * require
  73.  *   v.Dimension = n(VECTOR).Dimension
  74.  *)
  75. VAR
  76.   new: VECTOR;
  77.   i: LONGINT;
  78.  
  79. BEGIN
  80.   WITH n: VECTOR DO
  81.     new := Create(v.Dimension());
  82.     FOR i := 0 TO v.Dimension()-1 DO
  83.       new.elements[i] := v.elements[i] + n.elements[i]
  84.     END;
  85.   END;
  86.   RETURN new;
  87. END Add;
  88.  
  89.  
  90. PROCEDURE (v: VECTOR) Neg   * (): BT.GROUP;
  91.  
  92. VAR
  93.   new: VECTOR;
  94.   i: LONGINT;
  95.  
  96. BEGIN
  97.   new := Create(v.Dimension());
  98.   FOR i := 0 TO v.Dimension()-1 DO
  99.     new.elements[i] := - v.elements[i];
  100.   END;
  101.   RETURN new;
  102. END Neg;
  103.  
  104.  
  105. PROCEDURE (v: VECTOR) Sub   * (n: BT.GROUP): BT.GROUP;
  106. (*
  107.  * require
  108.  *   v.Dimension = n(VECTOR).Dimension
  109.  *)
  110. VAR
  111.   new: VECTOR;
  112.   i: LONGINT;
  113.  
  114. BEGIN
  115.   WITH n: VECTOR DO
  116.     new := Create(v.Dimension());
  117.     FOR i := 0 TO v.Dimension()-1 DO
  118.       new.elements[i] := v.elements[i] - n.elements[i]
  119.     END;
  120.   END;
  121.   RETURN new;
  122. END Sub;
  123.  
  124.  
  125. PROCEDURE (v: VECTOR) Norm * (): LONGREAL;
  126.  
  127. VAR
  128.   i: LONGINT;
  129.   l: LONGREAL;
  130.  
  131. BEGIN
  132.   l := 0;
  133.   FOR i := 0 TO v.Dimension()-1 DO
  134.     l := l + MATHLIB.SQR(v.elements[i])
  135.   END;
  136.   RETURN MATHLIB.SQRT(l);
  137. END Norm;
  138.  
  139.  
  140. PROCEDURE (v: VECTOR) Mul3  * (n: VECTOR): VECTOR;
  141. (*
  142.  * require
  143.  *   v.Dimension = 3
  144.  *   v.Dimension = 3
  145.  *
  146.  *)
  147.  
  148. VAR
  149.   new: VECTOR;
  150.   i,j: LONGINT;
  151.  
  152. BEGIN
  153.   WITH n: VECTOR DO
  154.     new := Create(3);
  155.     new.elements[0] := v.elements[1] * n.elements[2] - v.elements[2] * n.elements[1];
  156.     new.elements[1] := v.elements[2] * n.elements[0] - v.elements[0] * n.elements[2];
  157.     new.elements[2] := v.elements[0] * n.elements[1] - v.elements[1] * n.elements[0];
  158.   END;
  159.   RETURN new;
  160. END Mul3;
  161.  
  162.  
  163. PROCEDURE (v: VECTOR) isEqual * (n: BT.COMPAREABLE): BOOLEAN; (* a = b *)
  164. (*
  165.  * require
  166.  *   v.Dimension = n(VECTOR).Dimension
  167.  *)
  168. VAR
  169.   i: LONGINT;
  170.  
  171. BEGIN
  172.   WITH n: VECTOR DO
  173.     FOR i := 0 TO v.Dimension()-1 DO
  174.       IF v.elements[i] # n.elements[i] THEN RETURN FALSE END;
  175.     END;
  176.   END;
  177.   RETURN TRUE;
  178. END isEqual;
  179.  
  180.  
  181. PROCEDURE (a: VECTOR) Compare * (b: BT.COMPAREABLE): LONGINT;
  182. (*
  183.  * Compares the lengths of a and b.
  184.  *
  185.  * require
  186.  *   a.Dimension = b(VECTOR).Dimension;
  187.  *)
  188. VAR
  189.   an,bn: LONGREAL;
  190. BEGIN
  191.   an := a.Norm(); bn := b(VECTOR).Norm();
  192.   IF    an = bn THEN RETURN  0
  193.   ELSIF an > bn THEN RETURN  1
  194.   ELSE               RETURN -1 END;
  195. END Compare;
  196.  
  197.  
  198. PROCEDURE (a: VECTOR) ScalarProduct * (b: VECTOR): LONGREAL;
  199. (*
  200.  * Determine scalar product a × b.
  201.  *
  202.  * require
  203.  *   b#NIL;
  204.  *   a.Dimension = b.Dimension;
  205.  *)
  206.  
  207. VAR
  208.   result: LONGREAL;
  209.   i: LONGINT;
  210. BEGIN
  211.   result := 0;
  212.   FOR i := 0 TO a.Dimension()-1 DO
  213.     result := result + a.elements[i]*b.elements[i];
  214.   END;
  215.   RETURN result;
  216. END ScalarProduct;
  217.  
  218.  
  219. PROCEDURE (a: VECTOR) Angle * (b: VECTOR): LONGREAL;
  220. (*
  221.  * Determine angle between by a and b.
  222.  *
  223.  *)
  224.  
  225. BEGIN
  226.   RETURN MATHLIB.ACOS(a.ScalarProduct(b) / (a.Norm() * b.Norm()));
  227. END Angle;
  228.  
  229.  
  230. PROCEDURE (a: VECTOR) SMul * (r: LONGREAL): VECTOR;
  231. (*
  232.  * multiply a by r.
  233.  *
  234.  * ensure
  235.  *   a.Norm() = r * OLD a.Norm();
  236.  *)
  237.  
  238. VAR
  239.   new: VECTOR;
  240.   i: LONGINT;
  241.  
  242. BEGIN
  243.   new := Create(a.Dimension());
  244.   FOR i := 0 TO a.Dimension()-1 DO
  245.     new.elements[i] := r * a.elements[i];
  246.   END;
  247.   RETURN new;
  248. END SMul;
  249.  
  250.  
  251. END VECTOR.
  252.  
  253.  
  254.