mmatimp.inc 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903
  1. {*****************************************************************************
  2. Methods of the matrix object
  3. *****************************************************************************}
  4. constructor objectname.init_zero;
  5. begin
  6. fillchar(data,sizeof(data),0);
  7. end;
  8. constructor objectname.init_identity;
  9. begin
  10. fillchar(data,sizeof(data),0);
  11. data[0,0]:=1;
  12. data[1,1]:=1;
  13. {$if matsize>=3}
  14. data[2,2]:=1;
  15. {$endif}
  16. {$if matsize>=4}
  17. data[3,3]:=1;
  18. {$endif}
  19. end;
  20. constructor objectname.init(aa
  21. ,ab
  22. {$if matsize>=3},ac{$endif}
  23. {$if matsize>=4},ad{$endif}
  24. ,ba
  25. ,bb
  26. {$if matsize>=3},bc{$endif}
  27. {$if matsize>=4},bd{$endif}
  28. {$if matsize>=3}
  29. ,ca
  30. ,cb
  31. ,cc
  32. {$if matsize>=4},cd{$endif}
  33. {$endif}
  34. {$if matsize>=4}
  35. ,da
  36. ,db
  37. ,dc
  38. ,dd
  39. {$endif}:datatype);
  40. begin
  41. data[0,0]:=aa;
  42. data[0,1]:=ab;
  43. {$if matsize>=3}data[0,2]:=ac;{$endif}
  44. {$if matsize>=4}data[0,3]:=ad;{$endif}
  45. data[1,0]:=ba;
  46. data[1,1]:=bb;
  47. {$if matsize>=3}data[1,2]:=bc;{$endif}
  48. {$if matsize>=4}data[1,3]:=bd;{$endif}
  49. {$if matsize>=3}
  50. data[2,0]:=ca;
  51. data[2,1]:=cb;
  52. data[2,2]:=cc;
  53. {$if matsize>=4}data[2,3]:=cd;{$endif}
  54. {$endif}
  55. {$if matsize>=4}
  56. data[3,0]:=da;
  57. data[3,1]:=db;
  58. data[3,2]:=dc;
  59. data[3,3]:=dd;
  60. {$endif}
  61. end;
  62. function objectname.get_column(c:byte):vectorcompanion;
  63. begin
  64. get_column.data[0]:=data[0,c];
  65. get_column.data[1]:=data[1,c];
  66. {$if matsize>=3}
  67. get_column.data[2]:=data[2,c];
  68. {$endif}
  69. {$if matsize>=4}
  70. get_column.data[3]:=data[3,c];
  71. {$endif}
  72. end;
  73. function objectname.get_row(r:byte):vectorcompanion;
  74. begin
  75. get_row.data:=data[r];
  76. end;
  77. procedure objectname.set_column(c:byte;const v:vectorcompanion);
  78. begin
  79. data[0,c]:=v.data[0];
  80. data[1,c]:=v.data[1];
  81. {$if matsize>=3}
  82. data[2,c]:=v.data[2];
  83. {$endif}
  84. {$if matsize>=4}
  85. data[3,c]:=v.data[3];
  86. {$endif}
  87. end;
  88. procedure objectname.set_row(r:byte;const v:vectorcompanion);
  89. begin
  90. data[r]:=v.data;
  91. end;
  92. function objectname.transpose:objectname;
  93. begin
  94. transpose.data[0,0]:=data[0,0];
  95. transpose.data[0,1]:=data[1,0];
  96. {$if matsize>=3}
  97. transpose.data[0,2]:=data[2,0];
  98. {$endif}
  99. {$if matsize>=4}
  100. transpose.data[0,3]:=data[3,0];
  101. {$endif}
  102. transpose.data[1,0]:=data[0,1];
  103. transpose.data[1,1]:=data[1,1];
  104. {$if matsize>=3}
  105. transpose.data[1,2]:=data[2,1];
  106. {$endif}
  107. {$if matsize>=4}
  108. transpose.data[1,3]:=data[3,1];
  109. {$endif}
  110. {$if matsize>=3}
  111. transpose.data[2,0]:=data[0,2];
  112. transpose.data[2,1]:=data[1,2];
  113. transpose.data[2,2]:=data[2,2];
  114. {$endif}
  115. {$if matsize>=4}
  116. transpose.data[2,3]:=data[3,2];
  117. transpose.data[3,0]:=data[0,3];
  118. transpose.data[3,1]:=data[1,3];
  119. transpose.data[3,2]:=data[2,3];
  120. transpose.data[3,3]:=data[3,3];
  121. {$endif}
  122. end;
  123. {$if matsize=2}
  124. function objectname.determinant:datatype;
  125. begin
  126. determinant:=data[0,0]*data[1,1]-data[0,1]*data[1,0];
  127. end;
  128. {$endif}
  129. {$if matsize=3}
  130. function objectname.determinant:datatype;
  131. begin
  132. determinant:=data[0,0]*(data[1,1]*data[2,2]-data[1,2]*data[2,1])-
  133. data[0,1]*(data[1,0]*data[2,2]-data[1,2]*data[2,0])+
  134. data[0,2]*(data[1,0]*data[2,1]-data[1,1]*data[2,0]);
  135. end;
  136. {$endif}
  137. {$if matsize=4}
  138. function objectname.determinant:datatype;
  139. begin
  140. determinant:=(data[0,0]*data[1,1]-data[0,1]*data[1,0])*(data[2,2]*data[3,3]-data[2,3]*data[3,2])-
  141. (data[0,0]*data[1,2]-data[0,2]*data[1,0])*(data[2,1]*data[3,3]-data[2,3]*data[3,1])+
  142. (data[0,0]*data[1,3]-data[0,3]*data[1,0])*(data[2,1]*data[3,2]-data[2,2]*data[3,1])+
  143. (data[0,1]*data[1,2]-data[0,2]*data[1,1])*(data[2,0]*data[3,3]-data[2,3]*data[3,0])-
  144. (data[0,1]*data[1,3]-data[0,3]*data[1,1])*(data[2,0]*data[3,2]-data[2,2]*data[3,0])+
  145. (data[0,2]*data[1,3]-data[0,3]*data[1,2])*(data[2,0]*data[3,1]-data[2,1]*data[3,0]);
  146. end;
  147. {$endif}
  148. {$if matsize=2}
  149. function objectname.inverse(Adeterminant:datatype):objectname;
  150. begin
  151. Adeterminant:=1/Adeterminant;
  152. inverse.data[0,0]:=data[1,1]*Adeterminant;
  153. inverse.data[0,1]:=-data[0,1]*Adeterminant;
  154. inverse.data[1,0]:=-data[1,0]*Adeterminant;
  155. inverse.data[1,1]:=data[0,0]*Adeterminant;
  156. end;
  157. {$endif}
  158. {$if matsize=3}
  159. function objectname.inverse(Adeterminant:datatype):objectname;
  160. begin
  161. Adeterminant:=1/Adeterminant;
  162. inverse.data[0,0]:=(data[1,1]*data[2,2]-data[2,1]*data[1,2])*Adeterminant;
  163. inverse.data[0,1]:=-(data[1,0]*data[2,2]-data[2,0]*data[1,2])*Adeterminant;
  164. inverse.data[0,2]:=(data[1,0]*data[2,1]-data[2,0]*data[1,1])*Adeterminant;
  165. inverse.data[1,0]:=-(data[0,1]*data[2,2]-data[2,1]*data[0,2])*Adeterminant;
  166. inverse.data[1,1]:=(data[0,0]*data[2,2]-data[2,0]*data[0,2])*Adeterminant;
  167. inverse.data[1,2]:=-(data[0,0]*data[2,1]-data[2,0]*data[0,1])*Adeterminant;
  168. inverse.data[2,0]:=(data[0,1]*data[1,2]-data[1,1]*data[0,2])*Adeterminant;
  169. inverse.data[2,1]:=-(data[0,0]*data[1,2]-data[1,0]*data[0,2])*Adeterminant;
  170. inverse.data[2,2]:=(data[0,0]*data[1,1]-data[1,0]*data[0,1])*Adeterminant;
  171. end;
  172. {$endif}
  173. {$if matsize=4}
  174. function objectname.inverse(Adeterminant:datatype):objectname;
  175. begin
  176. Adeterminant:=1/Adeterminant;
  177. inverse.data[0,0]:=Adeterminant*(data[1,1]*(data[2,2]*data[3,3]-data[2,3]*data[3,2])+
  178. data[1,2]*(data[2,3]*data[3,1]-data[2,1]*data[3,3])+
  179. data[1,3]*(data[2,1]*data[3,2]-data[2,2]*data[3,1]));
  180. inverse.data[0,1]:=Adeterminant*(data[2,1]*(data[0,2]*data[3,3]-data[0,3]*data[3,2])+
  181. data[2,2]*(data[0,3]*data[3,1]-data[0,1]*data[3,3])+
  182. data[2,3]*(data[0,1]*data[3,2]-data[0,2]*data[3,1]));
  183. inverse.data[0,2]:=Adeterminant*(data[3,1]*(data[0,2]*data[1,3]-data[0,3]*data[1,2])+
  184. data[3,2]*(data[0,3]*data[1,1]-data[0,1]*data[1,3])+
  185. data[3,3]*(data[0,1]*data[1,2]-data[0,2]*data[1,1]));
  186. inverse.data[0,3]:=Adeterminant*(data[0,1]*(data[1,3]*data[2,2]-data[1,2]*data[2,3])+
  187. data[0,2]*(data[1,1]*data[2,3]-data[1,3]*data[2,1])+
  188. data[0,3]*(data[1,2]*data[2,1]-data[1,1]*data[2,2]));
  189. inverse.data[1,0]:=Adeterminant*(data[1,2]*(data[2,0]*data[3,3]-data[2,3]*data[3,0])+
  190. data[1,3]*(data[2,2]*data[3,0]-data[2,0]*data[3,2])+
  191. data[1,0]*(data[2,3]*data[3,2]-data[2,2]*data[3,3]));
  192. inverse.data[1,1]:=Adeterminant*(data[2,2]*(data[0,0]*data[3,3]-data[0,3]*data[3,0])+
  193. data[2,3]*(data[0,2]*data[3,0]-data[0,0]*data[3,2])+
  194. data[2,0]*(data[0,3]*data[3,2]-data[0,2]*data[3,3]));
  195. inverse.data[1,2]:=Adeterminant*(data[3,2]*(data[0,0]*data[1,3]-data[0,3]*data[1,0])+
  196. data[3,3]*(data[0,2]*data[1,0]-data[0,0]*data[1,2])+
  197. data[3,0]*(data[0,3]*data[1,2]-data[0,2]*data[1,3]));
  198. inverse.data[1,3]:=Adeterminant*(data[0,2]*(data[1,3]*data[2,0]-data[1,0]*data[2,3])+
  199. data[0,3]*(data[1,0]*data[2,2]-data[1,2]*data[2,0])+
  200. data[0,0]*(data[1,2]*data[2,3]-data[1,3]*data[2,2]));
  201. inverse.data[2,0]:=Adeterminant*(data[1,3]*(data[2,0]*data[3,1]-data[2,1]*data[3,0])+
  202. data[1,0]*(data[2,1]*data[3,3]-data[2,3]*data[3,1])+
  203. data[1,1]*(data[2,3]*data[3,0]-data[2,0]*data[3,3]));
  204. inverse.data[2,1]:=Adeterminant*(data[2,3]*(data[0,0]*data[3,1]-data[0,1]*data[3,0])+
  205. data[2,0]*(data[0,1]*data[3,3]-data[0,3]*data[3,1])+
  206. data[2,1]*(data[0,3]*data[3,0]-data[0,0]*data[3,3]));
  207. inverse.data[2,2]:=Adeterminant*(data[3,3]*(data[0,0]*data[1,1]-data[0,1]*data[1,0])+
  208. data[3,0]*(data[0,1]*data[1,3]-data[0,3]*data[1,1])+
  209. data[3,1]*(data[0,3]*data[1,0]-data[0,0]*data[1,3]));
  210. inverse.data[2,3]:=Adeterminant*(data[0,3]*(data[1,1]*data[2,0]-data[1,0]*data[2,1])+
  211. data[0,0]*(data[1,3]*data[2,1]-data[1,1]*data[2,3])+
  212. data[0,1]*(data[1,0]*data[2,3]-data[1,3]*data[2,0]));
  213. inverse.data[3,0]:=Adeterminant*(data[1,0]*(data[2,2]*data[3,1]-data[2,1]*data[3,2])+
  214. data[1,1]*(data[2,0]*data[3,2]-data[2,2]*data[3,0])+
  215. data[1,2]*(data[2,1]*data[3,0]-data[2,0]*data[3,1]));
  216. inverse.data[3,1]:=Adeterminant*(data[2,0]*(data[0,2]*data[3,1]-data[0,1]*data[3,2])+
  217. data[2,1]*(data[0,0]*data[3,2]-data[0,2]*data[3,0])+
  218. data[2,2]*(data[0,1]*data[3,0]-data[0,0]*data[3,1]));
  219. inverse.data[3,2]:=Adeterminant*(data[3,0]*(data[0,2]*data[1,1]-data[0,1]*data[1,2])+
  220. data[3,1]*(data[0,0]*data[1,2]-data[0,2]*data[1,0])+
  221. data[3,2]*(data[0,1]*data[1,0]-data[0,0]*data[1,1]));
  222. inverse.data[3,3]:=Adeterminant*(data[0,0]*(data[1,1]*data[2,2]-data[1,2]*data[2,1])+
  223. data[0,1]*(data[1,2]*data[2,0]-data[1,0]*data[2,2])+
  224. data[0,2]*(data[1,0]*data[2,1]-data[1,1]*data[2,0]));
  225. end;
  226. {$endif}
  227. {*****************************************************************************
  228. Conversion from matrix2
  229. *****************************************************************************}
  230. {$if (matsize<>2) or (datatype<>single)}
  231. operator := (const v:Tmatrix2_single) result:objectname;
  232. begin
  233. result.data[0,0]:=v.data[0,0];
  234. result.data[0,1]:=v.data[0,1];
  235. {$if matsize>=3}
  236. result.data[0,2]:=0;
  237. {$endif}
  238. {$if matsize>=4}
  239. result.data[0,3]:=0;
  240. {$endif}
  241. result.data[1,0]:=v.data[1,0];
  242. result.data[1,1]:=v.data[1,1];
  243. {$if matsize>=3}
  244. result.data[1,2]:=0;
  245. {$endif}
  246. {$if matsize>=4}
  247. result.data[1,3]:=0;
  248. {$endif}
  249. {$if matsize>=3}
  250. result.data[2,0]:=0;
  251. result.data[2,1]:=0;
  252. result.data[2,2]:=0;
  253. {$endif}
  254. {$if matsize>=4}
  255. result.data[2,3]:=0;
  256. result.data[3,0]:=0;
  257. result.data[3,1]:=0;
  258. result.data[3,2]:=0;
  259. result.data[3,3]:=0;
  260. {$endif}
  261. end;
  262. {$endif}
  263. {$if (matsize<>2) or (datatype<>double)}
  264. operator := (const v:Tmatrix2_double) result:objectname;
  265. begin
  266. result.data[0,0]:=v.data[0,0];
  267. result.data[0,1]:=v.data[0,1];
  268. {$if matsize>=3}
  269. result.data[0,2]:=0;
  270. {$endif}
  271. {$if matsize>=4}
  272. result.data[0,3]:=0;
  273. {$endif}
  274. result.data[1,0]:=v.data[1,0];
  275. result.data[1,1]:=v.data[1,1];
  276. {$if matsize>=3}
  277. result.data[1,2]:=0;
  278. {$endif}
  279. {$if matsize>=4}
  280. result.data[1,3]:=0;
  281. {$endif}
  282. {$if matsize>=3}
  283. result.data[2,0]:=0;
  284. result.data[2,1]:=0;
  285. result.data[2,2]:=0;
  286. {$endif}
  287. {$if matsize>=4}
  288. result.data[2,3]:=0;
  289. result.data[3,0]:=0;
  290. result.data[3,1]:=0;
  291. result.data[3,2]:=0;
  292. result.data[3,3]:=0;
  293. {$endif}
  294. end;
  295. {$endif}
  296. {$if (matsize<>2) or (datatype<>extended)}
  297. operator := (const v:Tmatrix2_extended) result:objectname;
  298. begin
  299. result.data[0,0]:=v.data[0,0];
  300. result.data[0,1]:=v.data[0,1];
  301. {$if matsize>=3}
  302. result.data[0,2]:=0;
  303. {$endif}
  304. {$if matsize>=4}
  305. result.data[0,3]:=0;
  306. {$endif}
  307. result.data[1,0]:=v.data[1,0];
  308. result.data[1,1]:=v.data[1,1];
  309. {$if matsize>=3}
  310. result.data[1,2]:=0;
  311. {$endif}
  312. {$if matsize>=4}
  313. result.data[1,3]:=0;
  314. {$endif}
  315. {$if matsize>=3}
  316. result.data[2,0]:=0;
  317. result.data[2,1]:=0;
  318. result.data[2,2]:=0;
  319. {$endif}
  320. {$if matsize>=4}
  321. result.data[2,3]:=0;
  322. result.data[3,0]:=0;
  323. result.data[3,1]:=0;
  324. result.data[3,2]:=0;
  325. result.data[3,3]:=0;
  326. {$endif}
  327. end;
  328. {$endif}
  329. {*****************************************************************************
  330. Conversion from matrix3
  331. *****************************************************************************}
  332. {$if (matsize<>3) or (datatype<>single)}
  333. operator := (const v:Tmatrix3_single) result:objectname;
  334. begin
  335. result.data[0,0]:=v.data[0,0];
  336. result.data[0,1]:=v.data[0,1];
  337. {$if matsize>=3}
  338. result.data[0,2]:=v.data[0,2];
  339. {$endif}
  340. {$if matsize>=4}
  341. result.data[0,3]:=0;
  342. {$endif}
  343. result.data[1,0]:=v.data[1,0];
  344. result.data[1,1]:=v.data[1,1];
  345. {$if matsize>=3}
  346. result.data[1,2]:=v.data[1,2];
  347. {$endif}
  348. {$if matsize>=4}
  349. result.data[1,3]:=0;
  350. {$endif}
  351. {$if matsize>=3}
  352. result.data[2,0]:=v.data[2,0];
  353. result.data[2,1]:=v.data[2,1];
  354. result.data[2,2]:=v.data[2,2];
  355. {$endif}
  356. {$if matsize>=4}
  357. result.data[2,3]:=0;
  358. result.data[3,0]:=0;
  359. result.data[3,1]:=0;
  360. result.data[3,2]:=0;
  361. result.data[3,3]:=0;
  362. {$endif}
  363. end;
  364. {$endif}
  365. {$if (matsize<>3) or (datatype<>double)}
  366. operator := (const v:Tmatrix3_double) result:objectname;
  367. begin
  368. result.data[0,0]:=v.data[0,0];
  369. result.data[0,1]:=v.data[0,1];
  370. {$if matsize>=3}
  371. result.data[0,2]:=v.data[0,2];
  372. {$endif}
  373. {$if matsize>=4}
  374. result.data[0,3]:=0;
  375. {$endif}
  376. result.data[1,0]:=v.data[1,0];
  377. result.data[1,1]:=v.data[1,1];
  378. {$if matsize>=3}
  379. result.data[1,2]:=v.data[1,2];
  380. {$endif}
  381. {$if matsize>=4}
  382. result.data[1,3]:=0;
  383. {$endif}
  384. {$if matsize>=3}
  385. result.data[2,0]:=v.data[2,0];
  386. result.data[2,1]:=v.data[2,1];
  387. result.data[2,2]:=v.data[2,2];
  388. {$endif}
  389. {$if matsize>=4}
  390. result.data[2,3]:=0;
  391. result.data[3,0]:=0;
  392. result.data[3,1]:=0;
  393. result.data[3,2]:=0;
  394. result.data[3,3]:=0;
  395. {$endif}
  396. end;
  397. {$endif}
  398. {$if (matsize<>3) or (datatype<>extended)}
  399. operator := (const v:Tmatrix3_extended) result:objectname;
  400. begin
  401. result.data[0,0]:=v.data[0,0];
  402. result.data[0,1]:=v.data[0,1];
  403. {$if matsize>=3}
  404. result.data[0,2]:=v.data[0,2];
  405. {$endif}
  406. {$if matsize>=4}
  407. result.data[0,3]:=0;
  408. {$endif}
  409. result.data[1,0]:=v.data[1,0];
  410. result.data[1,1]:=v.data[1,1];
  411. {$if matsize>=3}
  412. result.data[1,2]:=v.data[1,2];
  413. {$endif}
  414. {$if matsize>=4}
  415. result.data[1,3]:=0;
  416. {$endif}
  417. {$if matsize>=3}
  418. result.data[2,0]:=v.data[2,0];
  419. result.data[2,1]:=v.data[2,1];
  420. result.data[2,2]:=v.data[2,2];
  421. {$endif}
  422. {$if matsize>=4}
  423. result.data[2,3]:=0;
  424. result.data[3,0]:=0;
  425. result.data[3,1]:=0;
  426. result.data[3,2]:=0;
  427. result.data[3,3]:=0;
  428. {$endif}
  429. end;
  430. {$endif}
  431. {*****************************************************************************
  432. Conversion from matrix4
  433. *****************************************************************************}
  434. {$if (matsize<>4) or (datatype<>single)}
  435. operator := (const v:Tmatrix4_single) result:objectname;
  436. begin
  437. result.data[0,0]:=v.data[0,0];
  438. result.data[0,1]:=v.data[0,1];
  439. {$if matsize>=3}
  440. result.data[0,2]:=v.data[0,2];
  441. {$endif}
  442. {$if matsize>=4}
  443. result.data[0,3]:=v.data[0,3];
  444. {$endif}
  445. result.data[1,0]:=v.data[1,0];
  446. result.data[1,1]:=v.data[1,1];
  447. {$if matsize>=3}
  448. result.data[1,2]:=v.data[1,2];
  449. {$endif}
  450. {$if matsize>=4}
  451. result.data[1,3]:=v.data[1,3];
  452. {$endif}
  453. {$if matsize>=3}
  454. result.data[2,0]:=v.data[2,0];
  455. result.data[2,1]:=v.data[2,1];
  456. result.data[2,2]:=v.data[2,2];
  457. {$endif}
  458. {$if matsize>=4}
  459. result.data[2,3]:=v.data[2,3];
  460. result.data[3,0]:=v.data[3,0];
  461. result.data[3,1]:=v.data[3,1];
  462. result.data[3,2]:=v.data[3,2];
  463. result.data[3,3]:=v.data[3,3];
  464. {$endif}
  465. end;
  466. {$endif}
  467. {$if (matsize<>4) or (datatype<>double)}
  468. operator := (const v:Tmatrix4_double) result:objectname;
  469. begin
  470. result.data[0,0]:=v.data[0,0];
  471. result.data[0,1]:=v.data[0,1];
  472. {$if matsize>=3}
  473. result.data[0,2]:=v.data[0,2];
  474. {$endif}
  475. {$if matsize>=4}
  476. result.data[0,3]:=v.data[0,3];
  477. {$endif}
  478. result.data[1,0]:=v.data[1,0];
  479. result.data[1,1]:=v.data[1,1];
  480. {$if matsize>=3}
  481. result.data[1,2]:=v.data[1,2];
  482. {$endif}
  483. {$if matsize>=4}
  484. result.data[1,3]:=v.data[1,3];
  485. {$endif}
  486. {$if matsize>=3}
  487. result.data[2,0]:=v.data[2,0];
  488. result.data[2,1]:=v.data[2,1];
  489. result.data[2,2]:=v.data[2,2];
  490. {$endif}
  491. {$if matsize>=4}
  492. result.data[2,3]:=v.data[2,3];
  493. result.data[3,0]:=v.data[3,0];
  494. result.data[3,1]:=v.data[3,1];
  495. result.data[3,2]:=v.data[3,2];
  496. result.data[3,3]:=v.data[3,3];
  497. {$endif}
  498. end;
  499. {$endif}
  500. {$if (matsize<>4) or (datatype<>extended)}
  501. operator := (const v:Tmatrix4_extended) result:objectname;
  502. begin
  503. result.data[0,0]:=v.data[0,0];
  504. result.data[0,1]:=v.data[0,1];
  505. {$if matsize>=3}
  506. result.data[0,2]:=v.data[0,2];
  507. {$endif}
  508. {$if matsize>=4}
  509. result.data[0,3]:=v.data[0,3];
  510. {$endif}
  511. result.data[1,0]:=v.data[1,0];
  512. result.data[1,1]:=v.data[1,1];
  513. {$if matsize>=3}
  514. result.data[1,2]:=v.data[1,2];
  515. {$endif}
  516. {$if matsize>=4}
  517. result.data[1,3]:=v.data[1,3];
  518. {$endif}
  519. {$if matsize>=3}
  520. result.data[2,0]:=v.data[2,0];
  521. result.data[2,1]:=v.data[2,1];
  522. result.data[2,2]:=v.data[2,2];
  523. {$endif}
  524. {$if matsize>=4}
  525. result.data[2,3]:=v.data[2,3];
  526. result.data[3,0]:=v.data[3,0];
  527. result.data[3,1]:=v.data[3,1];
  528. result.data[3,2]:=v.data[3,2];
  529. result.data[3,3]:=v.data[3,3];
  530. {$endif}
  531. end;
  532. {$endif}
  533. {*****************************************************************************
  534. Matrix to matrix operations
  535. *****************************************************************************}
  536. operator + (const m1,m2:objectname) result:objectname;
  537. {Add the elements of a matrix to each other.}
  538. begin
  539. result.data[0,0]:=m1.data[0,0]+m2.data[0,0];
  540. result.data[0,1]:=m1.data[0,1]+m2.data[0,1];
  541. {$if matsize>=3}
  542. result.data[0,2]:=m1.data[0,2]+m2.data[0,2];
  543. {$endif}
  544. {$if matsize>=4}
  545. result.data[0,3]:=m1.data[0,3]+m2.data[0,3];
  546. {$endif}
  547. result.data[1,0]:=m1.data[1,0]+m2.data[1,0];
  548. result.data[1,1]:=m1.data[1,1]+m2.data[1,1];
  549. {$if matsize>=3}
  550. result.data[1,2]:=m1.data[1,2]+m2.data[1,2];
  551. {$endif}
  552. {$if matsize>=4}
  553. result.data[1,3]:=m1.data[1,3]+m2.data[1,3];
  554. {$endif}
  555. {$if matsize>=3}
  556. result.data[2,0]:=m1.data[2,0]+m2.data[2,0];
  557. result.data[2,1]:=m1.data[2,1]+m2.data[2,1];
  558. result.data[2,2]:=m1.data[2,2]+m2.data[2,2];
  559. {$endif}
  560. {$if matsize>=4}
  561. result.data[2,3]:=m1.data[2,3]+m2.data[2,3];
  562. result.data[3,0]:=m1.data[3,0]+m2.data[3,0];
  563. result.data[3,1]:=m1.data[3,1]+m2.data[3,1];
  564. result.data[3,2]:=m1.data[3,2]+m2.data[3,2];
  565. result.data[3,3]:=m1.data[3,3]+m2.data[3,3];
  566. {$endif}
  567. end;
  568. operator - (const m1,m2:objectname) result:objectname;
  569. {Subtract the elements of two matrixes from each other.}
  570. begin
  571. result.data[0,0]:=m1.data[0,0]-m2.data[0,0];
  572. result.data[0,1]:=m1.data[0,1]-m2.data[0,1];
  573. {$if matsize>=3}
  574. result.data[0,2]:=m1.data[0,2]-m2.data[0,2];
  575. {$endif}
  576. {$if matsize>=4}
  577. result.data[0,3]:=m1.data[0,3]-m2.data[0,3];
  578. {$endif}
  579. result.data[1,0]:=m1.data[1,0]-m2.data[1,0];
  580. result.data[1,1]:=m1.data[1,1]-m2.data[1,1];
  581. {$if matsize>=3}
  582. result.data[1,2]:=m1.data[1,2]-m2.data[1,2];
  583. {$endif}
  584. {$if matsize>=4}
  585. result.data[1,3]:=m1.data[1,3]-m2.data[1,3];
  586. {$endif}
  587. {$if matsize>=3}
  588. result.data[2,0]:=m1.data[2,0]-m2.data[2,0];
  589. result.data[2,1]:=m1.data[2,1]-m2.data[2,1];
  590. result.data[2,2]:=m1.data[2,2]-m2.data[2,2];
  591. {$endif}
  592. {$if matsize>=4}
  593. result.data[2,3]:=m1.data[2,3]-m2.data[2,3];
  594. result.data[3,0]:=m1.data[3,0]-m2.data[3,0];
  595. result.data[3,1]:=m1.data[3,1]-m2.data[3,1];
  596. result.data[3,2]:=m1.data[3,2]-m2.data[3,2];
  597. result.data[3,3]:=m1.data[3,3]-m2.data[3,3];
  598. {$endif}
  599. end;
  600. operator - (const m1:objectname) result:objectname;
  601. {Negate the elements of a matrix.}
  602. begin
  603. result.data[0,0]:=-m1.data[0,0];
  604. result.data[0,1]:=-m1.data[0,1];
  605. {$if matsize>=3}
  606. result.data[0,2]:=-m1.data[0,2];
  607. {$endif}
  608. {$if matsize>=4}
  609. result.data[0,3]:=-m1.data[0,3];
  610. {$endif}
  611. result.data[1,0]:=-m1.data[1,0];
  612. result.data[1,1]:=-m1.data[1,1];
  613. {$if matsize>=3}
  614. result.data[1,2]:=-m1.data[1,2];
  615. {$endif}
  616. {$if matsize>=4}
  617. result.data[1,3]:=-m1.data[1,3];
  618. {$endif}
  619. {$if matsize>=3}
  620. result.data[2,0]:=-m1.data[2,0];
  621. result.data[2,1]:=-m1.data[2,1];
  622. result.data[2,2]:=-m1.data[2,2];
  623. {$endif}
  624. {$if matsize>=4}
  625. result.data[2,3]:=-m1.data[2,3];
  626. result.data[3,0]:=-m1.data[3,0];
  627. result.data[3,1]:=-m1.data[3,1];
  628. result.data[3,2]:=-m1.data[3,2];
  629. result.data[3,3]:=-m1.data[3,3];
  630. {$endif}
  631. end;
  632. operator * (const m1,m2:objectname) result:objectname;
  633. {Multiply two matrixes.}
  634. var r:array[0..matsize-1] of datatype;
  635. i:byte;
  636. begin
  637. for i:=0 to matsize-1 do
  638. begin
  639. r:=m1.data[i];
  640. result.data[i,0]:=r[0]*m2.data[0,0]
  641. +r[1]*m2.data[1,0]
  642. {$if matsize>=3}+r[2]*m2.data[2,0]{$endif}
  643. {$if matsize>=4}+r[3]*m2.data[3,0]{$endif};
  644. result.data[i,1]:=r[0]*m2.data[0,1]
  645. +r[1]*m2.data[1,1]
  646. {$if matsize>=3}+r[2]*m2.data[2,1]{$endif}
  647. {$if matsize>=4}+r[3]*m2.data[3,1]{$endif};
  648. {$if matsize>=3}
  649. result.data[i,2]:=r[0]*m2.data[0,2]
  650. +r[1]*m2.data[1,2]
  651. +r[2]*m2.data[2,2]
  652. {$if matsize>=4}+r[3]*m2.data[3,2]{$endif};
  653. {$endif}
  654. {$if matsize>=4}
  655. result.data[i,3]:=r[0]*m2.data[0,3]
  656. +r[1]*m2.data[1,3]
  657. +r[2]*m2.data[2,3]
  658. +r[3]*m2.data[3,3];
  659. {$endif}
  660. end;
  661. end;
  662. {*****************************************************************************
  663. Vector/matrix operations
  664. *****************************************************************************}
  665. operator * (const m:objectname;const v:vectorcompanion) result:vectorcompanion;
  666. {Multiplies a matrix with a vector.}
  667. begin
  668. result.data[0]:=m.data[0,0]*v.data[0]
  669. +m.data[0,1]*v.data[1]
  670. {$if matsize>=3}+m.data[0,2]*v.data[2]{$endif}
  671. {$if matsize>=4}+m.data[0,3]*v.data[3]{$endif};
  672. result.data[1]:=m.data[1,0]*v.data[0]
  673. +m.data[1,1]*v.data[1]
  674. {$if matsize>=3}+m.data[1,2]*v.data[2]{$endif}
  675. {$if matsize>=4}+m.data[1,3]*v.data[3]{$endif};
  676. {$if matsize>=3}
  677. result.data[2]:=m.data[2,0]*v.data[0]
  678. +m.data[2,1]*v.data[1]
  679. +m.data[2,2]*v.data[2]
  680. {$if matsize>=4}+m.data[2,3]*v.data[3]{$endif};
  681. {$endif}
  682. {$if matsize>=4}
  683. result.data[3]:=m.data[3,0]*v.data[0]
  684. +m.data[3,1]*v.data[1]
  685. +m.data[3,2]*v.data[2]
  686. +m.data[3,3]*v.data[3];
  687. {$endif}
  688. end;
  689. {*****************************************************************************
  690. Matrix/scalar operations
  691. *****************************************************************************}
  692. operator + (const m:objectname;const x:datatype) result:objectname;
  693. {Adds to the elements of a matrix.}
  694. begin
  695. result.data[0,0]:=m.data[0,0]+x;
  696. result.data[0,1]:=m.data[0,1]+x;
  697. {$if matsize>=3}
  698. result.data[0,2]:=m.data[0,2]+x;
  699. {$endif}
  700. {$if matsize>=4}
  701. result.data[0,3]:=m.data[0,3]+x;
  702. {$endif}
  703. result.data[1,0]:=m.data[1,0]+x;
  704. result.data[1,1]:=m.data[1,1]+x;
  705. {$if matsize>=3}
  706. result.data[1,2]:=m.data[1,2]+x;
  707. {$endif}
  708. {$if matsize>=4}
  709. result.data[1,3]:=m.data[1,3]+x;
  710. {$endif}
  711. {$if matsize>=3}
  712. result.data[2,0]:=m.data[2,0]+x;
  713. result.data[2,1]:=m.data[2,1]+x;
  714. result.data[2,2]:=m.data[2,2]+x;
  715. {$endif}
  716. {$if matsize>=4}
  717. result.data[2,3]:=m.data[2,3]+x;
  718. result.data[3,0]:=m.data[3,0]+x;
  719. result.data[3,1]:=m.data[3,1]+x;
  720. result.data[3,2]:=m.data[3,2]+x;
  721. result.data[3,3]:=m.data[3,3]+x;
  722. {$endif}
  723. end;
  724. operator - (const m:objectname;const x:datatype) result:objectname;
  725. {Subtracts from the elements of a matrix.}
  726. begin
  727. result.data[0,0]:=m.data[0,0]-x;
  728. result.data[0,1]:=m.data[0,1]-x;
  729. {$if matsize>=3}
  730. result.data[0,2]:=m.data[0,2]-x;
  731. {$endif}
  732. {$if matsize>=4}
  733. result.data[0,3]:=m.data[0,3]-x;
  734. {$endif}
  735. result.data[1,0]:=m.data[1,0]-x;
  736. result.data[1,1]:=m.data[1,1]-x;
  737. {$if matsize>=3}
  738. result.data[1,2]:=m.data[1,2]-x;
  739. {$endif}
  740. {$if matsize>=4}
  741. result.data[1,3]:=m.data[1,3]-x;
  742. {$endif}
  743. {$if matsize>=3}
  744. result.data[2,0]:=m.data[2,0]-x;
  745. result.data[2,1]:=m.data[2,1]-x;
  746. result.data[2,2]:=m.data[2,2]-x;
  747. {$endif}
  748. {$if matsize>=4}
  749. result.data[2,3]:=m.data[2,3]-x;
  750. result.data[3,0]:=m.data[3,0]-x;
  751. result.data[3,1]:=m.data[3,1]-x;
  752. result.data[3,2]:=m.data[3,2]-x;
  753. result.data[3,3]:=m.data[3,3]-x;
  754. {$endif}
  755. end;
  756. operator * (const m:objectname;const x:datatype) result:objectname;
  757. {Multiplies the elements of a matrix.}
  758. begin
  759. result.data[0,0]:=m.data[0,0]*x;
  760. result.data[0,1]:=m.data[0,1]*x;
  761. {$if matsize>=3}
  762. result.data[0,2]:=m.data[0,2]*x;
  763. {$endif}
  764. {$if matsize>=4}
  765. result.data[0,3]:=m.data[0,3]*x;
  766. {$endif}
  767. result.data[1,0]:=m.data[1,0]*x;
  768. result.data[1,1]:=m.data[1,1]*x;
  769. {$if matsize>=3}
  770. result.data[1,2]:=m.data[1,2]*x;
  771. {$endif}
  772. {$if matsize>=4}
  773. result.data[1,3]:=m.data[1,3]*x;
  774. {$endif}
  775. {$if matsize>=3}
  776. result.data[2,0]:=m.data[2,0]*x;
  777. result.data[2,1]:=m.data[2,1]*x;
  778. result.data[2,2]:=m.data[2,2]*x;
  779. {$endif}
  780. {$if matsize>=4}
  781. result.data[2,3]:=m.data[2,3]*x;
  782. result.data[3,0]:=m.data[3,0]*x;
  783. result.data[3,1]:=m.data[3,1]*x;
  784. result.data[3,2]:=m.data[3,2]*x;
  785. result.data[3,3]:=m.data[3,3]*x;
  786. {$endif}
  787. end;
  788. operator / (const m:objectname;const x:datatype) result:objectname;
  789. {Divides the elements of a matrix.
  790. In most cases, you will want to avoid this and multiply by the inverse.
  791. In case you need to preserve accuracy, dividing might be better though.}
  792. begin
  793. result.data[0,0]:=m.data[0,0]/x;
  794. result.data[0,1]:=m.data[0,1]/x;
  795. {$if matsize>=3}
  796. result.data[0,2]:=m.data[0,2]/x;
  797. {$endif}
  798. {$if matsize>=4}
  799. result.data[0,3]:=m.data[0,3]/x;
  800. {$endif}
  801. result.data[1,0]:=m.data[1,0]/x;
  802. result.data[1,1]:=m.data[1,1]/x;
  803. {$if matsize>=3}
  804. result.data[1,2]:=m.data[1,2]/x;
  805. {$endif}
  806. {$if matsize>=4}
  807. result.data[1,3]:=m.data[1,3]/x;
  808. {$endif}
  809. {$if matsize>=3}
  810. result.data[2,0]:=m.data[2,0]/x;
  811. result.data[2,1]:=m.data[2,1]/x;
  812. result.data[2,2]:=m.data[2,2]/x;
  813. {$endif}
  814. {$if matsize>=4}
  815. result.data[2,3]:=m.data[2,3]/x;
  816. result.data[3,0]:=m.data[3,0]/x;
  817. result.data[3,1]:=m.data[3,1]/x;
  818. result.data[3,2]:=m.data[3,2]/x;
  819. result.data[3,3]:=m.data[3,3]/x;
  820. {$endif}
  821. end;