mvecimp.inc 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. {*****************************************************************************
  2. Methods of the vector object
  3. *****************************************************************************}
  4. constructor objectname.init_zero;
  5. begin
  6. data[0]:=0;
  7. data[1]:=0;
  8. {$if vecsize>=3}
  9. data[2]:=0;
  10. {$endif}
  11. {$if vecsize>=4}
  12. data[3]:=0;
  13. {$endif}
  14. end;
  15. constructor objectname.init_one;
  16. begin
  17. data[0]:=1;
  18. data[1]:=1;
  19. {$if vecsize>=3}
  20. data[2]:=1;
  21. {$endif}
  22. {$if vecsize>=4}
  23. data[3]:=1;
  24. {$endif}
  25. end;
  26. constructor objectname.init(a,b
  27. {$if vecsize>=3},c{$endif}
  28. {$if vecsize>=4},d{$endif}:datatype);
  29. begin
  30. data[0]:=a;
  31. data[1]:=b;
  32. {$if vecsize>=3}
  33. data[2]:=c;
  34. {$endif}
  35. {$if vecsize>=4}
  36. data[3]:=d;
  37. {$endif}
  38. end;
  39. function objectname.length:datatype;
  40. begin
  41. length:=sqrt(data[0]*data[0]
  42. +data[1]*data[1]
  43. {$if vecsize>=3}+data[2]*data[2]{$endif}
  44. {$if vecsize>=4}+data[3]*data[3]{$endif});
  45. end;
  46. function objectname.squared_length:datatype;
  47. begin
  48. squared_length:=data[0]*data[0]
  49. +data[1]*data[1]
  50. {$if vecsize>=3}+data[2]*data[2]{$endif}
  51. {$if vecsize>=4}+data[3]*data[3]{$endif};
  52. end;
  53. {*****************************************************************************
  54. Conversion from vector2
  55. *****************************************************************************}
  56. {$if (vecsize<>2) or (datatype<>single)}
  57. operator := (const v:Tvector2_single) result:objectname;
  58. begin
  59. result.data[0]:=v.data[0];
  60. result.data[1]:=v.data[1];
  61. {$if vecsize>=3}
  62. result.data[2]:=0;
  63. {$endif}
  64. {$if vecsize>=4}
  65. result.data[3]:=0;
  66. {$endif}
  67. end;
  68. {$endif}
  69. {$if (vecsize<>2) or (datatype<>double)}
  70. operator := (const v:Tvector2_double) result:objectname;
  71. begin
  72. result.data[0]:=v.data[0];
  73. result.data[1]:=v.data[1];
  74. {$if vecsize>=3}
  75. result.data[2]:=0;
  76. {$endif}
  77. {$if vecsize>=4}
  78. result.data[3]:=0;
  79. {$endif}
  80. end;
  81. {$endif}
  82. {$if (vecsize<>2) or (datatype<>extended)}
  83. operator := (const v:Tvector2_extended) result:objectname;
  84. begin
  85. result.data[0]:=v.data[0];
  86. result.data[1]:=v.data[1];
  87. {$if vecsize>=3}
  88. result.data[2]:=0;
  89. {$endif}
  90. {$if vecsize>=4}
  91. result.data[3]:=0;
  92. {$endif}
  93. end;
  94. {$endif}
  95. {*****************************************************************************
  96. Conversion from vector3
  97. *****************************************************************************}
  98. {$if (vecsize<>3) or (datatype<>single)}
  99. operator := (const v:Tvector3_single) result:objectname;
  100. begin
  101. result.data[0]:=v.data[0];
  102. result.data[1]:=v.data[1];
  103. {$if vecsize>=3}
  104. result.data[2]:=v.data[2];
  105. {$endif}
  106. {$if vecsize>=4}
  107. result.data[3]:=0;
  108. {$endif}
  109. end;
  110. {$endif}
  111. {$if (vecsize<>3) or (datatype<>double)}
  112. operator := (const v:Tvector3_double) result:objectname;
  113. begin
  114. result.data[0]:=v.data[0];
  115. result.data[1]:=v.data[1];
  116. {$if vecsize>=3}
  117. result.data[2]:=v.data[2];
  118. {$endif}
  119. {$if vecsize>=4}
  120. result.data[3]:=0;
  121. {$endif}
  122. end;
  123. {$endif}
  124. {$if (vecsize<>3) or (datatype<>extended)}
  125. operator := (const v:Tvector3_extended) result:objectname;
  126. begin
  127. result.data[0]:=v.data[0];
  128. result.data[1]:=v.data[1];
  129. {$if vecsize>=3}
  130. result.data[2]:=v.data[2];
  131. {$endif}
  132. {$if vecsize>=4}
  133. result.data[3]:=0;
  134. {$endif}
  135. end;
  136. {$endif}
  137. {*****************************************************************************
  138. Conversion from vector4
  139. *****************************************************************************}
  140. {$if (vecsize<>4) or (datatype<>single)}
  141. operator := (const v:Tvector4_single) result:objectname;
  142. begin
  143. result.data[0]:=v.data[0];
  144. result.data[1]:=v.data[1];
  145. {$if vecsize>=3}
  146. result.data[2]:=v.data[2];
  147. {$endif}
  148. {$if vecsize>=4}
  149. result.data[3]:=v.data[3];
  150. {$endif}
  151. end;
  152. {$endif}
  153. {$if (vecsize<>4) or (datatype<>double)}
  154. operator := (const v:Tvector4_double) result:objectname;
  155. begin
  156. result.data[0]:=v.data[0];
  157. result.data[1]:=v.data[1];
  158. {$if vecsize>=3}
  159. result.data[2]:=v.data[2];
  160. {$endif}
  161. {$if vecsize>=4}
  162. result.data[3]:=v.data[3];
  163. {$endif}
  164. end;
  165. {$endif}
  166. {$if (vecsize<>4) or (datatype<>extended)}
  167. operator := (const v:Tvector4_extended) result:objectname;
  168. begin
  169. result.data[0]:=v.data[0];
  170. result.data[1]:=v.data[1];
  171. {$if vecsize>=3}
  172. result.data[2]:=v.data[2];
  173. {$endif}
  174. {$if vecsize>=4}
  175. result.data[3]:=v.data[3];
  176. {$endif}
  177. end;
  178. {$endif}
  179. {*****************************************************************************
  180. Vector to vector operations
  181. *****************************************************************************}
  182. operator + (const x,y:objectname) result:objectname;
  183. {Adds the elements of both vectors together.}
  184. begin
  185. result.data[0]:=x.data[0]+y.data[0];
  186. result.data[1]:=x.data[1]+y.data[1];
  187. {$if vecsize>=3}
  188. result.data[2]:=x.data[2]+y.data[2];
  189. {$endif}
  190. {$if vecsize>=4}
  191. result.data[3]:=x.data[3]+y.data[3];
  192. {$endif}
  193. end;
  194. operator - (const x:objectname) result:objectname;
  195. {Negates the elements of a vector.}
  196. begin
  197. result.data[0]:=-x.data[0];
  198. result.data[1]:=-x.data[1];
  199. {$if vecsize>=3}
  200. result.data[2]:=-x.data[2];
  201. {$endif}
  202. {$if vecsize>=4}
  203. result.data[3]:=-x.data[3];
  204. {$endif}
  205. end;
  206. operator - (const x,y:objectname) result:objectname;
  207. {Subtracts the elements of both vectors together.}
  208. begin
  209. result.data[0]:=x.data[0]-y.data[0];
  210. result.data[1]:=x.data[1]-y.data[1];
  211. {$if vecsize>=3}
  212. result.data[2]:=x.data[2]-y.data[2];
  213. {$endif}
  214. {$if vecsize>=4}
  215. result.data[3]:=x.data[3]-y.data[3];
  216. {$endif}
  217. end;
  218. operator * (const x,y:objectname) result:objectname;
  219. {Multiplies the elements of two vectors.}
  220. begin
  221. result.data[0]:=x.data[0]*y.data[0];
  222. result.data[1]:=x.data[1]*y.data[1];
  223. {$if vecsize>=3}
  224. result.data[2]:=x.data[2]*y.data[2];
  225. {$endif}
  226. {$if vecsize>=4}
  227. result.data[3]:=x.data[3]*y.data[3];
  228. {$endif}
  229. end;
  230. operator / (const x,y:objectname) result:objectname;
  231. {Divides the elements of two vectors.
  232. In most cases, you will want to avoid this and multiply by the inverse.
  233. In case you need to preserve accuracy, dividing might be better though.}
  234. begin
  235. result.data[0]:=x.data[0]/y.data[0];
  236. result.data[1]:=x.data[1]/y.data[1];
  237. {$if vecsize>=3}
  238. result.data[2]:=x.data[2]/y.data[2];
  239. {$endif}
  240. {$if vecsize>=4}
  241. result.data[3]:=x.data[3]/y.data[3];
  242. {$endif}
  243. end;
  244. operator ** (const x,y:objectname) result:datatype;
  245. {Calculates the inproduct of two vectors.}
  246. begin
  247. result:=x.data[0]*y.data[0]
  248. +x.data[1]*y.data[1]
  249. {$if vecsize>=3}+x.data[2]*y.data[2]{$endif}
  250. {$if vecsize>=4}+x.data[3]*y.data[3]{$endif};
  251. end;
  252. {$if vecsize=3}
  253. operator >< (const x,y:objectname) result:objectname;
  254. {Calculates the exproduct of two vectors. The exproduct exists only for
  255. 3-dimensional vectors}
  256. begin
  257. result.data[0]:=x.data[1]*y.data[2]-x.data[2]*y.data[1];
  258. result.data[1]:=x.data[2]*y.data[0]-x.data[0]*y.data[2];
  259. result.data[2]:=x.data[0]*y.data[1]-x.data[1]*y.data[0];
  260. end;
  261. {$endif}
  262. {*****************************************************************************
  263. Vector/scalar operations
  264. *****************************************************************************}
  265. operator + (const x:objectname;y:datatype) result:objectname;
  266. {Adds a scalar to all vector elements.}
  267. begin
  268. result.data[0]:=x.data[0]+y;
  269. result.data[1]:=x.data[1]+y;
  270. {$if vecsize>=3}
  271. result.data[2]:=x.data[2]+y;
  272. {$endif}
  273. {$if vecsize>=4}
  274. result.data[3]:=x.data[3]+y;
  275. {$endif}
  276. end;
  277. operator - (const x:objectname;y:datatype) result:objectname;
  278. {Subtracts a scalar to all vector elements.}
  279. begin
  280. result.data[0]:=x.data[0]-y;
  281. result.data[1]:=x.data[1]-y;
  282. {$if vecsize>=3}
  283. result.data[2]:=x.data[2]-y;
  284. {$endif}
  285. {$if vecsize>=4}
  286. result.data[3]:=x.data[3]-y;
  287. {$endif}
  288. end;
  289. operator * (const x:objectname;y:datatype) result:objectname;
  290. {Multiplies all vector elements by a scalar.}
  291. begin
  292. result.data[0]:=x.data[0]*y;
  293. result.data[1]:=x.data[1]*y;
  294. {$if vecsize>=3}
  295. result.data[2]:=x.data[2]*y;
  296. {$endif}
  297. {$if vecsize>=4}
  298. result.data[3]:=x.data[3]*y;
  299. {$endif}
  300. end;
  301. operator / (const x:objectname;y:datatype) result:objectname;
  302. {Divides all vector elements by a scalar.}
  303. begin
  304. result.data[0]:=x.data[0]/y;
  305. result.data[1]:=x.data[1]/y;
  306. {$if vecsize>=3}
  307. result.data[2]:=x.data[2]/y;
  308. {$endif}
  309. {$if vecsize>=4}
  310. result.data[3]:=x.data[3]/y;
  311. {$endif}
  312. end;